一、常对象
概念:如果某个对象不允许修改,则该对象称为常对象。
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);//定义常对象C1
Clock const C2(10,10,10);//定义常对象C2
Clock 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(); //非常对象可以调用非常成员函数