2012-03-07 10 views
1
struct Date { 
    int d, m , y; 

    void init_date(Date& d, int, int, int); 
    void add_year(int n); 
    void add_month(Date& d, int n); 
    void add_day(Date& d, int n); 
} 

Date my_birthday; 
void f() 
{ 
    Date today; 
    today.init(16, 10, 1996); 
    my_birtday.init(30, 12, 1950); 

    Date tomorrow = today; 
    tomorrow.add_day(1); 
    // ... 
} 

質問A:上記のスニペットでは、ありません: 日明日=今日。 構造体日付内に "コピーコンストラクタ"が存在しないという意味で が間違っています。私はそこに知っている "デフォルトのコンストラクタ"自動 コンパイラによって生成されます - しかし、私は正確に何か、または正確にどのようにそれは 作品(それはメンバークラスのデフォルトコンストラクタを呼び出すことができますが、それは doesn ' t initialize:int i;そしてそのようなもの)。コンパイラのデフォルトのコンストラクタがどのように動作するのですか? PG:224 Stroustrup氏 - C++プログラミング言語、3E

質問B:私たちはこのような何かを挿入する必要があります: のconst日&日(constの日& r)を、 が正しいですか?しかし、上記コンストラクタは、1つの引数を渡すことを意味します( 「today」への参照)。だから、どのように "初期化":"明日の日付=今日 "関数呼び出しに変換:明日(今日); 「マジック」はここにありますか?

質問C:オペレータの形式は何ですか、新規ですか? Stroustrupは別の方法でそれを を使用しますが、すべての用途の明確なリストはありません。これまでのところ、私は を見つけることができました: new; 新しいタイプ[サイズ]; 新しいタイプ(サイズ)。新しいタイプ; これはどこにリストされていますか?私は何かを逃したことがありますか?

+4

1つにつき1つの質問をしてください。 –

+0

'これはどこにリストされていますか?/どこにもありますか? 'はい、C++の本にあります。 –

+0

Lookupのデフォルトコンストラクタ/コピーコンストラクタと代入演算子 - コンパイラが参考にこれらを生成します。 – Nim

答えて

1

A.コンパイラは、コピーコンストラクタ、コピー代入演算子およびデストラクタを宣言していない場合は暗黙的に生成し、コンストラクタを宣言しない場合はデフォルトのコンストラクタを暗黙的に生成します。これらのそれぞれは、基本クラスとクラスのメンバーごとに再帰的に動作します。

数字の種類(たとえば、intなど)の既定の初期化では何も行われず、初期化されません。したがって、Date today;の後には、todayのメンバーには不特定の値があります。あなたは、次の定義されただろうかのように

だからあなたのクラスは、働き:

// Destructor 
~Date() {} 

// Default constructor 
Date() {} 

// Copy constructor 
Date(Date const & x) : d(x.d), m(x.m), y(x.y) {} 

// Copy-assignment operator 
Date & operator=(Date const & x) { 
    d = x.d; 
    m = x.m; 
    y = x.y; 
    return *this; 
} 

B.は、上記で回答され - コンパイラはあなたのため、これらの関数を生成しているという意味で何が起こって「魔法」があります。

C.質問タイトルに参照されているものを含め、どんなものでもC++ bookは、newの仕組みを教えてくれます。通常、オブジェクトの存続期間を正確に制御する必要がある場合は、newdeleteが使用されます。具体的なケース:

  • new Type[size]は、それぞれデフォルトで初期化されたsizeオブジェクトの配列を作成します。これは、delete[]を使用して削除する必要があります。
  • new Type(size)は、単一のオブジェクトを作成し、sizeの値で初期化します。これは、deleteを使用して削除する必要があります。
  • new Typeは、default-initialisedという単一のオブジェクトを作成します。繰り返しますが、これはdeleteを使用して削除する必要があります。

いくつかの他の標準的な形式があります。

  • new Type[size]()new Type()は価値の初期化ではなく、オブジェクトをデフォルト・初期化されます。つまり、数値型はゼロに初期化され、ポインタは初期化されずに残されるのではなく、nullへのポインタになります。
  • new (std::nothrow) Typeは、失敗した場合はstd::bad_allocを投げるのではなく、ヌルポインタを与えます。
  • new (pointer) Typeは、メモリを割り当てるのではなく、pointerで指定されたメモリにオブジェクトを作成します。このオブジェクトは削除しないでください。その代わりに、デストラクタ(object->~Type())を呼び出してメモリを解放しないで破壊する必要があります。これはあなたが非常に頻繁に行うことではありません。

独自のフォームを定義することもできますが、それはこの質問の範囲をはるかに超えています。

他のオブジェクトやコードブロックとは無関係にオブジェクトの有効期間を本当に制御する必要がない限り、newは使用しないでください。そうするときには、正しく削除されていることを確認するために、RAII技術(特にスマートポインタ)を使用することをお勧めします。それらを手動で追跡することが困難な場合があります。

+0

cool!どうもありがとう! –

2

)デフォルトのコピーコンストラクタは、シャローコピーを行います。あなたはPODタイプしか持っていないので、それはあなたがそれが動作すると期待どおりに動作するので、正しいでしょう。

B)const Date& Date(const Date& r);が間違っています。 Data::Dateはコンストラクタです。constにすることも、戻り値の型にすることもできません。コピーコンストラクタを実装する場合は、Date(const Date& r)と記述しますが、この場合は必要ありません。

Date tomorrow = today; 

は、コピーコンストラクタが呼び出される

Date tomorrow(today); 

、ない関数と同じです。

C)大きなトピック、googleのnewキーワードについては、十分に文書化されていると確信しています。ダイナミックストレージにメモリを割り当てるには、newを使用します。

関連する問題