【发布时间】:2012-11-03 23:18:15
【问题描述】:
我正在研究c++的引用,现在我对变量名和引用之间的区别感到很困惑。测试代码如下:
class TestClass{
private:
int num;
public:
TestClass(int n):num(n){
cout<<this<<" : init of : " <<this->num<<endl;
}
TestClass(const TestClass& t):num(t.num){
cout<<this<<" : copyInit of : " <<this->num<<endl;
}
};
int main(int argc, const char * argv[]){
TestClass t = *(new TestClass(55)); //just to test copy initialization
const TestClass t2 = TestClass(100); //option1
const TestClass &t2 = TestClass(100); //option2
}
所以现在我有两个制作对象的选项,它们是互斥的。
在我的理解中,如果我使用options2,编译器会在栈内存中创建一个临时对象并将引用值返回给t2。
如果这是正确的,我该如何描述或解释 option1?似乎在堆栈内存中创建了相同的对象,并且计算机为该对象命名为“t2”,但我不清楚这个 option1 与 option2 有何不同strong> 因为变量和引用的名称有些混乱。
此外,交替切换选项,我可以看到在每种情况下对象都是在不同的内存位置创建的。 (例如option1的对象是在0x7fff5fbff828创建的,那个or option2是在0x7fff5fbff820)
请解释一下
1.变量名(option1)和引用(option2)有什么区别。
2.选项 1 和 2 的工作方式有何不同。
3.为什么在这两种情况下都在不同的内存位置创建对象。
提前感谢您的帮助!
【问题讨论】:
-
我会尝试回答这个问题,但您的第三个问题让我感到困惑......代码是否编译?
-
@LewsTherin 如果重命名第一个选项,它会编译。
-
请注意,在
TestClass t = *(new TestClass(55));中您不再可以delete分配的内存。 -
@Lews Therin 哦,我没有构建包含这两行的代码。我分别测试了每个选项,注释掉另一个。但问题是每次我测试选项 1 时,对象都会在内存点 A 中创建,并使用选项 2 在内存点 B 中创建。
-
@Jesse 非常感谢!我正在测试复制初始化如何与这一行一起工作。
标签: c++ variables pointers reference