Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;参考复制和分配_C++ - Fatal编程技术网

C++ C++;参考复制和分配

C++ C++;参考复制和分配,c++,C++,关于下面的代码,我有几个问题 #include <iostream> using namespace std; class A { public: A & add(A & b); }; A & A::add(A & z) { A * a = new A(); A & b = *a; cout << "Inside add, address of a: " << &a <&

关于下面的代码,我有几个问题

#include <iostream>

using namespace std;

class A
{
public:
 A &  add(A & b);
};

A &  A::add(A & z)
{
    A * a = new A();
    A & b = *a;
    cout << "Inside add, address of a: " << &a << endl;
    cout << "Inside add, address of b: " << &b << endl;
    cout << "Inside add, address of z: " << &z << endl;
    A aa;
    cout << "Inside, add, address of aa: " << &aa << endl;
    return aa;
}


int main()
{

    A *a = new A();
    cout << "Original a: " << a << endl;
    A & b = a->add(*a);
    cout << "b: " << &b <<  endl;
    return 0;
}
#包括
使用名称空间std;
甲级
{
公众:
A&D(A&b);
};
A&A::添加(A&z)
{
A*A=新的A();
A&b=*A;

coutA1:您使用
a*a=new a()
创建了一个新的*a。main中的
a
a::add
中的
a
不同。main中的
a
由变量
z
引用

A2:否,您在堆上创建了
a
,因此它将一直持续到您对该变量调用
delete


A3:取消引用不会更改存储在指针中的内存位置,它只会获取存储在该位置的值。引用更像是一个别名。因此
&b
就像对Q1说
(*A)

,我知道main()中的对象与函数add()中的对象不同。我的问题是,如果我传递对函数的引用,则会传递正确的对象,但在函数中,如果我尝试创建对现有对象的引用,则会获得不同的对象,因此,在函数add()中,a和b的内存地址不同。对于Q2,我更改了代码以显示正在返回函数堆栈上的对象。从内存地址可以看出,堆栈上的对象超出了函数的范围。您对Q2的更改现在是未定义的行为。它在某些情况下可能有效,但决不能保证