常数据成员
一个类中的数据成员是可以被const修饰的,被称为常数据成员;常数据成员与普通数据成员初始化的方式并不相同
假设有一个Coordinate(坐标)类,用const修饰他的数据成员
class Coordinate
{
public:
Coordinate(int x,int y)
{
m_iX=x;//这种初始化方式是错误的,表达式必须是可修改的左值,但是m_iX是用const修饰的
m_iY=y;
}
private:
const int m_iX;
const int m_iY;
};
对于用const修饰的数据成员,只能用初始化列表来初始化!
class Coordinate
{
public:
Coordinate(int x,int y):m_iX(x),m_iY(y)//初始化列表
{
}
private:
const int m_iX;
const int m_iY;
};
常对象成员
当对象作为数据成员,也可以用const进行修饰,称为常对象成员
举例:
要确定一条直线,那么直线的两个点的坐标需要确定
定义一个Line线段类,因为要实现两个点一旦初始化,就不能再修改,所以需要将坐标对象定义成 const
常对象成员也要通过初始化列表来初始化
class Line
{
public:
Line(int x1,int y1,int x2,int y2):m_coorA(x1,y1),m_coorB(x2,y2)//通过初始化列表初始化
{
}
private:
const Coordinate m_coorA;
const Coordinate m_coorB;
};
常成员函数
const还可以修饰类中的成员函数,称为常成员函数;const放在成员函数的后面,不仅声明要写,定义也要写。
class Coordinate
{
public:
Coordinate(int x,int y);
void changeX() const;//常成员函数
void changeX();
private:
const int m_iX;
const int m_iY;
};
void Coordinate::changeX() const
{
m_iX = 10;//错误!!!! 常成员函数中不能修改数据成员的值
}
注意!!常成员函数中不能修改数据成员的值
当定义 changeX() 函数时,看上去没有任何的参数,而实际上却隐含着一个参数:this 指针
当使用const来修饰成员函数的时候
在changeX()参数中含有this指针,如果使changeX()成为常成员函数,则const修饰的是*this,const在*前则表示该指针的内容不可变,将m_iX赋值为10,则是将this指针的内容改变了,程序出错!因此,常成员函数中不能修改数据成员的值
- 常对象调用常成员函数
对象的常指针、常引用
还是之前的坐标类Coordinate,对对象的引用和对象的指针前用const修饰
#include<iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x,int y)
{
m_iX=x;
m_iY=y;
}
int getX()
{
return m_iX;
}
int getY()
{
return m_iX;
}
void printInfo() const//常成员函数
{
cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
}
private:
int m_iX;
int m_iY;
};
int main()
{
Coordinate coor1(3,5);
const Coordinate &coor2 = coor1;
const Coordinate *pCoor = &coor1;
coor1.printInfo();
coor2.getX();//错误
pCoor->getY();//错误
coor2.printInfo();//正确
return 0 ;
}
运行结果:
coor2被const修饰,具有只读权限,而getX()具有读写权限,会改变coor2中的值
#include<iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x,int y)
{
m_iX=x;
m_iY=y;
}
int getX()
{
return m_iX;
}
int getY()
{
return m_iX;
}
void printInfo() const//常成员函数
{
cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;
}
private:
int m_iX;
int m_iY;
};
int main()
{
Coordinate coor1(3,5);
Coordinate coor2(7,9);
Coordinate * const pCoor = &coor1;
pCoor->getY();//正确
pCoor = coor2;//错误
pCoor->printInfo();//正确
return 0 ;
}
运行结果;
Coordinate * const pCoor = &coor1;
const在*后,修饰的pCoor这个指针,pCoor指针的指向不能变,但是它指向的对象的内容可以变;所以用pCoor->getY()是正确的
但是pCoor = coor2,是让pCoor指向了coor2,而用const修饰的pCoor指针的指向不能变,所以程序出错。