1.const限制成员函数
-
const区分成员函数
-
首先,要明白,一个对象一旦被const修饰,eg:const Person p(“ljh”,18);就意味着p是个常量,而常量一般来说是无法调用函数的,但是可以调用const的方法(只能);
-
const可以作为函数重载的条件;
-
non-const对象在既存在non-const的方法又存在const方法时(重载),只能调用non-const版本,在只存在const的版本时,也可以调用;而const对象只能调用const的方法;
-
const方法:返回如果是引用时,如重载[ ],返回string的某个位,那一定要返回const的引用,才能保证和const的对象的身份相一致,而不被修改;鲁棒性更好;
-
-
const传参的作用
-
第一个时为了在传递引用的时候,为了只读,加了const
-
第二个是为了扩大参数的接收范围,既可以接收非const 对象,也可以接收const对象,即便是非const的对象,进入函数后也能保证转变为const的对象;
-
2.位常量和逻辑常量
-
当我们书写了一个const的成员函数,这意味着我们需要用const的对象来调用它,const对象的本意是我们不修改它的任何成员,这符合位常量的定义,即不对任何成员进行值的修改;
-
而我们会有特殊的需求:在const的对象中,且调用const的成员函数时,会修改某些特定的成员属性的值,这时我们需要用到mutable关键字来修饰成员属性,类似于给它开绿灯,让它可以在const的成员函数中可以被修改;
#include <iostream> using namespace std; class Person { friend void test(); public: Person(const string& name, const int& age) :name(name), age(age) { } void func()const { //name="yyds";//Error:name在const的成员函数中无法被修改; age = 18; //正确!有mutable关键字修饰,开绿灯了! } private: string name; mutable int age; }; void test() { Person p("ljh", 16); cout << "a: " << p.age << endl; p.func(); cout << "a: " << p.age << endl; } int main(void) { test(); return 0; }