は:オブジェクト* foo(bar)は何をしますか?いくつかのクラスCのため
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
は:オブジェクト* foo(bar)は何をしますか?いくつかのクラスCのため
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
のC * bの(a)およびC * B = Aは等価です。多くの言語と同様に、複数の方法があります。
最初のものは、Cの新しいインスタンスを作成し、そのアドレスをaに入れます。
第2のものは、関数へのポインタ宣言です。このポインタは、a型の引数を取る関数を指すことができ、C型のオブジェクトへのポインタを返します。
3つ目は、C型のオブジェクトへのポインタを宣言し、aで初期化します。
C* a = new C();
C* b(a);
Bに同じ値を割り当てるCオブジェクトへのポインタであることを
1. C * a = new C()は完全にvaldのC++構文です。 2.ハァッ? 3.正しい。 –
はい、それはあなたのコンストラクタのロジックに依存します。もしaをbにコピーしたならば、同じ3つですが、与えられた情報は1と3が完全に同じ場所を指しているようです。 –
どのような方法でも、私はそれを編集し、読む。 –
注意。しかし、我々は同じように簡単にタイプAのオブジェクトを受け取り、そしてC.
標準は8.5初期化の種類を説明へのポインタを返す関数としてBを定義することができる
#include "somefile.h"
C* b(a);
、これらの2つは特に8.5/12の下にある。
C* b(a); //what does it do?
これは直接初期化と呼ばれています。 'b'にクラス型があった場合、コンパイラは 'a'を引数としてCのコンストラクタのオーバーロード解決を行います。ポインタ型の場合、単に 'b'を 'a'で初期化します。
C* b = a; //is there a difference?
標準は、いくつかのケースでは異なるようにこれらを考慮し、上記の構文はコピーの初期化と呼ばれています。 'b'はクラス型ではないため、直接初期化は 'a'の値で初期化されます。 'a'と 'b'が同じクラスタイプの場合、直接初期化が使用されます。
ここで、「b」はクラスタイプであり、「a」は異なるタイプ(クラスまたは非)であり、ルールはわずかに異なります(8.5/14-b1.b3)。したがって、次のコードは:
C b = a;
まず、試みが「」「C」を型に変換させて、その後、この一時的なオブジェクトが「B」を初期化するために使用されます。振り返ってみると
class A {
public:
operator int();
};
class B {
public:
B (int);
};
void foo()
{
A a;
B b1 (a); // Succeeds
B b2 = a; // Fails
}
は混乱をクリアするためにint型を使用している必要があります:あなたは直接初期化が成功してコピーの初期化に障害が発生した状況を持つことができるので、これは重要です。 int a = 5; int * b =&a; はint型*のC(&a); 私は同じ値にこれらが等価であると仮定し、両方のポインタBとCのポイント。 –
それは、このような簡単な質問が非常に多くの誤解応答を生成できることを少し恐ろしいです。 –
彼らは100%じゃありませんこれは、すべての型が同じであるため、この例では同じですが、コンストラクタを変換するクラスの型が含まれている場合は同等ではありません。これを解答で説明するとよいでしょう。 ) –