【发布时间】:2015-08-24 05:23:59
【问题描述】:
我一直认为引用在功能上与指针相同,只是语法更友好,还有一些其他细微差别(引用不能分配给 null,不能重新分配)。
但是今天看到这段代码,不明白为什么是正确的:
有一个简单的结构,Color3B。我们像这样在堆栈上创建一个:
Color3B color(255,0,0);
还有一个类,它的一个实例变量是Color3B类型的。
class Node{
private:
Color3B _color;
public:
void setColor(const Color3B& color){
_color = color;
}
};
用法:
void someFunction(){
Color3B color(255,0,0);
_someNode->setColor(color);
}
我认为颜色在超出范围时会被破坏:当 someFunction 结束时。但是 setColor 获取在堆栈上创建的东西的内存地址,并将其存储。但是没有问题,当我访问 Node 的 _color 时,它始终存在并且具有正确的值。
我在这里错过了什么?
【问题讨论】:
-
_color和color不指的是相同的内存,因此代码是有效的。 -
您可以将参数的地址与成员的地址进行比较,发现它们不同,并得出结论它们不是同一个对象。使用指针,您的代码看起来像
void setColor(const Color3B* c) { _color = *c; } ... _someNode->setColor(&color);。您是否希望_color在通话后无效?
标签: c++ memory-management reference stack instance-variables