-2

C++ には、 class のオブジェクトを受け入れるコンストラクターがありますdescriptor。このクラスは最近サイズが大きくなったため、さらに参照渡しする必要があります。次のctorに参照渡しすると、参照型として宣言されていない場合でも、メンバーは独自のコピーを作成しますか?

    descriptor taskedStats;
public:
    CWorkerThread(int ticketNumber, int threadNumber, descriptor taskedStats) :
        _pPaginatableForm(pPaginatableForm), ticketNumber(ticketNumber)
        , threadNumber(threadNumber), taskedStats(taskedStats) {}

また

    descriptor taskedStats;
public:
    CWorkerThread(int ticketNumber, int threadNumber, descriptor &taskedStats) :
        _pPaginatableForm(pPaginatableForm), ticketNumber(ticketNumber)
        , threadNumber(threadNumber), taskedStats(taskedStats) {}
4

4 に答える 4

2

コンストラクターは何でもコピーを作成します。値渡しの場合、2 つのコピーを作成する可能性がありますが、コンパイラはそのうちの 1 つを最適化する可能性があります。

それでも、より良いオプションは const 参照を受け入れることです。

CWorkerThread(int ticketNumber, int threadNumber, descriptor const& taskedStats) :
   _pPaginatableForm(pPaginatableForm), 
   _ticketNumber(ticketNumber), 
   _threadNumber(threadNumber), 
   _taskedStats(taskedStats) 
{} 

もちろん、C++11 の世界に入ってコンストラクターを移動すると、渡されたコンストラクターが不要になる限り、コピーを作成する必要はまったくありません。現在でもそれを行う方法はありますが、オブジェクト内で特別な「ハッキング」を行うか、スマート ポインターを使用する必要があります。

于 2012-02-06T13:53:26.657 に答える
2

クラスメンバーはオブジェクトとして宣言されているため、オブジェクトです。

コンストラクターに渡された参照は、そのコピー コンストラクターを使用してメンバーを初期化するために使用されます。

const可能な場合は、参照渡しすることをお勧めします。これにより、コンストラクターが引数を変更しないことが明確になり、一時的な値を渡すこともできます。

于 2012-02-06T13:54:35.287 に答える
1

パラメーターを から に変更しdescriptordescriptor&も、メンバー変数taskedStatsは引数 から (コピー コンストラクターを使用して) コピーされますtaskedStats

taskedStatsコピーを回避するには、メンバー変数を aにすることができますがdescriptor&、これは引数がオブジェクトの存続期間中有効でtaskedStats なければならないCWorkerThreadことを意味します (この場合、引数taskedStatsを aconst descriptor&にしないと、一時オブジェクトの受け渡しが妨げられます)。

于 2012-02-06T13:55:34.947 に答える
0

デフォルトまたは暗黙のコンパイラ提供のコピー コンストラクターは、すべてのメンバーの浅いコピーを作成し、次のシグネチャを持ちます。

descriptor(const descriptor &other);

したがって、記述子への参照を渡すことは、(C の用語で) コピーを渡そうとすることと同じです。実際には、どちらも参照によって渡されるだけです。

メンバーが参照型として宣言されている場合、ポインターの場合と同様に、その型は上記の暗黙的なコピー コンストラクターで一致せず、参照割り当てが実行されるため、各オブジェクトでローカル コピーを作成する試みは無効になります。 .

于 2012-02-06T13:45:53.933 に答える