【C++】this 指针和对象数组详解
【摘要】 目录
1. 涉及到两个对象时,需要使用this指针
2. 如何将两个要比较的对象提供给成员函数呢?
3. 回顾const 成员函数
4. const Stock & topval ( const Stock & s ) const 解读
5. topval如何实现?
6. this是返回对象的地址,*this是对象
程序实现
stock20.h
usest...
目录
4. const Stock & topval ( const Stock & s ) const 解读
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)