2017-12-26 9 views
-2

上の明確化が必要:keyここは、私はC++でのコピーコンストラクタは、下記のコードスニペットの観点から呼び出されるだろうというときについての質問持つコピーコンストラクタ

bool do_stuff(int a, int b, char *c, Uid key = 0); 

do_stuff()

にデフォルトの引数であります

Uid:Uid() 
{ 
    memset(data_, 0, UID_LENGTH); 
} 

/// @brief Copy construct a uid 
Uid::Uid(const Uid &id) 
{ 
    memcpy(data_, id.data_, UID_LENGTH); 
} 

/// @brief Copy the contents of ptr as the contents of a new Uid 
Uid::Uid(const u_char* ptr) 
{ 
    memcpy(data_, ptr, UID_LENGTH); 
} 

/// @brief Set the contents of a Uid with provided values 
Uid::Uid(u_int64_t high, u_int64_t low) 
{ 
… 
… 
} 
class Uid { 
... 
... 
private: 
    u_char data_[UID_LENGTH]; 
} 

さて、Uidは、これらのコンストラクタを持っています

do_stuffが3つの引数を指定して呼び出された場合、のオブジェクトを作成するためにUid::Uid(const u_char* ptr)が呼び出されています。 Uid::Uid(const u_char* ptr)が選択されています。プロトタイプへ...

bool do_stuff(int a, int b, char *c, Uid key = (Uid)0); 

を変更

でしょう... Uid::Uid(const Uid &id)が呼び出されることを確認してください?

ありがとうございます!

+1

これは実際にはコピーコンストラクタとはあまり関係ありません。 – juanchopanza

+0

'UID'は' int'を使ってどのように構築されていますか?現時点では 'Uid(char *)'がデフォルト値から呼び出されます。 – user0042

+1

あなたは知っている、私は私の答えを入力し、実現した、私はあなたが解決しようとしている問題が何であるかはわかりません。なぜあなたはデフォルトの引数として0を渡していますか? – StoryTeller

答えて

1

はおそらく

bool do_stuff(int a, int b, char *c, Uid key = Uid{}); 

次の3つの入力引数とdo_stuffを呼び出した場合、デフォルトのコンストラクタが呼び出されます。この方法でやってみたいです。

+0

これは私のために働かなかった。以下のようにコンパイルエラーが発生しました。 42行目はあなたが提案したものと同じです: 'default_constructor.cc:42:error: '{'トークンの前に予期した一次式があります。 default_constructor.cc:42:error:expected ')' before '{'トークン default_constructor.cc :42:error: 'の前にunqualified-idが必要です)' token ' – Maddy

+2

@Maddy - それは 'Uid key = Uid {}'でなければなりません。 – StoryTeller

+1

@Maddy訂正してくれてありがとう。一定。 –

0

コンパイラは、デフォルトのUid引数を作成するときにコピーコンストラクタを削除できます。これを見るには、プログラムを(g ++と仮定して)-fno-elide-constructorsと再コンパイルしてください。

Uid::Uid(char const*)コンストラクタについてあなたは現在、スカラー値をとる何のコンストラクタを持っていないとき、それはまだnullptrとして使用可能であることから、それ0ベストマッチです。

関連する問題