[C++之旅] 17 常對象成員和常成員函數(shù)
一、常對象成員和常成員函數(shù)
常對象成員
常對象成員:對象成員采用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修飾的變量/函數(shù)/對象都必須使用初始化列表來初始
常成員函數(shù)
常成員函數(shù):成員函數(shù)采用const修飾
以Coordinate點這個類為例,包含const修飾的changeXY函數(shù)和未被修飾的changeXY函數(shù),這兩函數(shù)互為函數(shù)的重載。
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)
{
}
常成員函數(shù)中不能修改成員變量值。即下面的寫法是錯誤的
void Coordinate::printfInfo() const
{
m_x = 5;
m_y = 8;
cout << "const" << "(" << m_x << ", " << m_y << ")" << endl;
}
其函數(shù)原型為
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函數(shù)和未被修飾的changeXY函數(shù)互為函數(shù)的重載,那什么時候調(diào)用的是那個呢?如下使用方式調(diào)用的是未被const修飾的函數(shù):
int main(void)
{
Coordinate coorA(4, 5);
coorA.printfInfo();
return 0;
}
那什么時候可以調(diào)用常成員函數(shù)呢?如下使用方式調(diào)用的是const修飾的函數(shù)也就是常成員函數(shù):
int main(void)
{
const Coordinate coorA(4, 5);
coorA.printfInfo();
return 0;
}
調(diào)用常成員函數(shù)并不只上面的一種方法,當沒有函數(shù)重載時,定義了有常成員函數(shù),也可以調(diào)用常成員函數(shù)實例如下:
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)
由上例知普通對象在沒有相應的普通對象函數(shù)情況下會調(diào)用常對象函數(shù),但是常對象只能調(diào)用常對象函數(shù),要不然編譯器會報錯