在C ++ 03中初始化成员的替代方法

时间:2015-12-06 07:51:54

标签: c++ c++03

今天我向你提出几个问题,但首先让我先简单介绍一下。

在我的作品中,我遇到了包含许多成员的结构。这些结构是可分配和可复制的。通过ctros的初始化列表初始化它是不舒服的。最近我有了这个想法,通过分配该类的全局对象来初始化这些成员,而不是通过初始化列表来完成它。我知道全局对象是由零自动初始化的 我假设非POD结构的全局对象与其成员一起清除 - 请纠正我,如果我错了,请。

我已经编写了示例代码来说明这种情况

#include <iostream>

struct Foo
{
  double x;
  void example() { }
};

struct Bar;
Bar const& Init();

struct Bar
{
  int i;
  double d;
  Foo f;

  Bar()
  {
    if( this != &Init() ) // is it necessary? 
      *this = Init();
  }
};

const Bar GLOBAL_BAR;
Bar const& Init()
{
  return GLOBAL_BAR;
}

void print_bar( const Bar& bar )
{
  std::cout << bar.i << ' ' << bar.d  << ' ' << bar.f.x << "\r\n";
}

int main() 
{
  std::cout << "Global object: ";
  print_bar( GLOBAL_BAR );

  std::cout << "Local object: ";
  Bar bar;
  print_bar( bar );

  std::cout << "Temp objecy: ";
  print_bar( Bar() );

  return 0;
}

我的问题是:

  1. c ++ 03标准意义上的代码是否正确?
  2. 是否需要ctor内的条件?
  3. 如果我从ctor代码中删除条件正常工作。为什么会这样 在GLOBAL_BAR建设时没有任何循环调用ctor?
  4. 你知道另一种可替代的替代建筑吗? 通过初始化列表初始化成员的标准方法?

1 个答案:

答案 0 :(得分:1)

  1. 是(不知道为什么不这样做)
  2. 在这种情况下不需要
  3. 在这种情况下,struct构造一次,所有的struct fiel都被复制到自己身上 - 所以没有任何反应
  4. 至少memset()出现在我的脑海里。我仍然会咬紧牙关,只使用初始化列表。这些东西是黑客和糟糕的编程习惯,可能会在您调试一些神秘的错误后打击你