C ++为什么要复制c' tor not called

时间:2015-05-27 19:59:11

标签: c++ constructor copy

嘿伙计们我有这个代码 的 Animal.h:

    /*
 * Animal.h
 *
 *  Created on: May 27, 2015
 *      Author: saif
 */

#ifndef ANIMAL_H_
#define ANIMAL_H_
#include <iostream>
using namespace std;
class Animal {
    int age;
public:
    Animal();
    Animal(const Animal & rhs);
    Animal addTo();
    virtual ~Animal();
};

#endif /* ANIMAL_H_ */

Animal.cpp:

/*
 * Animal.cpp
 *
 *  Created on: May 27, 2015
 *      Author: saif
 */

#include "Animal.h"

Animal::Animal()
:age(0)
{

}

Animal::Animal(const Animal & rhs)
:age(rhs.age)
{
    cout << "copy constructor activated" << endl;
}
Animal Animal::addTo()
{
    Animal ret;
    ret.age = 5;
    return ret;
}
Animal::~Animal() {
    cout << "NO not done, destructing.."<< endl;
}

的main.cpp

#include <iostream>
using namespace std;
#include "Animal.h"
int main() {
    Animal a;
    Animal b = a.addTo();
    cout << "done" << endl;
    return 0;
}

输出:

done
NO not done, destructing..
NO not done, destructing..

预期输出:

    copy constructor activated
    done
    NO not done, destructing..
    NO not done, destructing.

甚至:

    copy constructor activated
    copy constructor activated
    done
    NO not done, destructing..
    NO not done, destructing.

因为我从书籍和其他资源中读取,当我们按值返回函数或通过值赋值函数时,它会调用复制构造函数,因为它会生成临时副本,而且我在主要情况下(第6行)复制必须激活构造函数,但它没有...为什么?

1 个答案:

答案 0 :(得分:1)

根据C ++标准(12.8复制和移动类对象)

  

31当满足某些条件时,允许省略实施   复制/移动类对象的构造,即使是构造函数   选择用于复制/移动操作和/或析构函数   对象有副作用。在这种情况下,实施处理   省略的复制/移动操作的源和目标只是两个   引用同一个对象的不同方式,以及对它的破坏   该对象发生在两个对象的后期   如果没有优化就会被摧毁.124这个省略   复制/移动操作,称为复制省略,是允许的   以下情况(可以合并以消除多个   份):

     

- 在具有类返回类型的函数的return语句中,何时   表达式是非易失性自动对象的名称(其他   比函数或catch子句参数)具有相同的cvunqualified   键入函数返回类型,复制/移动操作即可   通过直接构造自动对象省略   函数的返回值

     

- 当一个尚未绑定到引用的临时类对象时   (12.2)将被复制/移动到具有相同的类对象   cv-unqualified类型,可以省略复制/移动操作   将临时对象直接构造到目标中   省略了复制/移动

考虑到在任何情况下都应该有复制构造函数。例如,如果您将复制构造函数声明为私有,则编译器将发出错误(如果它不是MS VS编译器:))