類的訪問控制

蓝色的海嗷發表於2024-05-24

this關鍵字

this是一個指向當前物件例項的指標,主要用於類的成員函式中。
它允許成員函式訪問呼叫該函式的物件。
主要用法:
1、訪問成員變數:當成員函式中的區域性變數名與類的成員變數名相同時,可以使用this指標來區分它們。

class MyClass
{
private:
	int value;
public:
	void setValue(int newValue)
	{
		this->value = newValue;  //這個類的value = newValue
	}
}

2、返回當前物件的引用:this可以用來返回當前呼叫物件自身的引用。
這在鏈式呼叫模式中非常有用。

class MyClass {
    public:
        MyClass& setA(int a) {
            // 設定屬性A
            return *this; // 返回this,允許鏈式呼叫
        }
        
        MyClass& setB(int b) {
            // 設定屬性B
            return *this; // 返回this,允許鏈式呼叫
        }
    };
    MyClass obj;
    obj.setA(10).setB(20); // 鏈式呼叫

3、作為函式引數傳遞:儘管不常見,this指標可以作為引數傳遞給其他函式。
這在特定情況下,如實現回撥函式時可能有用。

    class MyClass {
    public:
        void doSomething() {
            // 呼叫外部函式,並傳遞this指標
            externalFunction(this);
        }
    };
    void externalFunction(MyClass* obj) {
        // 使用obj指標操作MyClass物件
    }

4、靜態成員函式中的限制:靜態成員函式沒有this指標,因為它不依賴於特定的物件例項。
如果你嘗試在靜態成員函式內部使用this,編譯器將會報錯。

5、友元函式中的限制:友元函式雖然不是類的成員,但如果它們需要訪問類的非靜態成員,可以透過傳遞物件指標或引用來使用this。
然而,友元內部不允許直接使用this,因為它不是類的成員函式。

行內函數

在編譯時展開,減少執行時開銷的一種最佳化技術。
行內函數透過在編譯期間將函式呼叫點替換為函式本體程式碼的方式,避免了函式呼叫過程中涉及到的開銷(棧幀的建立和銷燬、引數的傳遞、返回地址的管理等),提高了程式執行的速度。

定義和使用行內函數:
在函式宣告前加上inline關鍵字來定義一個行內函數。
如:

inline int add(int a, int b)
{
	return a + b;
}

或者,對於類成員函式:

class Myclass
{
public:
	inline int add(int a, int b)
	{
		return a + b;
	}
}

透過inline關鍵字宣告,也可以在類的cpp檔案裡定義函式時在前面指明inline。
一個類的成員函式在類的標頭檔案實現了,拿它也是行內函數。

最好只在類外部定義的地方說明inline,這樣可以使類更容易理解。

特點:
1、編譯時展開:行內函數的程式碼在編譯期間直接插入到呼叫處,而不是透過函式呼叫的方式執行。這意味著行內函數沒有函式呼叫的開銷。
2、程式碼膨脹:由於行內函數的程式碼會在每個呼叫點展開,如果行內函數體很大或者被頻繁呼叫,可能會導致最終的可執行檔案體積增大。
3、不一定總是內聯:如果函式體過於複雜,編譯器可能會選擇不內聯該函式以免程式碼膨脹.

使用場景:
1、小型函式
2、頻繁呼叫的函式
3、避免函式呼叫的開銷

mutable機制

mutable關鍵字提供了一種機制,允許類的成員變數在const成員函式中被修改。
通常情況下,當成員函式被宣告為cosnt時,它不能修改類的任何成員變數。
但是,可以透過將某個變數宣告為mutable,可以解除這一限制,使得這些變數即使在const成員函式中也能被修改。

使用場景:
1、快取值:有時,計算某個成員變數的值可能很昂貴,但在const成員函式中需要頻繁訪問這個值。
透過將這個變數宣告為mutable,可以在const成員函式中快取並更新這個值,而不會違反const成員函式不改變物件狀態的約定。
2、計數器或狀態標誌:在某些情況下,可能需要跟蹤const成員函式被呼叫的次數,或者記錄物件的狀態。
使用mutable成員變數可以方便地實現這一點,而不影響const成員函式的語義。

鏈式呼叫

鏈式呼叫是一種程式設計技術,它允許在一個物件上連續呼叫多個方法。
優點:大幅減少程式碼量,使得程式碼邏輯更加清晰。
核心:在於每個函式在執行完操作後,返回物件本身的引用(通常返回this或者* this),這樣就可以在返回的物件上繼續呼叫方法,形成鏈式效果。

關鍵點:
1、返回物件引用:每個函式在執行操作後,需要返回物件本身的引用,而不是返回複製。
2、狀態改變:每個鏈式方法會改變物件的狀態,這樣鏈式下去,物件狀態會不斷改變。
3、引用傳遞:鏈式呼叫都是簡歷在物件引用的基礎上,採用引用傳遞而不是值傳遞。這樣對物件的操作就是對同一個物件的例項進行的。
4、無需臨時變數:鏈式呼叫讓程式碼更簡潔,避免定義許多臨時變數,直接透過方法連結串列達一個操作流程。

#include <iostream>
class Calculator {
public:
    Calculator& add(int value) {
        result += value;
        return *this;  // 返回物件本身
    }
    Calculator& multiply(int value) {
        result *= value;
        return *this;  // 返回物件本身
    }
    void display() {
        std::cout << "Result: " << result << std::endl;
    }
private:
    int result = 0;
};
int main() {
    Calculator calc;
    calc.add(5).multiply(3).add(2).multiply(4).display(); // 鏈式呼叫
    return 0;
}

相關文章