13

$ 12.8 / 2-'クラスXの非テンプレートコンストラクターは、最初のパラメーターがタイプX&、const X&、volatile X&、またはconst volatile X&であり、他のパラメーターがないか、他のすべてのパラメーターにデフォルトがある場合、コピーコンストラクターです。引数(8.3.6).106) '

これまでのところ、追加のデフォルトパラメータを使用してコピーコンストラクタを宣言する必要がある状況の例はありません。

複数のパラメーターを使用するこのようなコピーコンストラクターのリアルタイムの使用法を知りたい。

4

4 に答える 4

11

古いstd::basic_stringものにも1つあります:

basic_string(const basic_string& s, 
         size_type pos = 0, size_type n = npos)
于 2010-09-06T03:54:20.217 に答える
10

BDEアロケータ[PDFリンク]はこの癖を使用しました。たとえば、それらのアレイアロケータは次のようになりました。

template <typename T>
class bde::Array {
public:
    Array(bde::Allocator *allocator = 0);
    Array(const Array &rhs, bde::Allocator *allocator = 0);
};
于 2010-09-06T03:08:48.183 に答える
3

とてもかっこいい。コピーコンストラクターにヒントを渡す良い方法のように見えます。これが役立つと思われる状況の例をいくつか示します。

  • データ構造をコピーすると、コピーに追加のデータが入力されます

    追加のパラメーターは、割り当てを最適化するために、間もなく必要になる可能性のある容量を示唆します。デフォルトの容量は、デフォルトの容量または元のデータ構造の容量を使用することを示す番兵の値になります。

  • メンバー値のディープコピーを実行するか、シャローコピーを実行するか

    デフォルトでは、安全のためにディープコピーを実行する場合がありますが、高度な使用法では、浅いコピーを実行しても安全な場合のまれな機会を指定することを利用できます。

  • 逐語的コピーと論理的コピー

    データ構造のコピーコンストラクターが元のデータ構造の内部構造を逐語的にコピーする必要があるかどうか、またはそれを最適化または統合しても安全かどうかをヒントします。たとえば、ヒントは、コピー時にツリーのバランスをとる必要があることを示している可能性があります。

于 2010-09-06T04:36:39.183 に答える
0

ディープコピーを含むクラスの1つに、コピーコンストラクターに複数のパラメーターが必要な状況があります。

基本的に問題は、オブジェクトにポインタを介して追跡する必要のある別のオブジェクトが含まれていることですが、通常のディープコピーでは、ポインタ値のみがコピーされ、新しいオブジェクトの正しいメモリ位置はコピーされません。

通常のコピーコンストラクターを無効にし、2つのパラメーターを持つバリアントを使用することで、オブジェクトを正しくディープコピーできます。

[編集]:私のコードを見ると、他の場所でもいくつかの場所で使用しているので、私よりもさらに一般的であるように思われます。

これは好奇心旺盛な人のためのコードサンプルです(これは単純化されたバージョンであり、実際にはもう少し複雑です)

//----------------------------------------------------------------------------- 
scan_point::scan_point(scan_point const& rhs, simulation* sim_)
: m(rhs.m), sim(sim_)
//----------------------------------------------------------------------------- 
{    

}

-

simulation_(simulation_ const& rhs)
{
    //...
    for(typename ContainerType::const_iterator it = rhs.spContainer->begin(), endIt = rhs.spContainer->end();
        it != endIt; it++)
    {
        spContainer->push_back(new scan_point(*it, this));
    }
}

-

コピー中の苦痛を軽減するために、ディープコピーを可能にするsmart_ptrクラスを使用し、(この場合は具体的に)メンバーを構造体に埋め込んで、コンパイラが他のすべてのメンバーのコピーを自動生成するようにします(短い試みについてはを参照してください)例:https ://stackoverflow.com/questions/469696/what-is-your-most-useful-cc-utility/1609496#1609496 )。

于 2010-09-06T15:54:30.850 に答える