为什么分配对象的地址在C++;? 在此C++示例中,类 c>代码>具有默认构造函数、复制构造函数和赋值运算符: struct C { C(); C(const C& c); C& operator=(const C& c); };

为什么分配对象的地址在C++;? 在此C++示例中,类 c>代码>具有默认构造函数、复制构造函数和赋值运算符: struct C { C(); C(const C& c); C& operator=(const C& c); };,c++,class,memory-address,assignment-operator,copy-assignment,C++,Class,Memory Address,Assignment Operator,Copy Assignment,实现如下,其中包含一些用于跟踪对象的输出。我在下面的main程序的注释行中添加了一些示例地址 #include "C.h" #include <iostream> using namespace std; C::C() { cout << "Standard constructor." << endl; } C::C(const C& c) { cout << "Copy

实现如下,其中包含一些用于跟踪对象的输出。我在下面的
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
(请参见(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
}
intmain()
{
C;/(1)
库特
我希望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
上复制它,它在堆栈上的位置与以前相同


您可能看不到
c=foo()的复制构造函数消息的原因;
是因为调用了某个对象,这就是我认为
c
会保存匿名对象的原因,而不仅仅是它的副本。

复制赋值操作符不会创建新对象,它通常会更改已创建对象的数据成员。对象的内存具有自动或静态sto按照此声明创建对象时,会分配愤怒持续时间

C c;

C++中的对象永远不会更改地址。


赋值运算符与任何其他方法都没有什么不同,通常它只是遍历所有成员变量并向它们赋值,这些值是从其他对象的相应成员复制的。

c
是一个局部变量。它的地址不会更改。
=
只复制内部内容。您不能更改地址stack上声明的变量的s变量是一个带有名称的框;它在其中存储一个值。
c
就是这样一个框;
foo()
创建并返回一个匿名框。赋值操作符
=
不会影响框,它会将内容从一个框复制到另一个框。我认为对象的地址是不可更改的,无论它是在堆栈上分配的还是在免费存储中分配的。值得注意的是,如果您来自C#或Java,很容易产生这种混淆。