【C++】this 指针和对象数组详解

举报
王博Kings 发表于 2020/12/30 00:10:31 2020/12/30
3k+ 0 0
【摘要】 目录 1. 涉及到两个对象时,需要使用this指针 2. 如何将两个要比较的对象提供给成员函数呢? 3. 回顾const 成员函数  4. const Stock & topval ( const Stock & s ) const 解读 5. topval如何实现? 6. this是返回对象的地址,*this是对象 程序实现 stock20.h usest...

目录

1. 涉及到两个对象时,需要使用this指针

2. 如何将两个要比较的对象提供给成员函数呢?

3. 回顾const 成员函数

 4. const Stock & topval ( const Stock & s ) const 解读

5. topval如何实现?

6. this是返回对象的地址,*this是对象

程序实现

stock20.h

usestock2.cpp

运行结果:

 值得注意的是


1. 涉及到两个对象时,需要使用this指针


      class Stock
      {
      private:
       ...
      double total_val;
       ...
      public:
      double total() const { return total };
       ...
      };
  
 

2. 如何将两个要比较的对象提供给成员函数呢?

假设改方法命名为topval()

stock1.topval()访问stock1对象的数据

stock2.topval()访问stock2对象的数据

如果将两个对象进行比较,必须将第二个对象作为参数传递给它

作为引用传递的话,效率更高

topval()方法使用一个类型为const Stock & 参数

如何将答案传递给调用程序呢?让方法返回一个引用,引用指向比较高的对象

const Stock & topval ( const Stock & s ) const ;

3. 回顾const 成员函数

 4. const Stock & topval ( const Stock & s ) const 解读

返回类型为const Stock &的引用;topval这里是隐式访问,括号里是显式访问

5. topval如何实现?

class Stock
{
    private: 
    ...
    double total_val;
    ...
public:
    double total() const { return total };
    ...
};

6. this是返回对象的地址,*this是对象


      const Stock & Stock :: topval(const Stock & s) const
      {
      if (s.total_val > total_val)
      return s;
      else
      return *this;
      }
      //回顾
      class Stock
      {
          private:
          ...
          double total_val;
          ...
      public:
          double total() const { return total };
          ...
      };
  
 

程序实现

stock20.h


      // stock20.h -- Stock class interface
      // 版本 20 类的声明
      #ifndef STOCK20_H_
      #define STOCK20_H_
      #include<string>
      class Stock
      {
      public:
     	//构造函数,重载实现两种方式
      	Stock();
      	Stock(const std::string & co, long n = 0, double pr = 0.0);
     	//析构函数
      	~Stock();
     	void buy(long num, double price);
     	void sell(long num, double price);
     	void update(double price);
     	void show()const;
     	//10.4节新内容,this指针返回
     	//返回两个对象的比较
     	const Stock & topval(const Stock & s) const;
      private:
     	std::string company;
     	long shares;  //股票数量
     	double share_val;  // 每股的价格
     	double total_val;   //股票的总价格
     	void set_tot()
      	{
      		total_val = shares*share_val;
      	}
      };
      #endif
  
 

stock20.cpp


      // stock20.cpp -- 对类stock20.h进行函数描述
      // 版本还是00
      #include<iostream>
      #include"stock20.h"
      //构造函数
      Stock::Stock()
      {
     	std::cout << "默认参数设置,这里是构造函数\n";
      	company = "no name";
      	shares = 0;
      	share_val = 0.0;
      	total_val = 0.0;
      }
      Stock::Stock(const std::string & co, long n, double pr)
      {
      	company = co;
     	if (n < 0)
      	{
     		std::cout << "股票数量不能设置为0; "
      			<< company << " shares set to 0. \n";
      		shares = 0;
      	}
     	else
      	{
      		shares = n;
      	}
      	share_val = pr;
      	set_tot();
      }
      //析构函数
      Stock::~Stock()
      {
     	std::cout << "再见了, " << company << "!\n";
      }
      void Stock::buy(long num, double price)
      {
     	if (num < 0)
      	{
     		std::cout << "股票购买数量不能是负数。" << "交易被终止了!!\n";
      	}
     	else
      	{
      		shares += num;
      		share_val = price;
      		set_tot();
      	}
      }
      void Stock::sell(long num, double price)
      {
     	using std::cout;
     	if (num < 0)
      	{
     		cout << "股票不能卖负数,你脑筋有问题?" << "中断交易了";
      	}
     	else if (num>shares)
      	{
     		cout << "你自己有几个股票不清楚吗?你能卖比自己持有还多的股票吗?!" << "交易终止!!!";
      	}
     	else
      	{
      		shares -= num;
      		share_val = price;
      		set_tot();
      	}
      }
      void Stock::update(double price)
      {
      	share_val = price;
      	set_tot();
      }
      // 设置输出的数字格式
      void Stock::show() const
      {
     	using std::cout;
     	using std::ios_base;
     	//设置格式为#.###
      	ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
     	std::streamsize prec = cout.precision(3);
     	cout << "Company: " << company
      		<< " Shares: " << shares << '\n';
     	cout << " Share Price: $ " << share_val;
     	//设置格式为#.##
     	cout.precision(2);
     	cout << " Total Worth: $" << total_val << '\n';
     	//重新恢复原来的格式
     	cout.setf(orig, ios_base::floatfield);
     	cout.precision(prec);
      }
      const Stock & Stock::topval(const Stock & s) const
      {
     	if (s.total_val>total_val)
      	{
     		return s;
      	}
     	else
      	{
     		return *this;
      	}
      }
  
 

usestock2.cpp


      // usestock2.cpp -- 使用stock class
      //记得与stock20.cpp编译一起
      //展示对象数值的使用
      #include<iostream>
      #include"stock20.h"
      const int STKS = 4;
      int main()
      {
     	//初始化对象数组
      	Stock stocks[STKS] =
      	{
      		Stock("Nanosmart", 12, 30.0),
      		Stock("Mary", 204, 34.5),
      		Stock("Jack", 324, 2.3),
      		Stock("Allen", 23, 54.4)
      	};
     	std::cout << "拥有这些股票:\n";
     	int st;
     	for (int st = 0; st < STKS; st++)
      	{
      		stocks[st].show();
      	}
     	//设置指针指向第一个元素
     	const Stock * top = &stocks[0];
     	for (int st = 0; st < STKS; st++)
      	{
      		top = &top->topval(stocks[st]);
      	}
     	std::cout << "\n 现在最有价值的股票是:\n";
     	std::cout<<"看这里的bug"<< std::endl;
      	top->show();
     	return 0;
      }
  
 

运行结果:

 值得注意的是

show那里是用了const

top->show()这个用法,top是指针地址

再见了是析构函数特意显示的

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/98845548

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。