我正在研究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。
如果这是正确的,我该如何表达或解释选项 1?似乎在堆栈内存中创建了同一个对象,计算机为该对象命名为“t2”,但我不清楚这个option1 与option2有何不同strong> 因为变量名和引用有些混淆。
此外,交替切换选项,我可以看到在每种情况下对象都是在不同的内存位置创建的。 (例如,option1 的对象是在 0x7fff5fbff828 中创建的,而 or option2 是在 0x7fff5fbff820 中)
你能解释一下吗
1.变量名(选项1)和引用(选项2)有什么区别。
2.选项 1 和 2 的工作方式有何不同。
3.为什么在这两种情况下都在不同的内存位置创建对象。
预先感谢您的帮助!
最佳答案
const TestClass t2 = TestClass(100); //option1
const TestClass &t2 = TestClass(100); //option2
选项 1:
调用TestClass的拷贝构造函数,传入在“=”右边创建的临时对象。复制省略消除了不必要的对象复制(参见下面的 Piotrs 评论)。
选项 2:
您创建了 1 个临时对象,它绑定(bind)到引用。
- what's the difference between a variable name(option1) and reference(option2).
编辑: 我以前不知道这一点,但实际上选项 1 中没有第二次分配(感谢 Piotr),这是由于复制省略,它指的是一种编译器优化技术,可以消除不必要的对象复制。
用你的话来说,“变量名”是一 block 包含数据的内存。从某种意义上说,引用就像一个指针,它指向另一个“变量名”,但它必须被初始化,并且永远不会为空。
- how things work differently in option 1 and 2.
正如其他人所说,选项 1 是静态类型,而选项 2 可以指向派生(来自 TestClass)对象的实例。
- why objects are created in different memory location in either cases.
尽管是“相同的”TestObjects(100),但它们是单独的实例,因此在不同的内存(地址)中
关于c++ - 变量引用和名称之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214480/