C++中不一樣的重載

語言: CN / TW / HK

關於什麼是重載想必大家都知道,無非就是參數個數不同,參數類型不同可以重載,這裏我就不過多介紹啦。

這裏想分享C++中一個不一樣的重載,即const重載。

可以看下面的代碼:

struct A {
    int count() {
        std::cout << "non const" << std::endl;
        return 1;
    }

    int count() const {
        std::cout << "const" << std::endl;
        return 1;
    }
};

int main() {
    A a;
    a.count();
    const A b;
    b.count();
}

這段代碼會輸出什麼?

輸出的是這樣:

non const
const

不知道大家平時有沒有關注過這種用法,沒關注過可以繼續向下看哈。

從上面的輸出結果我們也可以看到,const修飾的對象調用的是使用const修飾的方法,非const對象調用的是非const的方法。

然而想必大家都知道對象調用的原理:

看下面的這段代碼:

A a;
a.func();

其實到底層,函數可能會變成這樣:

func(A* a);

函數是在代碼段,對象是在數據段,調用不同對象的函數,其實只不過是同一個函數,傳遞了不同的數據參數而已。

上面的是把對象的this指針傳進去。

再回到上面的代碼:

struct A {
    int count() {
        std::cout << "non const" << std::endl;
        return 1;
    }

    int count() const {
        std::cout << "const" << std::endl;
        return 1;
    }
};

可以理解為:

int count(A *);
int count(const A*);

咦,這不就是重載嗎,難道還有const重載?

還真有,看下這段代碼:

struct A {
    int count(const int& s) {
        std::cout << "const" << std::endl;
        return 1;
    }

    int count(int& s) {
        std::cout << "non const" << std::endl;
        return 1;
    }
};

int main() {
    A a;
    a.count(4);
    int c = 5;
    a.count(c);
}

輸出如下:

const
non const

所以得出結論:

不只是參數類型和個數不同會產生重載,const修飾的參數也會有重載。

但是隻有當const修飾的是指針或者引用類型時才可以,普通的int和const int會編譯失敗的,具體大家可以自己寫代碼試試。
這裏大家也可以想想,問什麼一定要指針或者引用類型時重載才可以呢?

以上就是本次分享的所有內容,想要了解更多歡迎前往公眾號:C語言學習聯盟,每日干貨分享