[C++之旅] 17 常對象成員和常成員函數(shù)

[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ù),要不然編譯器會報錯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容