C++ this指针和const成员函数
this指针
- this指针:成员函数通过一个名为this的隐式形参来访问调用它的那个对象。this由调用该成员函数的对象的地址初始化。
1 Sales_data total; 2 total.isbn(); //等价于Sales_data::isbn(&total),编译器负责把total的地址传递给isbn的隐式形参this
-
this是一个常量指针,因为this总是指向“这个”对象,不允许改变this中保存的地址。
const成员函数:
- 来源:默认情况下,this是指向类类型非常量版本的常量指针,尽管this是隐式形参,但也需要遵循初始化准则,在默认情况下不能把this绑定到一个常量对象上(普通指针不能指向常量),即我们不能在一个常量对象上调用普通的成员函数。因此,设计类的一个准则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。
(1)有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
(2)除此之外,在类的成员函数后面加 const 还有什么好处呢?那就是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。 - 在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
- const成员函数可以访问非const对象的非const数据成员,const数据成员,也可以访问const对象内的所有数据成员。
- 非const成员函数只可以访问非const对象的任意的数据成员(不能访问const对象的任意数据成员)。
- 作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。
- const成员函数可以被对应的具有相同形参列表的非const函数重载:如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。
#include<iostream> using namespace std; class A { public: void f() { cout << "not const" << endl; } void f() const { cout << "const" << endl; } }; int main() { A a; cout << "a: "; a.f(); const A &b = a; cout << "b: "; b.f(); const A *c = &a; cout << "c: "; c->f(); A *const d = &a; cout << "d: "; d->f(); A *const e = d; cout << "e: "; e->f(); const A *f = c; cout << "f: "; f->f(); return 0; }
//output:a: not const
b: const
c: const
d: not const
e: not const
f: const