c++ - 变量引用和名称之间的区别

标签 c++ variables pointers reference

我正在研究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”,但我不清楚这个option1option2 因为变量名和引用有些混淆。

此外,交替切换选项,我可以看到在每种情况下对象都是在不同的内存位置创建的。 (例如,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)到引用。

  1. what's the difference between a variable name(option1) and reference(option2).

编辑: 我以前不知道这一点,但实际上选项 1 中没有第二次分配(感谢 Piotr),这是由于复制省略,它指的是一种编译器优化技术,可以消除不必要的对象复制。

用你的话来说,“变量名”是一 block 包含数据的内存。从某种意义上说,引用就像一个指针,它指向另一个“变量名”,但它必须被初始化,并且永远不会为空。

  1. how things work differently in option 1 and 2.

正如其他人所说,选项 1 是静态类型,而选项 2 可以指向派生(来自 TestClass)对象的实例。

  1. why objects are created in different memory location in either cases.

尽管是“相同的”TestObjects(100),但它们是单独的实例,因此在不同的内存(地址)中

关于c++ - 变量引用和名称之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214480/

相关文章:

.net - 在 .NET 和 C++ 中运行进程

c++ - 如何从现有的 vtkPolyData 复制折线的子集?

c - "Incompatible pointer type"qsort 第 4 个参数的编译器警告

c - 为什么仅分配指针的字符串复制函数不起作用?

c++ - 我尝试创建临时对象的方式是否有任何错误

c# - 通过资源文件将本地化应用到 DisplayAttribute

java - 实例变量和构造函数?

bash - 如何设置包含将在 Bash 中更改的其他变量的变量?

c++ - 输出错误。可能的 strncpy 问题?

c++ - 轴对齐线与三角形相交