1.常对象成员
class Coordinate
{
public:
Coordinate(int x, int y):m_ix(x),m_iy(y){}
~Coordinate(){}
private:
int m_ix;
int m_iy;
};
我们把用const修饰的对象成员叫做常对象成员
class Line
{
public:
Line(int x1, int y1, int x2, int y2):coorA(x1, y1),coorB(x2, y2);
private:
const Coordinate coorA;
const Coordinate coorB;
};
2.常成员函数
用const修饰一个成员函数,那么这个成员函数就叫做常成员函数
class Coordinate
{
public:
Coordinate(int x, int y);
void changeX() const;//在成员函数后面加一个const,这个成员函数就是常成员函数
void changeX();
private:
int x;
int y;
};
/***************************
void Coordinate::changeX() const //const Coordinate *this
{
x=10; //this->x = 10; 错误
}
//不能在常成员函数中修改数据成员的值,因为隐含了一个用const修饰的this指针,
//这个指针是常指针,不可以改变常指针指向的数据的值
*****************************/
上面的坐标类中,我们定义了两个changeX(),区别是有没有const修饰,
这两个函数互为重载
那么这两个changeX()被调用的时候应该是调用哪一个呢?
Coordinate coorA(1,1);
coorA.changeX();//此时调用普通的成员函数changeX()
Coordinate coorB(1,1);
coorB.changeX();//此时调用 常成员函数 changeX()
3.常指针和常引用
用const修饰的指针,和用const修饰的引用叫做常指针和常引用
class Coordinate
{
public:
Coordinate(int x, int y);
int getX(){return x;}
int getY(){retrun y;}
void printInfo() const;
private:
int x;
int y;
};
void Coordinate::printInfo() const
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
int main()
{
Coordinate coor1(3,5);
const Coordinate &coor2 = coor1; //对象的常引用
const Coordinate *pCoor = &coor1; //对象的常指针
Coordinate * const pcoor = &coor1;
Coordinate coor3(2,2);
//-----------coor2.getX();//错误因为是常引用
//调用函数传入的this指针有可读可写权限
//但是常引用coor2只有读权限,所以报错
coor2.printInfo();//常引用只读权限,常成员函数只读权限,调用成功
//------------pCoor->getX();//错误,也是权限问题
pCoor->printInfo();//常指针只读权限,常成员函数只读权限,调用成功
pcoor->getX();//此时pcoor有读写权限,可以调用getX
pcoor = &coor3;//错误,此时const修饰的是pcoor,不可以改变它的指向
pcoor->printInfo();//此时pcoor有读写权限,而printInfo需要读权限,调用成功
return 0;
}