← SEARCHABLE ARCHIVE
C / C++ · 2026-06-03

C++ 從基礎到精通 — 第 7 講

const、引用和指標之間的區別

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

將物件傳遞給函數時,必須決定是使用值、參考或指標。 雖然表面上很相似,但複製和修改的可能性卻有很大差異。

價值觀和參考

void PrintItem(Item item);              //按值傳遞
void UpgradeItem(Item& item);           //透過引用傳遞
void PrintItem(const Item& item);       //傳遞常數引用

如果按值傳遞它,則函數可以接收單獨的副本。 如果是一個小int,沒有問題,但是如果是一個字串,並且是一個有多個成員的對象,複製可能就沒有必要了。

Item&是原件的別名。如果在函數內修改它,原來的也會被修改。 const Item&避免複製並防止修改原件。當傳遞只讀物件時通常使用這種形式。

class Monster
{
public:
    int GetHealth() const
    {
        return health;
    }

    const std::string& GetName() const
    {
        return name;
    }

private:
    int health = 100;
    std::string name = "Slime";
};

函數後面的const表示該成員函數不會改變物件的狀態。 const Monster這就是可以呼叫的函數和不能呼叫的函數的差別所在。

細繩const std::string&您可以透過返回來避免複製字串。 但是,重要的是要記住,如果原始物件在返回的引用之前被銷毀,則會變得危險。

指針

指標儲存物件的位址。

Monster monster;
Monster* target = &monster;

if (target != nullptr)
{
    std::cout << target->GetHealth() << '\n';
}

一個正常的物體是.指標指向的物件是->方法。 指針可能不指向任何東西nullptr需要檢查。

這裡重要的一點是,僅僅因為指標指向一個物件並不一定意味著它擁有該物件。 隨著程式碼的成長,無法確定誰會銷毀物件的原始指標變得更加危險。

Monster* target = nullptr;

{
    Monster monster;
    target = &monster;
}

//target 保存著已經被消滅的怪物的地址。

這種類型的指標稱為懸空指標。 即使地址本身仍然存在,該地址處的物件也已達到其生命週期的終點。

引用非常適合在必須指向有效物件的情況下使用。 指標適用於物件可能不存在或可能指向另一個物件的情況。

如果指針必須擁有該對象,那麼最好在原始指針之前考慮智慧指針。