2017-12-10 7 views
-3

以下の両方のコードを考慮してください。 1つはコンストラクタを使用して値を初期化し、1つは初期化しません。値を初期化するためにコンストラクタを使用する必要があるのはなぜですか?

コード#1

#include<iostream> 
using namespace std; 
class Rectangle 
{ 
public: 
int width; 
int height; 
}; 

int main() 
{ 
Rectangle rect1{3,4}; 
cout<<"Width="<<rect1.width<<endl; 
cout<<"Height="<<rect1.height<<endl; 
return 0; 
} 

私が取得

幅= 3

高さ= 4

コード#2

#include<iostream> 
using namespace std; 
class Rectangle 
{ 
public: 
int width; 
int height; 
Rectangle(int a,int b) 
{ 
width=a; 
height=b; 
} 
}; 
int main() 
{ 
Rectangle rect1(3,4); 
cout<<"Width="<<rect1.width<<endl; 
cout<<"Height="<<rect1.height<<endl; 
return 0; 
} 

として出力を得ます同じ出力。 私の質問は簡単かもしれませんが、なぜ私は両方の場合で同じ出力を得ているときにコンストラクタを使用して迷惑です。 ありがとうございました

+0

コンストラクタを使用する必要はありませんが、値をメンバーに割り当てる以外にも、コンストラクタが便利です。 –

+1

メンバが_public_である限り、メンバがデフォルトコンストラクタブルでない場合はコンストラクタなしで初期化することができます – feareoc

+1

メンバ初期化リストを使用してそれらを構築する必要があります – sp2danny

答えて

0

このような単純なデータ型の場合は問題ありませんが、初期化のメリットがあるか、または初期化が必要な場合もあります。

0

コンストラクタは、いくつかの利点があります:

  • コンストラクタは、公開API(カプセル化)を可能とします。より複雑なクラスでは、呼び出し元が触れてはならない内部データを初期化する必要があります。

    class Foo 
    { 
    public: 
        Foo(int x) { 
         internal_data1 = some_computation1(x); 
         internal_data2 = some_computation2(x); 
        } 
    
        Some_Type3 some_method(int x) 
        { 
         return some_computation3(x, this->internal_data1, this->internal_data2); 
        } 
    private: 
        Some_Type1 internal_data1; 
        Some_Type2 internal_data2; 
    }; 
    
  • などDefaultConstructibleやコピーコンストラクトとしてコンストラクタを含むいくつかのC++の概念があります。コンストラクターは共通のインターフェースを提供するので、汎用コードはさまざまなタイプのオブジェクトを一様な方法でインスタンス化できます。

    template<class T> 
    class Some_Generic 
    { 
    public: 
        Some_Generic(const T& t) 
         : internal_t(t) // Copy constructor used 
        { 
         // do work... 
        } 
    private: 
        T internal_t; 
    }; 
    
0

uはプログラム自体が独自にデフォルトコンストラクタを作成し、コンストラクタを追加し、変数を初期化するので、そのより良いまで表示されませんパラメータ化コンストラクタを追加いけない場合、コンストラクタは、プログラムの中で、すでに作り付けありますクラスの

1

答えはかなり簡単です、コンストラクタを初期化、他のメソッドを割り当てる。

違いはあまりないかもしれませんが、このコードを検討してください。

#include<iostream> 
using namespace std; 
class Sample 
{ 
private: 
    const int num; 
public: 
    void setval(int i) 
    { 
    num = i; 
    } 
    int getVal() 
    { 
    return num; 
    } 
}; 
int main() 
{ 
    Sample s; 
    s.setval(12); 
    cout<<s.getVal(); 
} 

このコードはコンパイルエラーがnumがconstのように宣言されていることを言って、我々はiにそれが等しくすることによりnumに値を代入しようとしている得られます。

constreferencesdeclarationconstructorsinitializingによってそれらを、この仕事をした直後initializedでなければならないので。

また、クラスメンバーを非公開にしてください。これは、優れたプラクティスであり、はるかにオブジェクト指向です。

ですから、上記のコードが必要です。

#include<iostream> 
using namespace std; 
class Sample 
{ 
    private: 
    const int num; 
    public: 
    Sample(int i):num(i){} 

    int getVal() 
    { 
    return num; 
    } 
}; 
int main() 
    { 
    Sample s(12); 
    cout<<s.getVal(); 
    } 
関連する問題