1.类常量成员变量
类常量成员变量:由关键字const修饰的类成员变量。
定义类常量成员变量的一般格式如下:
const 数据类型 类常量成员变量=表达式;
类常量成员变量必须进行初始化,而且只能通过构造函数的成员初始化列表的方式进行。
2.常量对象
常量对象:使用const声明的对象就是常对象
常量对象必须在生命的同时进行初始化,而且不能被更新。定义常量对象的一般格式。
const 类名 对象名(参数表);
或 类名 const 对象名(参数表);
例:myDate const a1(1997,12,20);
//定义myDate类常量对象a1并且初始化
常量对象只能调用常量成员函数,不能调用非常量函数,普通对象可以调用所有成员函数。
3.常量函数
常量函数:用const声明、定义的成员函数。
常量函数的声明及定义形式为;
(1) 在类体内定义常量函数为内联函数时的形式;
类型标识符 函数名 (参数列表) const {.....//函数体}
(2)在函数体外声明,类体外的格式;
声明形式:类型标识符 函数名 (参数列表) const;
定义格式:类型标识符 类名::函数名(参数列表) const{.....//函数体}
常量函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数;说人话就是常量函数只能调用常量函数;
4.常引用作为函数的参数
使用引用作为函数参数传输的是地址;所以形参改变,则实参也跟着改变,如果不希望这种情况发生,就要使用常饮用作为参数;
例如:void Display(const double& r){const << r << endl;}
//Display只能使用不能改变r所引用的对象!
常引用形成员变量 常引用必须在构造函数中进行初始化。如果在程序中修改这个引用,则编译会报错
代码:
#include <iostream> using namespace std; class Sample { public: Sample(); void getValue() const; //常量成员函数 void priValue(); //非常量成员函数 void getValue();// 非常量成员函数 void priVcon() const; //常量成员函数 }; Sample::Sample() { } void Sample::getValue() const// 常量成员函数 { cout << "常量成员函数" << endl; } void Sample::getValue() { cout << "非常量成员函数" << endl; } void Sample::priValue() { cout << "非常量成员函数" << endl; } void Sample::priVcon() const { cout << "常量成员函数" << endl; } int main() { const Sample cono; Sample o; cout << "cono\t"; cono.getValue(); // 通过常量对象可以调用常量成员函数 //cono.priValue();//编译器会根据已经有的选择调用 //如果此时只有一个非常量的priValue函数则会报错,因为常量函数不能调用非常量函数 cout << "o\t"; o.getValue(); cout << "o\t"; o.priValue(); // 通过普通对象调用 cout << "o\t"; o.priVcon(); }
运行结果:
code p120:
#include <iostream> using namespace std; class constClass { const int conMbr;// 常量成员变量 int Mbr;// 普通成员变量 public: constClass() : conMbr(0),Mbr(100){} //初始化列表给出初值 无参数的构造函数conMbr=0,Mbr=100; constClass(int i) : conMbr(i)//初始化列表给出初值 { Mbr = 200; } void printConst() { cout << "conMbr=" << conMbr << ",Mbr=" << Mbr << endl; } int getConst() { cout << "调用非常量函数" << endl; return conMbr; } int getConst() const { cout << "调用常量函数" << endl; return conMbr; } int getValue() { return Mbr; } void processConst() { cout << "--在processConst函数中 非常量--" << endl; int x = 2 * conMbr + 1; cout << "x= 2 * conMbr + 1 = " << x << endl; //conMbr++;//错误不能修改常量成员变量conMbr的值 Mbr++;//可以修改因为不是常量成员变量 cout << "Mbr=" << Mbr << endl; Mbr++;//可以修改 因为这是非常量成员变量并且在非常量函数里 } void processConst() const { cout << "--在processConst函数中 常量--" << endl; int x = conMbr + 1; cout << "x = conMbr + 1 = " << x << endl; //可以读取常量conMbr //conMbr++; // 错误!不能更改常量成员变量 conMbr的值 //Mbr++;//不可以修改 cout << "Mbr=" << Mbr << endl; } }; int main() { constClass obj1(123), obj2; //conMbr=123,Mbr=200 obj1.printConst(); cout << "obj2.getConst()=" << obj1.getConst() << endl; obj2.processConst(); const constClass obj3(20); cout << "obj3.getConst()=" << obj3.getConst() << endl; obj3.processConst(); return 0; }
运行结果:
code p123:
#include <iostream> using namespace std; int fvalue = 10; class CDemo { public: CDemo(int n):num(n),ref(value),value(4){}//这里ref必须在构造函数里初始化 //左下可见ref是常引用类型,再看左侧构造函数内给ref=value的地址 value又等于4 //所以ref=4 初始化完毕,但是下面只可以读取不可以修改 public: const int num;//常量形成员变量 const int& ref;//常引用形成员变量 常引用必须在构造函数中进行初始化。如果在程序中修改这个引用,则编译会报错 int value; }; int main() { cout << sizeof(CDemo) << endl;//int 占4字节 类里定义了三个int类型的 固3*4=12 CDemo f(100); //f.ref = f.value; //错误! cout << "f.num=" << f.num << "\tf.ref=" << f.ref << "\tf.value=" << f.value << endl; return 0; }
运行结果: