2017-10-03 4 views
0

私はScott Myers Effective C++を使用しています。本文に次のように表示されます。 doSomething()はタイプB bObjectの引数を必要とするためデフォルトのコンストラクタを使用した明示的キャスト

enter image description here

私は難易度の有効な構文の文doSomething(B(28));

で何が起こっているかを理解したのですがどのように正確に、B(28)の外に作成されたクラスBの目的です。また

、次のようにclass Bの完全な定義があると仮定:doSomething(B(28));

void doSomething(B bObject){ 
    bObject.b = 1; 
} 

b部材がアクセスされる方法:

また
class B{ 
    int b; 
public: 
    explicit B(int x = 0, bool b = true); 
} 

doSomething()をこのように定義されていると仮定?つまり、どのオブジェクトがメンバ変数bにアクセスしていますか?

+2

'class_name(parameters)'は、指定された 'parameters'を使って' class_name'の一時オブジェクトを作成しますか? – NathanOliver

+1

テンポラリ( 'B(28)')は 'doSomething'スコープの間、オブジェクトを作成してbObjectに割り当てます。その後、オブジェクトは破壊されます – Amadeus

答えて

1

Bは、intパラメータをとる有効なコンストラクタを持つクラスです。つまり、Bはintを渡すときにB自身を構築する方法を知っています。

28は、intの有効な表現です。

B(28)intをとるコンストラクタを使用して 'B'クラスをインスタンス化する方法です。

もう少し明確にするために、 'B'のコンストラクタはintとboolをとりますが、どちらのパラメータも「オプション」です。これはintパラメータでは「= 0」、 boolパラメータに「true」を設定します。

パラメータはオプションであるため、Bはパラメータを指定しないで構築できます。この場合、x = 0およびb = trueで構成されます。また、あなたの例のように、指定されたintパラメーターで構築することもできます。あなたの例では、x = 28、b = trueです。両方のパラメーターを指定して構築することもできます。例えばB(8、偽)。ただし、boolパラメータのみを指定することはできません。たとえば、B(false)は機能しません。オプションのパラメータを入力するときにパラメータをスキップする方法はありません。 B(、false)は無効です...

したがって、B(28)はx = 28のBオブジェクトを作成します。

ここで、関数DoSomethingは 'B'オブジェクトを渡すことを想定しています。 B(28)は 'B'オブジェクトの有効な構成であるため、DoSomethingのパラメータリストを満たします。

お電話:

DoSomething(B(28)); 

A 'B' オブジェクトを構築し、引数としてのdoSomethingに渡されます。関数の内部

は、Bは、「bObject」と呼ばれる関数のシグネチャ理由:

DoSomething(B bObject)... 

この関数シグネチャが渡されるタイプ「B」のようなものを望んでいる、そしてそれはと呼ぶことにします関数内のbObject。したがって

bObject.b = 1; 

を構築し、関数に渡されたBクラスの「B」のメンバーに1の値を割り当て。

おそらく、これはやや紛らわしい理由は、DoSomethingがBクラスのbメンバの設定を完了し、関数が終了すると、Bクラスはもはや存在しないため、DoSomething関数を終了して証明する方法はありませんbメンバーが変更されたことを示します。

したがって、私が知る限り、一時的なオブジェクトを関数に渡して変更し、それを元に戻すことはやや役に立たないことです。

実際に説明しようとしているように見えるのは、コンストラクタで '明示的'の意義です。この例は、暗黙的な引数の変換などを除外して、明示的なコンストラクタに注目しています。

関連する問題