質問
一部のクラス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
}
- C * a = new C();今、それはのポインタを作成しています
タイプC
新しいキーワードを使用してメモリ....
- 次の声明は コンストラクターロジック。 C * b(a); //何をしますか?
- 最初と3番目のステートメントは 同等。 C * b = a; //ありますか 違い?
最初のものはCの新しいインスタンスを作成し、そのアドレスをaに入れます。
2番目は、関数へのポインタ宣言です。このポインターは、タイプaの引数を取る任意の関数を指すことができ、タイプCのオブジェクトへのポインターを返します。
3番目のものは、タイプCのオブジェクトへのポインターbを宣言し、aで初期化します。