c++ - 为什么在 C++ 中分配对象的地址不会改变?

标签 c++ class memory-address assignment-operator copy-assignment

在这个 C++ 示例中,一个类 C有一个默认构造函数、一个复制构造函数和一个赋值运算符:

struct C {
    C();
    C(const C& c);
    C& operator=(const C& c);
};
实现如下,带有一些用于跟踪对象的输出。我在注释中添加了一些示例地址作为对 main 的引用。下面的程序。
#include "C.h"
#include <iostream>
using namespace std;

C::C() {
    cout << "Standard constructor." << endl;
}

C::C(const C& c) {
    cout << "Copy constructor." << endl;
}

C& C::operator=(const C& c) {
    cout << "Address of reference argument: &c = " << &c << endl;      // F9B4
    cout << "Address of this: &*this =           " << &*this << endl;  // F8D4
    return *this;
}
我将使用返回匿名对象的工厂方法:
C foo() {
    return C();
}
现在在下面的程序中,我创建了一个命名对象 c (参见(1))并创建一个匿名对象(2),我将其分配给 c (3).我预计c然后有赋值后匿名对象的地址。
int main()
{
    C c;  // (1)
    cout << "Address of initial c from main: &c = " << &c << endl;                  // F8D4
    c=foo();  // (2) and (3)
    cout << "Address of initial c from main after assignment: &c = " << &c << endl; // Expected F9B4 but is F8D4
}

最佳答案

C++ 中的对象永远不会改变地址。
赋值运算符与任何其他方法没有什么不同,通常它只是遍历所有成员变量并为它们分配新值,从其他对象的相应成员复制。

关于c++ - 为什么在 C++ 中分配对象的地址不会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64636326/

相关文章:

python - 使用类型和 __slots__ 动态创建类?

c++ - regex_match 期间的 error_stack

c++ - 在C++中查找重复的单词数

c++ - __int128 @ 最小负值的 UDL(用户定义文字)整数溢出

c - 对于缓冲区溢出,使用pthreads时栈地址是多少?

c - 为什么我的程序输出内存地址?

c - 指针如何在 C 中工作 "under the hood"?

c++ - 创建一个向主窗体返回值的模态窗口

c++ - 单个类出现类重定义错误

excel - 如何加载 VBA 库引用并在同一过程中使用它?