Coordinate coor1(3,5); //定义一个普通对象
const Coordinate &coor2 = coor1; //coor2是对象的常引用
const Coordinate *pCoor = &coor1; //pCoor是一个指向常对象的指针
Coordinate const * pCoor2 = &coor1; //pCoor2是一个常指针,指向一个普通对象
//调用常成员函数,都可以
coor1.printInfo(); //正确,普通对象可以调用常成员函数
coor2.printInfo(); //正确
pCoor->printInfo(); //正确
pCoor2->printInfo(); //正确
//调用普通成员函数
coor1.getX(); //正确
coor2.getX(); //错误,常引用只能调用常成员函数
pCoor->getX(); //错误, 常对象的指针也只能调用常成员函数
pCoor2->getX();//正确,普通对象的指针什么都能调用
//修改指针指向的位置
Coordinate coorB(7,9);
pCoor1 = &coorB //pCoor1指针本身不是常变量,它可以指向别的对象
pCoor2 = &coorB //pCoor2是一个常指针,不能再指向别的对象
- 常对象只能调用常成员函数,不能调用普通成员函数
- 普通对象能够调用常成员函数,也能够调用普通成员函数
- 常指针和常引用都只能调用对象的常成员函数。
- 一个对象可以有多个对象常引用
定义一个坐标类,在栈上实例化坐标类常对象,并给出坐标(3,5),然后定义常引用、常指针,最后使用对象、引用、指针分别通过调用信息打印函数打印坐标信息。
打印结果如图
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y)
{
// 设置X,Y的坐标
m_iX=x;
m_iY=y;
}
// 实现常成员函数
void printInfo() const
{
cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
}
public:
int m_iX;
int m_iY;
};
int main(void)
{
const Coordinate coor(3, 5);
// 创建常指针p
const Coordinate *p =&coor;
// 创建常引用c
const Coordinate &c=coor;
coor.printInfo();
p->printInfo();
c.printInfo();
return 0;
}