1. 引入this
std::string isbn () const { return bookNo ;}
定义 Sales_data total; 在类外调用total.isbn();
在这里,使用点运算符访问total对象的isbn的成员,所以当我们调用成员函数时,是在替某个对象调用它。当isbn指向bookNo时,其实是隐式的指向调用该函数的对象的成员(比如其调用的是total.bookNo);
成员函数通过一个名为this的额外的隐式参数来访问那个对象,当我们调用一个成员函数时,其实是用该对象的地址来初始化this;
比如total.isbn();实际是把total的地址传给了隐式形参this;即调用函数可改写为 Sales_data::isbn(&total);其传递的形参为&total而函数则用this接收,其后用this代替total这个对象调用其成员。
所以,在调用的成员函数中,我们可以直接的使用调用该函数的对象的成员,也无需通过在函数内部指定一个对象来调用其成员,因为this代替该对象,完成了对其的调用。
其实可以将第一句代码改为
std::string isbn() const {return this->bookNo; } //其实this形参,是隐式定义的,任何定义名为this的参数或变量都是非法的,其实并没用必要,显示的调用this。
因为this的目的总是指向某个特定的对象,所以this是一个指针常量,我们不能改变this中的保存地址。
this可以显示的作为返回值;比如
return *this;//就是返回调用该函数的对象;
2.类作用域和成员函数
类本身就是一个作用域,类的成员函数的定义镶嵌在类的作用域内,因此,bookNo其实就是定义在Sales_data内的数据成员。
编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数。因此,成员函数可以随意的使用类中的其他成员而无需在一这些成员的出现次序。
若在类外定义成员函数就必须与类内的声明相匹配,类外部定义的成员名必须包含它的所属类名,比如
int Sales_data::avg_price() { return 0;} //函数名Sales_data::avg_price作用就是使编译器看到该函数名,就能理解剩余代码是位于类内的;