当我们定义的数据或对象不能改变时,我们就要将其声明为常量。主要有常引用、常对象、对象的常指针、常数组、常指针等。 1、常引用 顾名思义。常引用所引用的对象不能更改。常见的如常引用作形参防止误改。 声明形式: const 类型说明符& 引用名 const int& i; //i不能被修改 2、常对象 常对象的数据成员在它的生存期内不会改变。定义时必须初始化,且不能再改变数据成员值。class A { public: A(int i,int j){x=i;y=j;} private: int x,y; }; A const a(1,2);//定义时就初始化,且不能再更新 //如果试图改变常对象,编译器会报错
3、类的常成员函数
我们知道改变类数据成员有两种方法,一是通过对象名访问公有数据成员改变,二是通过成员函数接口来改变。但常对象的数据成员是不能改变的。如果这样的话,常对象就只有数据而没有外部接口了。于是有了常成员函数。
定义方法
和普通函数一样,只是在定义完在最后加个const关键字修饰。#include<iostream> using namespace std; class A { public: A(inti,int j){x=i;y=j;} void show()const ;// 常成员函数 void show() {cout<<"普通版show调用"<<x<<y<<endl;} //重载 private: intx,y; }; void A::show() const{cout<<"const版show调用"<<x<<y<<endl;} int main() { A const a(1,2);//定义时就初始化,且不能再更新 A b(3,4); a.show(); //const版 b.show(); //普通版 、、如果类中未定义普通版的函数,则调用const版的 return 0; }
这里一开始也有点疑惑,不知道定义常成员函数有什么用。查了相关资料理解如下:
1、常对象是只能调用常成员函数的,这里如果常对象a要提供显示接口输出x,y的话,只能定义常成员函数来调用。
2、常成员函数没有修改类数据成员的权限。如果在常函数里面不小心修改了类成员或调用了非常函数。编译器会报错很容易找到。
需要注意的几点:
1、常成员函数声明和定义都要带const关键字
2、常对象只能调用用常成员函数,不能调用普通函数。
3、如上面说的,常成员函数不能修改对象数据成员也不能访问没有const声明的成员函数。
4、const可以参与重载函数的区分。
4、类的常数据成员
可以是常量和常引用。在任何函数中不能对常数据成员赋值。构造函数初始化时,只能通过初始化列表。#include<iostream> using namespace std; class A { public: A(inti); const int& c; //常引用 void show(); private: const int x; //常变量 static const int y; //静态常变量 }; const A::y=1; //静态常变量初始化方式 A::A(int i):x(i),c(x) //构造函数初始化列表给对象常数据成员赋初值 {} void A::show() { cout<<"x:"<<x<<"y:"<<y<<" c:"<<c<<endl; } int main() { A a(10); a.show(); return 0; }
二十三、C++程序设计必知:常引用、常对象和对象的常成员
最新推荐文章于 2024-07-14 22:12:24 发布