C++Primer Plus 第十章-this指针
程序如下:
//stock20.h 头文件
#ifndef STOCK20_H_
#define STOCK20_H_
#include<string>
class Stock
{
private:
std::string company;
int shares;
double shares_val;
double total_val;
void set_tot(){total_val = shares *share_val;} //内联函数
public:
Stock();//默认构造函数
Stock(const std::string &co, long n=0,double pr=0.0);//构造函数
~Stock();//析构函数
const Stock & topval(const Stock & s) const;
};
#endif
//stock20.cpp //源程序
#include <iostream>
#include"stock20.h"
Stock::Stock()//默认构造函数
{
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)...
shares=n;
share_val=pr;
set_tot();
}
Stock::~Stock()//析构函数
{
}
const Stock & Stock::topval(const Stock &s) const
{
if(s.total_val>total_val)
return s;
else
return *this;// this指针
}
1)const Stock & Stock::topval(const Stock &s) const 该函数隐式地访问一个对象,而显式地访问另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改被显式地访问的对象;而括号的const表明,该函数不会修改被隐式地访问的对象。由于该函数返回了两个const对象之一的引用,因此返回类型也应为const引用。
2) this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。这样,函数调用stock1.topval(stock2)将this指针设置为stock1对象的地址,使得这个指针可用于topval()方法。同样,函数调用stock2.topval(stock1)将this设置为stock2对象的地址。一般来说,所有的类方法都将this指针设置为调用它的对象的地址。
3)每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。然而,要返回的不是this,this是对象的地址,而是对象本身,即是*this(将解除引用运算符*用于指针,将得到指针指向的值)。
4)对象数组:可以用构造函数来初始化数组元素。必须为每个元素调用构造函数。
5)类作用域:在类中定义的名称(如类数据成员名称和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不会引起冲突。