为什么重载运算符不将主对象设置为值集
Why overloading operator doesn't sets main object to value set
在下面的例子中,为什么other.age
输出88而不是0?
#include <atlstr.h>//CString for non-MFC
class A
{
public:
A() : name("Nobody"), age(0) {}
~A(){};
A( CString name, unsigned age ) : name( name ), age( age ) {}
A& operator=( const A& ref )
{
name = ref.name;
age = 0;
}
CString name;
unsigned int age;
};
int _tmain( int argc, _TCHAR* argv[] )
{
A person( CString("Michael"), 88 );
A other = person;
std::cout << other.name << std::endl << other.age;
}
A other = person;
调用由编译器隐式定义的copy c-tor
,而不是operator =
。
12.8/4
如果类定义没有显式声明复制构造函数,则隐式声明一个复制构造函数。因此,对于类定义
struct X { X(const X&, int); };
复制构造函数是隐式声明的。
12.8/8
类X的隐式定义的复制构造函数执行其子对象的成员复制。这个复制的顺序与用户定义构造中基和成员的初始化顺序相同-tor(见12.6.2)。每个子对象都以适合其类型的方式复制:
--如果子对象属于类类型,则使用该类的复制构造函数;
--如果子对象是一个数组,则会按照适合图元类型的方式复制每个图元;
--如果子对象是标量类型,则使用内置赋值运算符。
报价来自C++03标准。
因为您没有使用赋值运算符,所以您使用的是复制构造。
A other = person;
相当于†:
A other(A(person));
由于您没有明确指定复制构造函数,因此使用默认的复制构造函数。这是一个成员副本,保留88作为age
的值。这使用您的操作员:
A other;
other = person;
†是的,那是一份副本。请注意,在启用优化的情况下,编译器会将其转换为:
A other(person);
通过复制elison。一般来说,这是:
T x = y;
相当于:
T x(T(y));
它将变成这个(优化后):
T x(y);
只要CCD_ 5是可复制的或可移动的。
相关文章:
- 如何在自删除后将对象设置为nullptr
- QT:即使在static_cast后也无法在主窗口中设置对象的位置
- 将对象传递给 Java C++与使用 JNI 逐个设置对象参数
- V8 无法使用名称设置对象模板"console"
- 从函数返回 libconfig 类设置对象引用
- 当设置对象等于另一个函数的返回值时,为什么要调用移动构造函数/分配
- 在功能中设置对象变量
- 如何根据道具名称动态设置对象的属性?
- 如何传递unique_ptr来设置对象的成员变量?
- C++ 仅设置对象指向 nullptr 的指针
- 如何在涡轮C 图形中设置对象的自定义边框宽度
- 无法在 cocos2dx 中为 CCDictionary 设置对象
- 位掩码:通过集合方法设置对象的不同状态
- C++:如何从成员中设置对象
- 使用运算符设置对象>>
- 如何设置对象数据成员与这个c++与这个
- Q设置:移动/更改现有Q设置对象的范围/位置
- 在第一个可用索引处设置对象到C数组
- 如何设置对象转换,属性
- 在 C# 等C++中设置对象 = null 的替代方案是什么