天天看点

this和const成员函数。能const构造函数吗?(C++)this引入const成员函数

目录

  • 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及它的一些其他用法:

  1. this 实际上是类所有成员函数(静态成员函数和友元函数除外)的一个形参,在类对象调用成员函数时,将对象的地址传给 this。所以this代表当前对象。
  2. 一个对象的this指针并不是对象本身的一部分,

    不会影响sizeof(对象)的结果

  3. 一个类的大小仅仅是数据成员的大小,所有成员函数均被编译成普通函数

    。而这些被编译成普通函数的成员函数一定有一个this的形参,用于标识某具体类对象,作为成员函数和成员变量关联的桥梁。
  4. 当成员函数的参数与类的数据成员名相同时,要用this赋值,如this->BookNo = BookNo (不要写成BookNo = BookNo ,尽管不报错,但达不到目的)。

const成员函数

默认情况下,this是一个常量指针,如,引例中this就是Sales_Data *const类型。在某种情况下,成员函数不改变数据成员的内容,把this指针声明为指向常量的常量指针有助于提高函数的灵活性和易读性。

但是由于this是隐式的,我们无法指向修改其类型,C++的做法是允许在类的成员函数的参数列表后面加上一个const,如引例中string isbn() const,此时isbn是无法修改调用它的类对象的数据成员的,而这样的使用const的成员函数就是常量(const)成员函数。

这里注意:

  • 对于常量对象、常量对象的引用和常量对象的指针,它们只能调用常量成员函数。原因很简单,常量是不能改变的,如果它们可以调用非常量成员函数,而非常量成员函数是可以改变对象数据成员的。这就有矛盾,C++不允许。

能const构造函数吗

  1. 首先,

    对于构造函数,不能声明为const。

    原因很简单,构造函数是用来初始化数据成员的。
  2. 其次,在前面说到,常量对象是只能调用常量成员函数的,这是不是意味着常量对象不能使用构造函数初始化了?非也,其实,当我们创建一个常量对象时,在调用构造函数初始化结束后,对象才真正被赋予常量属性。

总结:

  1. 常量成员函数无法改变数据成员
  2. 常量对象、常量对象的引用和常量对象的指针,它们只能调用常量成员函数
  3. 构造函数不能声明为const