目录
- this引入
-
- 总结this
- const成员函数
-
- 能const构造函数吗
this引入
假设我们有这样一个类:
class Sales_Data
{
public:
string isbn() const { return BookNo; }
private:
string BookNo;
};
定义类对象total:
Sales_Data total
。
那么total.isbn()是如何做到返回total的数据成员BookNo的?
实际上,
类的成员函数有一个隐式的参数,这个隐式的参数就是this指针
。所以,在类对象调用成员函数时,会把类对象地址传入成员函数,即total.isbn()可看作是total.isbn(&total)。
当isbn()使用BookNo时,实际上隐式的使用this指向对象的BookNo数据成员,即return BookNo实际上是return this->BookNo。
总结this
下面我总结一下this及它的一些其他用法:
- this 实际上是类所有成员函数(静态成员函数和友元函数除外)的一个形参,在类对象调用成员函数时,将对象的地址传给 this。所以this代表当前对象。
- 一个对象的this指针并不是对象本身的一部分,
。不会影响sizeof(对象)的结果
-
。而这些被编译成普通函数的成员函数一定有一个this的形参,用于标识某具体类对象,作为成员函数和成员变量关联的桥梁。一个类的大小仅仅是数据成员的大小,所有成员函数均被编译成普通函数
- 当成员函数的参数与类的数据成员名相同时,要用this赋值,如this->BookNo = BookNo (不要写成BookNo = BookNo ,尽管不报错,但达不到目的)。
const成员函数
默认情况下,this是一个常量指针,如,引例中this就是Sales_Data *const类型。在某种情况下,成员函数不改变数据成员的内容,把this指针声明为指向常量的常量指针有助于提高函数的灵活性和易读性。
但是由于this是隐式的,我们无法指向修改其类型,C++的做法是允许在类的成员函数的参数列表后面加上一个const,如引例中string isbn() const,此时isbn是无法修改调用它的类对象的数据成员的,而这样的使用const的成员函数就是常量(const)成员函数。
这里注意:
- 对于常量对象、常量对象的引用和常量对象的指针,它们只能调用常量成员函数。原因很简单,常量是不能改变的,如果它们可以调用非常量成员函数,而非常量成员函数是可以改变对象数据成员的。这就有矛盾,C++不允许。
能const构造函数吗
- 首先,
原因很简单,构造函数是用来初始化数据成员的。对于构造函数,不能声明为const。
-
其次,在前面说到,常量对象是只能调用常量成员函数的,这是不是意味着常量对象不能使用构造函数初始化了?非也,其实,当我们创建一个常量对象时,在调用构造函数初始化结束后,对象才真正被赋予常量属性。
总结:
- 常量成员函数无法改变数据成员
- 常量对象、常量对象的引用和常量对象的指针,它们只能调用常量成员函数
- 构造函数不能声明为const