从 C++ 基础到掌握 — 第 7 集
const、引用和指针之间的区别
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
将对象传递给函数时,必须决定是使用值、引用还是指针。 虽然表面上很相似,但复制和修改的可能性却有很大差异。
价值观和参考
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 保存着已经被消灭的怪物的地址。
这种类型的指针称为悬空指针。 即使地址本身仍然存在,该地址处的对象也已达到其生命周期的终点。
引用非常适合在必须指向有效对象的情况下使用。 指针适用于对象可能不存在或可能指向另一个对象的情况。
如果指针必须拥有该对象,那么最好在原始指针之前考虑智能指针。