2016-03-25 10 views
2

以下のコードスニペットを参照してください。 メンバ初期化子リスト表記:かっこ対かっこ

class Vector { 
public: 
    Vector(int s) :elem{new double[s]}, sz{s} { } //construct a Vector 
    double& operator[](int i) { return elem[i]; } //element access: subscripting 
    int size() { return sz; } 
private: 
    double* elem; // pointer to the elements 
    int sz; // the number of elements 
}; 

は、ここで私は3行目のメンバー初期化子リスト心配です

、Straustrupは2つの初期化子文 elem{new double[s]}sz{s}からコロンをseperates:C++のStraustrupの Aツアーの17。

質問:なぜこれらの2つのイニシャライザーステートメントを作成するには角括弧({..})を使用しますか?私は括弧付きのイニシャライザーリストを作っているウェブの人々のどこかで見てきました。これも(AFAIK)が法的にelem(new double[s])sz(s)と読むことができるようになりました。では、これら2つの表記法の間に意味の違いがありますか?これらの変数を(イニシャライザリストのコンテキスト内で)初期化できる他の方法はありますか?

+0

中括弧はC++ 11標準では新しく、[* uniform initialization *](https://mbevin.wordpress.com/2012/11/16/uniform-initialization/)と呼ばれるものに使用されています。 。多くの場合、違いはありません。 –

+0

括弧で初期化していますか?つまり 'sz(s)'と 'elem(new double [s])'はどちらの場合でもコンストラクタが呼び出されていますか? – George

+1

'int'も' double * 'もコンストラクタを持たないので、コンストラクタをどのように呼び出すことができます。それは単純に*初期化*です。あなたは期待しません。 'int sz = 5'はコンストラクタを呼び出しますか?初期化リストに 'sz(s)'や 'sz {s}'( 's'が' 5'だった場合)と同じことをしています。 –

答えて

0

形態

Vector(int s) :elem(new double[s]), sz(s) { } 

は、C++のすべてのバージョンで正しいです。

Vector(int s) :elem{new double[s]}, sz{s} { } 

のような中括弧を持つものは、2011年にC++標準に導入され、古い規格では無効です。

あなたが尋ねる文脈では、違いはありません。しかし、2011年の標準にも導入されている他の言語やライブラリの機能は、2番目の形式に依存し、最初の形式では動作しません。

コンストラクタのイニシャライザリストのベースのメンバーを初期化する他の方法はありません。コンストラクタの本体のメンバーに割り当てることは可能ですが、それは初期設定の構文ではありません。

BTW:「ストロストラップ」ではなく「ストロストラップ」です。人々を引用するつもりなら、少なくとも彼らの名前を正しいものにする礼儀をしてください。特に、あなたの名前がよく知られているフォーラムでそれを行うとき。

関連する問題