cpx*_*cpx 13 c++ assignment-operator
编译器是否为自我赋值生成了赋值操作符?
class T {
int x;
public:
T(int X = 0): x(X) {}
};
int main()
{
T a(1);
a = a;
}
Run Code Online (Sandbox Code Playgroud)
即使班级成员不是指针类型,我是否总是需要防止自我分配?
Joh*_*web 12
编译器是否为自我赋值生成了赋值操作符?
不,不是的.它仅执行成员方式的副本,其中每个成员都由其自己的赋值运算符(也可能是程序员声明的或编译器生成的)复制.
即使班级成员不是指针类型,我是否总是需要防止自我分配?
不,如果您的所有类属性(以及它们的属性)都是POD类型,则不会.
在编写自己的赋值运算符时,如果您希望在未来证明您的类,即使它们不包含任何指针等,也可以检查自我赋值.还要考虑复制和交换习语.
这是一个很容易凭经验检查的方法:
#include <iostream>
struct A {
void operator=(const A& rhs) {
if(this==&rhs) std::cout << "Self-assigned\n";
}
};
struct B {
A a;
};
int main()
{
B b;
b = b;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6478 次 |
| 最近记录: |