簡體   English   中英

C ++ 03中初始化成員的另一種方法

[英]Alternative way to initialization members in 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. 如果我從條件代碼刪除條件正常工作。 為什么在GLOBAL_BAR構造時沒有任何循環調用ctor?
  4. 您是否知道另一種替代構造,它可以替代通過初始化列表初始化成員的標准方法?
  1. 是的(看不出來為什么)
  2. 在這種情況下不需要
  3. 在這種情況下,一次構造該結構,然后將所有結構字段都復制到自己中-因此什么也沒有發生
  4. 至少我想到了memset()。 我仍然會硬着頭皮,只使用初始化列表。 這些事情是黑客和不良的編程習慣,當您調試一些神秘的錯誤時可能會打擊您

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM