未在函数中调用复制分配

copy assignament isn't called in function

本文关键字:复制 分配 调用 函数      更新时间:2023-10-16

在我的书(编程原理和实践)中,有一个练习,其中调用函数以查看构造函数和析构函数的工作原理这是使用的类:

struct X {
    int val;
    void out(const string& s, int nv) { cerr << this << "->" << s << ": " << val << " (" << nv << ")n"; }
    X() { out("X()", 0); val = 0; }                   // default constructor 
    X(int v) { val = v; out("X(int)", v); }
    X(const X& x) { val = x.val; out("X(X&) ", x.val); }     // copy constructor 
    X& operator=(const X& a)           // copy assignment                    
    {
        out("X::operator=()", a.val); val = a.val; return *this;
    }
    ~X() { out("~X()", 0); }
};

这是我不明白的功能:

X copy2(X a) {
 X aa = a; 
 return aa; 
}

这是调用:

loc2 = copy2(loc);       

这是输出:

0018F6B4->X(X&) : 5 (5) 
0018F690->X(X&) : 5 (5)
0018F8D0->X(X&) : 5 (5)
0018F690->~X(): 5 (0)
0018F6B4->~X(): 5 (0)
0018FBA4->X::operator=(): 5 (5)
0018F8D0->~X(): 5 (0)

但应该是这样的吗?

0018F6B4->X(X&) : 5 (5) //here is copied the argument in temp
0018F690->X::operator=(): 5 (5) //here is called copy assignament X aa = a
0018F8D0->X(X&) : 5 (5) //here is copied the return value aa
0018F690->~X(): 5 (0) //here is destroyed aa
0018F6B4->~X(): 5 (0) //here is destroyed temp of argument
0018FBA4->X::operator=(): 5 (5) //copy assignament
0018F8D0->~X(): 5 (0) //destroye the temp of return

还有一个问题,为什么会这样

X& ref_to(X& a) { return a; }
X& r = ref_to(loc);    // call by reference and return   
doesn't print nothing?

copy2函数的

X aa = a;

不是带有赋值的声明:这在C++中不存在。

这是一个带有复制初始化的声明,在 C++03 中,它将始终使用复制构造函数 - 除非编译器优化了复制。

在 C++11 及更高版本中,根据类型和初始值设定项,它可以改用 move 构造函数。