[C++之旅] 17 常对象成员和常成员函数
一、常对象成员和常成员函数
常对象成员
常对象成员:对象成员采用const修饰
例如线段Line这个类中包含Coordinate点这个类,想要实例化一个固定的线段就可以使用const修饰Coordinate这个类。实例如下
class Coordinate
{
public:
Coordinate(int x, int y);
private:
int m_x;
int m_y;
};
Coordinate::Coordinate(int x, int y):
m_x(x), m_y(y)
{
}
Coordinate表示点的类,其中包含点的xy坐标
class Line
{
public:
Line(int x1, int y1, int x2, int y2);
private:
const Coordinate m_coorA;
const Coordinate m_coorB;
};
Line::Line(int x1, int y1, int x2, int y2):
m_coorA(x1, y1), m_coorB(x2, y2)
{
}
Line表示线的类,包含两个点的类,即包含AB两个坐标点
int main(void)
{
Line *p = new Line(1, 2, 4, 5);
delete p;
p = NUll;
return 0;
}
注意:const修饰的变量/函数/对象都必须使用初始化列表来初始
常成员函数
常成员函数:成员函数采用const修饰
以Coordinate点这个类为例,包含const修饰的changeXY函数和未被修饰的changeXY函数,这两函数互为函数的重载。
class Coordinate
{
public:
Coordinate(int x, int y);
void printfInfo() const;
void printfInfo();
private:
int m_x;
int m_y;
};
Coordinate::Coordinate(int x, int y):
m_x(x), m_y(y)
{
}
常成员函数中不能修改成员变量值。即下面的写法是错误的
void Coordinate::printfInfo() const
{
m_x = 5;
m_y = 8;
cout << "const" << "(" << m_x << ", " << m_y << ")" << endl;
}
其函数原型为
void Coordinate::printfInfo(const Coordinate *this)
{
this->m_x = 5;
this->m_y = 8;
cout << "const" << "(" << this->m_x << ", " << this->m_y << ")" << endl;
}
而此时this指针为常指针,不能修改其值,因此这种使用方法是错误的。
包含const修饰的changeXY函数和未被修饰的changeXY函数互为函数的重载,那什么时候调用的是那个呢?如下使用方式调用的是未被const修饰的函数:
int main(void)
{
Coordinate coorA(4, 5);
coorA.printfInfo();
return 0;
}
那什么时候可以调用常成员函数呢?如下使用方式调用的是const修饰的函数也就是常成员函数:
int main(void)
{
const Coordinate coorA(4, 5);
coorA.printfInfo();
return 0;
}
调用常成员函数并不只上面的一种方法,当没有函数重载时,定义了有常成员函数,也可以调用常成员函数实例如下:
class Coordinate
{
public:
Coordinate(int x, int y);
void printfInfo(void) const;
private:
int m_x;
int m_y;
};
Coordinate::Coordinate(int x, int y)
: m_x(x), m_y(y)
{
}
void Coordinate::printfInfo(void) const
{
cout << "const" << "(" << m_x << ", " << m_y << ")" << endl;
}
int main()
{
Coordinate CoorA(4, 5);
CoorA.printfInfo();
return 0;
}
其输出为:
const(4, 5)
由上例知普通对象在没有相应的普通对象函数情况下会调用常对象函数,但是常对象只能调用常对象函数,要不然编译器会报错