0

在下面的示例中,为什么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;
} 
4

2 回答 2

3
A other = person;

调用copy c-tor,由编译器隐式定义,而不是operator =.

12.8/4

如果类定义没有显式声明复制构造函数,则隐式声明。因此,对于类定义

struct X {
X(const X&, int);
};

复制构造函数是隐式声明的。

12.8/8

类 X 的隐式定义的复制构造函数执行其子对象的成员复制。复制的顺序与用户定义的构造函数中基和成员的初始化顺序相同(见 12.6.2)。每个子对象都以适合其类型的方式复制:

— 如果子对象是类类型,则使用该类的复制构造函数;

— 如果子对象是一个数组,则以适合元素类型的方式复制每个元素;

— 如果子对象是标量类型,则使用内置赋值运算符。

引用来自 C++03 标准。

于 2012-08-28T01:53:41.880 回答
2

因为您没有使用赋值运算符,所以您使用的是复制构造。

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);

只要T是可复制或可移动的。

于 2012-08-28T01:54:24.310 回答