我一直以为引用在功能上与指针相同,它们只是有一个更友好的语法,还有一些其他的小差别(引用不能分配给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);
}
我认为当颜色超出范围时会破坏颜色:当某些功能结束时。但是setColor获取在堆栈上创建的东西的内存地址,并存储它。但是没有问题,当我访问Node的_color时,它始终存在且具有正确的值。
我在这里缺少什么?
答案 0 :(得分:3)
_color = color;
获取color
的值副本,因此color
最终超出范围无关紧要。
如果成员变量_color
本身是引用,则会出现问题。
答案 1 :(得分:0)
LineItemSerial.Cache.SetValueExt(myLS , "UsrFrame1", "xyz");
LineItemSerial.Cache.SetValueExt(myLS , "UsrFrame2 ", "zzz");
LineItemSerial.Cache.SetStatus(myLS , PXEntryStatus.Modified);
LineItemSerial.Cache.Update(myLS);
LineItemSerial.Cache.IsDirty = true;
让我们看看这里发生了什么:
void someFunction(){
Color3B color(255,0,0); // (1)
_someNode->setColor(color);// (2)
} // (5)
void setColor(const Color3B& color){ // (2)(3)
_color = color; // (4)
}
color
setColor
现在是color
color
的值复制到color
(作业),因为_color
不是参考_color
被销毁答案 2 :(得分:0)
如果_color
是参考,那么您认为应该发生的错误。
class Node{
private:
const Color3B& _color;
public:
void setColor(const Color3B& color){
_color = color;
}
};
此代码会产生您期望的错误。现在,您实际上会将堆栈中颜色的地址保存到Node
,并在someFunction()
结束时将其销毁。但是你不这样做。您的Node
有自己的Color3B
对象,而不是对它的引用。因此代码_color = color
实际上执行从someFunction()
中的颜色到Node
对象中的颜色的副本。现在,即使原始颜色被破坏,Node
中的颜色仍然存在。
如果您使用指针编写setColor()
,则代码的等效内容为:
void setColor(const Color3B* color){
_color = *color;
}
因为引用不是变量的地址而是别名。所以上面代码中的color
(如果它是一个引用)代表它的值,而不是地址。要获得地址,您必须写&color
。