• ベストアンサー

初期化リストとコンストラクタでの代入について

class AAA { int a; AAA():a(10) {} }; class AAA { int a; AAA(){a=10;} }; 上記のようにコンストラクタで初期化を行う場合、 初期化リストを使用するのと代入を使用するのでは、 速度の面からいえば優劣はあるのでしょうか? VC++などでは最適化されどちらも同じバイナリが 生成されるということですが、これは本当でしょうか? 参考書籍名などもおしえていただければ助かります。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sire
  • ベストアンサー率62% (22/35)
回答No.1

プログラミング言語C++第3版P299には class Person{ string name; string address; } Person::Person(const string& n, const string& a):name(n) { address = a; } のコードに対して、nameはnのコピーによって初期化されているのに対し、addressは空文字列で初期化されてから、aのコピーを代入されている。 とあります。 初期設定リストを使用しないと、クラスのメンバとしてコンストラクタ以前に初期化されるのに対して、初期設定リストを使用すると、そこでのみ初期化されるということでしょう。ですから厳密に言うと初期設定リストの方が初期化が1回のみになりますので優なんでしょうね。 VC++がすべて初期設定リストで最適化するかどうかは分かりませんが。。

関連するQ&A

  • コンストラクタ

    恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{    Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?

    • ベストアンサー
    • Java
  • クラス中でコンストラクタを使わず変数に代入をする理由は?

    JAVAやJavascript、最近オブジェクト指向的な記述が可能になったphpなどの言語で次のようなクラス定義が可能です。 <JAVAの場合> class A { public int i1 = 1; public int i2; A() { i2 = 2; } } しかし最近覚えたC++では、例の「public int i1 = 1;」のようなクラスのスコープ内で代入を行うことは出来ず、その場所では「public int i2;」のように宣言のみ、代入はコンストラクタで行うようになっています。この場合はなぜ「public int i1 = 1;」はダメなのかと疑問に思っても「そういう仕様だ」と言われれば納得できます(やり方が1つだけなので)。 ではJAVAなどの言語で、例のような場所で「public int i1 = 1;」のような宣言と代入を行うことは、代入をコンストラクタを用いて行うこととどのような違いがあるのでしょうか?また、どちらが推奨されるのでしょうか?

  • デフォルトコンストラクタで分からないことがあります。

    デフォルトコンストラクタ デフォルトコンストラクタで分からないことがあります。 以下のコードです。 > template<class T1, class T2> > struct pair > { > T1 first; // 1つ目の値 > T2 second; // 2つ目の値 > > // デフォルトコンストラクタ > pair() : first( T1() ), second( T2() ){} > > // 引数付きコンストラクタ > pair(const T1& a, const T2& b) : first( a ), second( b ){} > }; このコードの中の pair() : first( T1() ), second( T2() ){} で初期化子による初期化をしていると思うのですが「T1()」と「T2()」は具体的に 何をしているのでしょうか?自分の想像ではfirstとsecondに何か初期化の値を代入して初期化していると思うのですが何でしょうか? なお、その次のコードの意味は分かります。 > pair(const T1& a, const T2& b) : first( a ), second( b ){} これは、引数a,bを持っていてそれぞれfirstにaを代入してsecondにbを代入して初期化しているのですよね。 なお、このコードが掲載されているサイトはここです。 http://www.geocities.jp/ky_webid/cpp/library/011.html

  • コンストラクタとその類似の形について 初心者です。

    コンストラクタについて勉強したばかりのところ、似たような記述に出会い違いが全くわかりません。 プログラム1 class Book { int price; int num = 0; String title; Book(String t, int p) { ...☆ title = t; price = p; } ・      ・       ・ プログラム2 class Cat { String name; String place; int age; void setData(String n, String p, int a) {...★ name = n; place = p; age = a; }      ・      ・      ・ ☆と★の違いがわかりません。どちらも値(変数)を代入してるという点では同じですよね。なぜ★はvoidがつくのに☆はつかないのでしょうか? 本によると☆のほうはコンストラクタで、★はコンストラクタではなくメソッドらしいのですが・・・。使い分けはどういうときするのでしょうか?  よろしくお願いします。

    • ベストアンサー
    • Java
  • コピーコンストラクタが呼び出されていない?

    コピーコンストラクタが呼び出されていない? class myclass { public: int x; myclass(const int& init_); //コンストラクタ myclass(const myclass& init_); //コピーコンストラクタ const myclass operator+(const myclass& rhs); //加算 const myclass& operator=(const myclass& rhs); //代入 }; と定義したクラスを使ってオブジェクトを生成するときに妙な挙動をしています。 myclass mc1(10); myclass mc2 = 20; myclass mc3(mc1 + mc2); //コピーコンストラクタが呼ばれるはず このコードを実行した結果は、mc3(mc1+mc2)では自分で定義したコピーコンストラクタは実行されませんでした。 mc3(mc1 = mc2)と実行すれば、コピーコンストラクタが実行されたのですが、この違いはどこにあるのでしょうか。 そもそも、myclassとmyclass&は全く別のものなのでしょうか?

  • コンストラクタ内で別のコンストラクタは呼べますか?

    こんにちは。 class CFoo {     CFoo( int a ){}            // 1     CFoo( float b ){}           // 2     CFoo( bool c ){}           // 3     CFoo( int a, float b, bool c )    // 4     {     } } ; 上記のようなクラスで 4 番目のコンストラクタが呼ばれた場合に、 a, b, c のパラメータを使って、1、2、3 を呼ぶようなことは可能でしょうか ? もしご存じの方がいらっしゃいましたら教えて頂けないでしょうか。

  • 配列であるメンバのコンストラクタを呼ぶ方法

    C++のクラスについて教えていただけないでしょうか。以下のような場合、 class ClassA {   int A; public:   ClassA(int a): A(a) {} }; class ClassB {   ClassA A; public:   ClassB(): A(10) {} }; class ClassC {   ClassA A[2]; public:   ClassC() {} //配列であるメンバのコンストラクタを呼び出したい }; ClassBがClassAのコンストラクタを呼ぶには上記のような方法で良いと思うのですが、ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼ぶにはどのようにしたら良いのでしょうか。ご教授をお願いします。

  • スーパークラスのコンストラクタの呼び出し

    こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 変数の初期値

    へんてこな質問かもしれません・・・ class Syokika{   public static void main(String args[]){     int[] a = new int[1];     System.out.println(a[0]);   } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?

    • ベストアンサー
    • Java
  • デフォルトコンストラクタについて

    クラスについて、デフォルトコンストラクタについて理解が乏しいのですが、クラスB側で何か細工をすると、クラスAのデフォルトコンストラクタ無しで、エラーなくコンパイルできるのでしょうか? 派生クラスの親のベースクラスのコンストラクタを呼ぶsuper?でOKなのでしょうか? #include "stdafx.h" class A { public: //A(){} // これをコメントアウトにすると // error C2512: 'B' : クラス、構造体、共用体にデフォルト コンストラクタがありません。 A(int x){} ~A(){}; }; class B : A { }; void main(void){ B b; }

専門家に質問してみよう