未在函数中调用复制分配
copy assignament isn't called in function
在我的书(编程原理和实践)中,有一个练习,其中调用函数以查看构造函数和析构函数的工作原理这是使用的类:
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 构造函数。
相关文章:
- 强制复制分配超过移动分配运算符
- 使用不兼容的分配器复制分配无序列图
- 复制分配C++相同类型的 lambda
- C++ - 从移动分配运算符调用复制分配
- 不工作 复制分配运算符
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 复制分配shared_ptr导致分段错误?
- 使用新放置作为复制分配运算符不好吗?
- 未定义 Lambda 复制分配运算符
- 为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除
- 默认移动分配调用析构函数,复制分配不
- 复制构造函数和复制分配操作员
- 为什么完美的转发(全部捕获)不能实现复制分配?
- C 复制分配运算符,用于参考对象变量
- 复制分配操作员定义
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- C 复制分配操作员问题
- 此对象创建期间发生哪些复制/分配操作
- 矢量未正确擦除内容(复制分配运算符的量运行直到崩溃 [BEX])
- 未在函数中调用复制分配