嘿伙计们我有这个代码 的 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行)复制必须激活构造函数,但它没有...为什么?
答案 0 :(得分:1)
根据C ++标准(12.8复制和移动类对象)
31当满足某些条件时,允许省略实施 复制/移动类对象的构造,即使是构造函数 选择用于复制/移动操作和/或析构函数 对象有副作用。在这种情况下,实施处理 省略的复制/移动操作的源和目标只是两个 引用同一个对象的不同方式,以及对它的破坏 该对象发生在两个对象的后期 如果没有优化就会被摧毁.124这个省略 复制/移动操作,称为复制省略,是允许的 以下情况(可以合并以消除多个 份):
- 在具有类返回类型的函数的return语句中,何时 表达式是非易失性自动对象的名称(其他 比函数或catch子句参数)具有相同的cvunqualified 键入函数返回类型,复制/移动操作即可 通过直接构造自动对象省略 函数的返回值
- 当一个尚未绑定到引用的临时类对象时 (12.2)将被复制/移动到具有相同的类对象 cv-unqualified类型,可以省略复制/移动操作 将临时对象直接构造到目标中 省略了复制/移动
考虑到在任何情况下都应该有复制构造函数。例如,如果您将复制构造函数声明为私有,则编译器将发出错误(如果它不是MS VS编译器:))