C++変数宣言時のコンストラクタについて

このQ&Aのポイント
  • C++変数宣言時のコンストラクタについて理解してみましょう。
  • C++では変数宣言時にクラスのコンストラクタが呼ばれる仕組みがあります。
  • 引数有りのコンストラクタを呼ぶ方法についても考えてみましょう。
回答を見る
  • ベストアンサー

C++変数宣言時のコンストラクタについて

Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは > 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? Java と同じく、何らかのコンストラクタを定義してしまうとデフォルトコンストラクタは作られません。 > また、デフォルトコンストラクタが出来ていなかった場合、 > Hoge hoge; > というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは > 出来るのでしょうか? Hoge hoge(10); という具合に呼べます。 http://msdn.microsoft.com/ja-jp/library/s16xw1a8.aspx あと、C++ では(引数なし)コンストラクタだけではなく、コピーコンストラクタ、デストラクタ、および代入演算子も定義しなければデフォルトのものが生成されるので注意してください。 http://docs.oracle.com/cd/E19205-01/820-1213/bkaht/index.html http://tercel-tech.hatenablog.com/entry/2012/11/03/003302

関連する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;」のような宣言と代入を行うことは、代入をコンストラクタを用いて行うこととどのような違いがあるのでしょうか?また、どちらが推奨されるのでしょうか?

  • 親クラスのコンストラクタは? 引数付きコンストラクタは?

    VisualBasic.NETです。 あるクラスを継承したクラスからインスタンスを作成したときに、派生クラスのコンストラクタは呼び出されると思うのですが、基本クラスのコンストラクタはどうなるのでしょうか? JAVAのように、super() で呼び出す必要があるのでしょうか? 自動で呼び出されるのでしょうか? それとも、そもそも呼び出せないのでしょうか? また、引数の個数が違うコンストラクタは、同じクラス内に設定できるのでしょうか? JAVAのコードを移植しようと考えているのですが、出来るのかどうかが分からずに悩んでいます。 ご存じの方、よろしくお願いします。

  • クラスがメンバーとしてクラスを持つ時の宣言について

    自作クラスMainClassがMyClassというクラスをメンバー変数として持つ場合、宣言時に引数をいくつか持つコンストラクタを呼び出そうとすると構文エラーとなります。 class MyClass { public: MyClass(int, int); } class MainClass { private: MyClass myclass(10,10); } このような宣言はできないのでしょうか。 引数なしのコンストラクタは呼び出せているようです。

  • クラスを配列で確保する場合のコンストラクタへの引数の渡し方

    例えばコンストラクタのオーバーロードで以下のようなクラスを宣言したとします。 class testClass{ public: testClass(void){ num = 10; } testClass(int num1,int num2){ num = num1 + num2; } int num; }; オブジェクトとして宣言する場合 testClass obj(10,10); と定義とすれば、testClass(int num1,int num2)の方が適用されobj.num = 20となり、問題ありませんが、ここでobjを複数定義したい場合、obj[10]と定義すると上手く引数を渡す事ができません。 以下のような形で宣言するという手もありますが testClass obj[2] = {testClass(2,2),testClass(2,2)}; 例えば定数NUMと定義しておき、 testClass obj[NUM]; という形で宣言したい場合、どのようにすればよいでしょうか? よろしくお願いします。

  • c# 配列変数の宣言について

    c#の配列変数の宣言についてですが、 以下の2つの宣言は同じことなのでしょうか。 (1)int[] num = {1,2,3}; (2)int[] num = new int{1,2,3}; 本では(2)のような定義していますが何かルールのようなものがあるのでしょうか。 宜しくお願いします。

  • C++のクラスの利用宣言について

    Borland C++ 5.5.1 for Win32 を使って開発をしています。 クラスの宣言方法について悩んでいます。 状況は次のような感じです。 1.コンストラクタに引数を必ず指定しなければならない クラスが存在。(クラス hoge(string) ) 2.「1.」のクラスを呼び出す ------------------------------- 1: switch (flg) 2:  case 0: 3:   hoge hg("test"); 4:   hg.method1(); 5:   break; 6: } ------------------------------- 上記ソースをコンパイル。すると、 行3 case でローカル変数の初期化がとばされた というエラーになります。 しかたがないので以下のように ソースを修正 ------------------------------- 1: hoge hg; 2: 3: switch (flg) 4:  case 0: 5:   hg("test"); 6:   hg.method1(); 7:   break; 8: } ------------------------------- すると、 行1 hoge::hoge() に一致するものが見つからない というエラーになります。 デフォルトコンストラクタを無効にしているので 仕方ないのかと思い、さらに次のようにしてみました。 ------------------------------- 1: hoge *hg; 2: 3: switch (flg) 4:  case 0: 5:   *hg = hoge("test"); 6:   hg->method1(); 7:   break; 8: } ------------------------------- これで、コンパイルは無事通るようなのですが、 実行時にアプリケーションエラーとなってしまいます。 なにやら、クラスの宣言の仕方が間違って いるような気がするのですが、 一般的にどのように宣言するのかわかりません。 どなたか、教えてください。

  • C++の規格

    デフォルト引数は、関数の宣言部、または定義部の いずれかで与えることができると思うのですが、 VC6sp6で +-------------------------------+ class tmp{ int m_x; public: tmp(int x); }; tmp::tmp(int x=0) : m_x(x){} +-------------------------------+ とすると、「デフォルトコンストラクタがない」と、エラーになります。 (因みにBCC551ではコンパイルできます) また、デフォルトコンストラクタを追加すると、 「オーバーロード関数の呼び出しが解決できない」というエラーになります。 前者のエラーの原因は、コンパイラ エラー C2512を読めば理解できますし、 後者の言うことも納得できます。 ここで疑問です。 (1) デフォルト引数はどこで与えることができるか? (2) デフォルトコンストラクタは、ユーザ定義コンストラクタがある場合は、 必ず用意しなければならないか?(エラーc2512) C++の規格ではどうなっているのでしょうか? よろしくお願いします。

  • コンストラクタ内で定義したインスタンスの呼び出し。

    以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンスehogeを set_vのところで使おうとすると”ehogeを解決できません” というエラーが出てしまいます。 初歩的な質問ですが、 ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか? public class sample { void sample(){ hoge ehoge=new hoge(); } public static void main(String[] args) { } void set_v(){ int num=ehoge.value(); } } class hoge{ int value=1; }

    • ベストアンサー
    • Java
  • 計算してからコンストラクタに渡すか

    メインクラスAからクラスBをインスタンス化します。 Bクラスが持つ変数Cには1~100までの数値がランダムで入ります。 ここで、AクラスであらかじめCを計算しておいてBクラスのコンストラクタに引数として渡すのか それともAクラスではBクラスを生成するだけで、 Bクラスのコンストラクタ内で変数Cの値を計算するのか どちらが良いでしょうか? お教えください。

    • ベストアンサー
    • Java

専門家に質問してみよう