← 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 保存着已经被消灭的怪物的地址。

这种类型的指针称为悬空指针。 即使地址本身仍然存在,该地址处的对象也已达到其生命周期的终点。

引用非常适合在必须指向有效对象的情况下使用。 指针适用于对象可能不存在或可能指向另一个对象的情况。

如果指针必须拥有该对象,那么最好在原始指针之前考虑智能指针。