首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么没有调用复制构造函数?

为什么没有调用复制构造函数?
EN

Stack Overflow用户
提问于 2010-09-08 07:34:55
回答 2查看 6.6K关注 0票数 20
代码语言:javascript
复制
class MyClass
{
public:
  ~MyClass() {}
  MyClass():x(0), y(0){} //default constructor
  MyClass(int X, int Y):x(X), y(Y){} //user-defined constructor
  MyClass(const MyClass& tempObj):x(tempObj.x), y(tempObj.y){} //copy constructor

private:
  int x; int y;
};

int main()
{
  MyClass MyObj(MyClass(1, 2)); //user-defined constructor was called.
  MyClass MyObj2(MyObj); //copy constructor was called.
}

在第一种情况下,当MyClass(1, 2)调用用户定义的构造函数并返回一个对象时,我期望MyObj调用复制构造函数。为什么它不需要调用MyClass的第二个实例的复制构造函数

EN

回答 2

Stack Overflow用户

发布于 2010-09-08 07:37:40

在这种情况下,复制构造函数may be elided

MyClass MyObj = MyClass( 1, 2 );也是如此。

并使用

代码语言:javascript
复制
std::string str = "hello";

这样的代码有一个隐式的构造函数调用来将char*转换为std::string

代码语言:javascript
复制
std::string str = std::string( "hello" ); // same, written more verbosely

如果没有复制省略,通过赋值语法进行的“简单”字符串初始化将导致额外的深层复制。该语法与您已有的语法相当于99%。

票数 19
EN

Stack Overflow用户

发布于 2010-09-08 08:01:59

除了Potatoswatter和Andrey T.所说的,请注意,您可以说服大多数编译器不要省略构造函数。通常,GCC会为您提供-fno-elide-constructors和MSVC以及/Od,这应该会为您提供所需的输出。下面是一些代码:

代码语言:javascript
复制
#include <iostream>

#define LOG() std::cout << __PRETTY_FUNCTION__ << std::endl // change to __FUNCSIG__ on MSVC > 2003

class MyClass
{
public:
  ~MyClass() { LOG(); }
  MyClass():x(0), y(0){LOG(); } //default constructor
  MyClass(int X, int Y):x(X), y(Y){LOG(); } //user-defined constructor
  MyClass(const MyClass& tempObj):x(tempObj.x), y(tempObj.y){LOG(); } //copy constructor

private:
int x; int y;
};

int main()
{
 MyClass MyObj(MyClass(1, 2)); //User-defined constructor was called.
 MyClass MyObj2(MyObj); //Copy constructor was called.
}

在MingW32上使用GCC 4.5.0编译:

代码语言:javascript
复制
 g++ -Wall -pedantic -ansi -pedantic tmp.cpp -o tmp -fno-elide-constructors

输出:

代码语言:javascript
复制
$ tmp.exe
MyClass::MyClass(int, int)
MyClass::MyClass(const MyClass&)
MyClass::~MyClass()
MyClass::MyClass(const MyClass&)
MyClass::~MyClass()
MyClass::~MyClass()
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3663506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档