質問

一部のクラス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 = new C();
C* b(a);  

bは、aと同じ値が割り当てられたCオブジェクトへのポインタです。ただし、

#include "somefile.h"
C* b(a);  

bをa型のオブジェクトを受け取り、Cへのポインターを返す関数として定義することも簡単にできます。

標準では、さまざまな種類の初期化が8.5であり、これら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;

まず、「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
}
  1. C * a = new C();今、それはのポインタを作成しています タイプC 新しいキーワードを使用してメモリ....
  2. 次の声明は コンストラクターロジック。 C * b(a); //何をしますか?
  3. 最初と3番目のステートメントは 同等。 C * b = a; //ありますか 違い?

最初のものはCの新しいインスタンスを作成し、そのアドレスをaに入れます。

2番目は、関数へのポインタ宣言です。このポインターは、タイプaの引数を取る任意の関数を指すことができ、タイプCのオブジェクトへのポインターを返します。

3番目のものは、タイプCのオブジェクトへのポインターbを宣言し、aで初期化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top