您的位置:首页 > 编程语言 > C语言/C++

二十三、C++程序设计必知:常引用、常对象和对象的常成员

2015-04-25 15:20 239 查看
当我们定义的数据或对象不能改变时,我们就要将其声明为常量。主要有常引用、常对象、对象的常指针、常数组、常指针等。
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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  const