首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用placement new在构造函数中调用构造函数

使用placement new在构造函数中调用构造函数
EN

Stack Overflow用户
提问于 2012-07-19 02:41:20
回答 5查看 747关注 0票数 4

这些天都在苦苦挣扎。

问题出在构造函数调用上。

我写了一段代码,比如:

代码语言:javascript
复制
#include <iostream>
using namespace std;

class Foo
{

  private: int _n;

  public:

  Foo() { Foo(5);}

  Foo(int n) {_n=n; cout << n << endl; }

};

int main()
{
   Foo* foo = new Foo();
   return 0;

}

当我使用默认构造函数在外部构造Foo对象时:

代码语言:javascript
复制
Foo* f = new Foo();

我假设变量_n是5,然而,它不是。

这在Java中是可以的,但在c++中就不行。

此外,在Visual C++ 6sp6中,

代码语言:javascript
复制
Foo() {this->Foo(5);}

很管用。

但是,这个表达式被gcc/g++ 4拒绝了。

最后,我找到了解决方案。

只需将默认构造函数更改为

代码语言:javascript
复制
Foo() {Foo(5);}

转到

代码语言:javascript
复制
Foo() { new (this) Foo(5); }

解决了问题。

括号中的"this“是做什么的?

EN

回答 5

Stack Overflow用户

发布于 2012-07-19 02:50:10

(this)所做的是在this所指向的位置创建一个全新的Foo对象(这称为放置新对象)。您应该只在charunsigned char的数组中使用它,而不应该在其他地方使用(而且几乎永远不会在其他地方使用)。由于您是在this已经开始构建的位置构建Foo,所以您所做的是未定义的行为,并且如果您有基类,则会到处泄漏资源。从历史上看,通常的做法只是将初始化移到私有函数中。

代码语言:javascript
复制
class Foo {
public:    
  Foo() { init(5);}    
  Foo(int n) {init(n);}
private: 
  int _n;
  void init(int n) {
    _n=n;
  };
}

在C++11中,构造函数应该能够使用这种语法相互调用,但我还不知道哪些编译器支持它。According to Apache,有GCC 4.7和Clang 3.0支持,但还不支持英特尔C++和VC++。

代码语言:javascript
复制
class Foo {
public:    
  Foo() : Foo(5) {}
  Foo(int n) {_n=n;}
private: 
  int _n;
}

Foo() { Foo(5);}开始的代码开始构造this,然后使用参数5在堆栈上创建一个全新的Foo对象,然后销毁它,然后将其视为完全构造的对象,而不初始化它自己的任何值。这就是为什么它编译并运行,但似乎没有做任何事情的原因。

票数 4
EN

Stack Overflow用户

发布于 2012-07-19 02:49:15

在C++11中,您可以使用委托构造函数来指定:

代码语言:javascript
复制
Foo() : Foo(5) { }
票数 3
EN

Stack Overflow用户

发布于 2012-07-19 02:50:23

括号中的(this)意味着新运算符将使用this的地址作为初始化类的地址。

这是非常危险的:您在当前对象的构造函数中,并且在相同的内存空间上调用新的构造函数。想象一下,如果你从另一个类继承会发生什么!

至于你的问题,你不能从构造函数中调用另一个重载的构造函数。典型的解决方案是有一个初始化类的方法:

代码语言:javascript
复制
class Foo
{
  int _n;
public:
  Foo() { init(5); }
  Foo( int i) { init(i); }
  void init(int i) { _n = i; }
};

我在这里遇到了完全相同的问题:Yet another C++ Object initialization interrogation;请随意查看解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11548186

复制
相关文章

相似问题

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