cpp学习笔记之this指针

1.问题引领
接上前面所学的类的知识,现在我们来思考一个问题。由于我们创建一个类,例如这样的声明:
在这里插入图片描述
通过类的声明,我们可以创建两个类的对象,例如 Stock stock1,stock2;接下来的问题是我们如何去比较两个对象中total的大小。
在这里,我们先假设有一个成员函数可以比较两个对象的成员函数叫compare();则stock1.compare将访问stock1对象的数据,stock2.compare将访问stock2对象的数据。如果我们希望用该方法将两个对象比较,一个很自然而然的方法就是,将第二个对象作为参数传递给他。考虑到效率方面的因素,我们可以使用按引用来传递参数。
则一个用于比较的方法原型可以是这样子:
const Stock & compare(const Stock & s) const;
函数说明:一个const说明不能修改函数的返回值,括号中的const说明不会修改被显示地访问的对象,括号后的const表明,函数不会修改隐式地访问的对象。
函数的调用方式可以是这样:
higher_val = stock1.compare(stock2);或者
higher_val = stock2.compare(stock1)
函数的具体细节将会是这样:
const Stock & Stock::compare(const Stock & s) const
{
if(s.total_val > total)
return s;
else
return ;
}
在这里你可能会疑惑,为什么第二个return什么也没有返回。我们在这里可以思考一下,首先看函数函数声明,函数需要返回的是一个类,要是条件不成立是不是应该返回的是一个Stock1,但是stock1没有别名,上面之所以可以返回s。这句话的意思也就是说如果调用stock1.compare(stock2),则s是不是变成了stock2的引用,也就是stock2拥有了别名;但是stock1却没有别名。反过来,要是这样子调用,stock2.compare(stock1),则意味着stock1有别名,stock2却没有。
基于上面的情况,所以才引出了this指针,要是stock1.compare(stock2)调用,则this将会指向stock1对象的地址。
2.this指针的作用
每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用这个调用对象,则可以使用*this。在函数括号后使用const将this限定为const,这样将不能使用this来修改对象的值。当需要返回this对象的数值时,则可以使用解除引用操作符 *this。
3.对象数组

例如:Stock mystock[4];
这样的声明则会使用默认构造函数来初始化数组当中的每一个元素。
当然也可以调用构造函数来为每一个数组进行初始化,例如
Stock mystock[10] = {
Stock(“apple”,60,50.0),
Stock(“huawei”,80,53.15),
Stock(“baidu”,90,45.35),
Stock(“sougou”,90,12.25)
};

则其余的元素则按照默认构造函数进行初始化,所以要创建类对象数组时,这个类必须要有默认构造函数。
4.实战案例
头文件
在这里插入图片描述
类.cpp文件
#include
#include
#include"this_stock.h"

//默认构造函数
//当程序创建未被显式初始化的类对象时,总是会调用默认构造函数
Stock::Stock()
{
std::strcpy(company,“no name”);
shares = 0;
share_val = 0;
total_val = 0;
}

Stock::Stock(const char * co,int n,double pr)
{
std::strncpy(company,co,29);
company[29] = ‘\0’;
if(n < 0)
{
std::cerr << "Number os shares can’t be negative. "
<< company << “shares set to 0.\n”;
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}

//析构函数
Stock::~Stock()
{

}

void Stock::buy(int num,double price)
{
using std::cerr;
if(num < 0)
{
cerr << “Number of shares puchased can’t be nagetive .”
<< “Transactin is aborted.\n”;
}
else if(num > shares)
{
cerr << "you can’t sell more than you have! "
<< “Tancation is aborted.\n”;
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(int num,double price)
{
using std::cerr;
if(num < 0)
{
cerr << “NUmber of shares sold can’t be negative .”
<< “Tranciton is aborted.”;
}
else if(num > shares)
{
cerr << "You can’t sell more than you have! "
<< “Transaction is aborted.\n”;
}
else
{
shares = -num;
share_val = price;
set_tot();
}
}

void Stock::update(double price)
{
share_val = price;
set_tot();

}
void Stock::show()
{
using std::cout;
using std::endl;
cout << “Company: " << company
<< " shares: " << shares << endl
<< “shares price: $” << share_val
<< " total worth: $” << total_val << endl;
}
const Stock & Stock::compare(const Stock & s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
main.cpp
#include"this_stock.h"
const int STKS = 5;

int main()
{
using std::cout;
using std::ios_base;
Stock mystock[STKS] = {
Stock(“jiujing”,15,30.45),
Stock(“buzhiweizhi”,30,8.05),
Stock(“haorizi”,50,4.55),
Stock(“haohanzi”,80,10.30),
Stock(“kaoroufan”,90,8.25)
};

cout.precision(2);
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout << "Stock holdings:\n";
int st;
for(st = 0;st < STKS; st++)
	mystock[st].show();

Stock top = mystock[0];
for (st = 1;st < STKS; st++)
	top = top.compare(mystock[st]);
cout << "\nMost valuable holding:\n";
top.show();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值