一、常对象
概念:如果某个对象不允许修改,则该对象称为常对象。
PS:
(1)不允许常对象调用任何类的成员函数,而且常对象一旦定义,在其生存期内不允许修改,否则导致编译错误。
(2)只有类的常成员函数才能访问该类的常对象,const成员函数依然不允许修改常对象。
(3)const对象不能被任何对象修改,他也不能被其他对象访问。
(4)const对象不能被赋值,必须在定义时由构造函数初始化。
#include<iostream>
using namespace std;class Clock //定义的Clock类
{
public:Clock(int h = 0,int m = 0,int s = 0)//构造函数{this -> H = h;this -> M = m;this -> S = s;}void SetTime(int h = 0,int m = 0,int s = 0)//创建时间{this -> H = h;this -> M = m;this -> S = s;}void ShowTime()//打印时间{cout << H << ":" << M << ":" << S << endl;}private:int H;int M;int S;
};int main()
{const Clock C1(9,9,9);//定义常对象C1Clock const C2(10,10,10);//定义常对象C2Clock C3(11,11,11);//C1 = C3;//error C1为常对象,不能被赋值// C1.ShowTime();//error C1为常对象,不能访问非常成员函数C3.ShowTime();//C1.SetTime(0,0,0,);// error C1为常对象,不能被更新return 0;
}
二、常数据成员
#include<iostream>
using namespace std;class A
{
public:A(int i) : a(i),r(a){cout << "constructor !" << endl;}void display(){cout << a << "," << b << "," << r <<endl;}
private:const int & r;//常引用数据成员const int a;//常数据成员static const int b;//静态常数据成员
};const int A :: b = 3; //静态常数据成员在类外说明和初始化int main()
{A a1(1);a1.display();A a2(2);a2.display();return 0;
}
运行结果:
三、常成员函数
(1)const是函数类型的一个组成成分,因此在函数实现部分也要带有const关键字
(2)常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数
成员函数与对象之间的操作方式
对象 函数 | 常对象 | 一般对象 |
常成员函数 | V | V |
一般成员函数 | X | V |
class Date
{
public:int Year() const;int Month() const;int Day() const { return D; };int Day() { return D++ };int AddYear(int i) { return Y + i; };
private:int Y;int M;int D;};
PS:容易出现的错误
(1)
int Date :: Month() //error:常成员函数不能缺少const
{return M;
} (2)
int Date :: Year() const
{//return Y ++; //error 常成员函数不能更新类的数据成员rerturn Y;
}(3)
Date const d1;
//int j = d1.AddYear(10); //error 常对象不能调用非常成员函数
int j = d1.Year(); (4)
Date d2;
int i = d2.Year();//非常对象可以调用常成员函数
d2.Day(); //非常对象可以调用非常成员函数