ゼロ単列c++primer(13)から
2301 ワード
(1)クラスの動作は1つの値に似ており,それはそれ自身の状態もあるべきであることを意味し,動作像ポインタのクラスは状態を共有する.(2)クラス価値のある行動を提供するために,クラス管理のリソースに対して,各オブジェクトに独自のコピーを持たなければならない.(3)コピー制御メンバとは異なり,swapは必要ではない.しかし,リソースが割り当てられたクラスに対してswapを定義することは重要な最適化手段である可能性がある.(4)コピーと交換を用いた付与演算子は自動的に非常に安全であり,自己付与を正しく処理できる.(5)コピー付与演算子は、通常、コピーコンストラクタおよび構造解析関数でも行う作業を実行する.この場合、共通の作業はprivateのツール関数で完了する必要があります.(6)クラスvectorのクラスStrVecを定義する.
(7)stringの移動構造関数がどのように動作するかについての詳細、および実装に関する他の詳細は、現在開示されていない.(8)新しい規格の最も主要な特性は、コピー対象ではなく移動可能な能力である.(9)標準ライブラリコンテナ、string、shared_ptrクラスは、移動もコピーもサポートします.IOクラスとunique_ptrクラスは移動可能でコピーできません.(10)左の値は永続的で、右の値は短く、右の値は破棄されるオブジェクトを参照します.したがって、右値参照にバインドされたオブジェクトから「盗む」ステータスを取得できます.(11)変数は左の値であるため,この変数が右の値参照タイプであっても,右の値参照を直接変数にバインドすることはできない.(12)移動元オブジェクトを破棄したり、新しい値を付与したりすることができますが、移動元オブジェクトの値は使用できません.(13)移動操作がリソースを「盗む」ため、通常、リソースは割り当てられません.したがって、移動操作は通常、異常を放出しません.(14)異常を投げ出さない移動構造関数と移動付与演算子はnoexceptとしてマークしなければならない.(15)移動操作後、移動後のソースオブジェクトは、効果的に解析可能な状態を維持しなければならないが、ユーザはその値を仮定することはできない.(16)コンパイラは、クラスに独自のバージョンのコピー・メンバーが定義されておらず、すべてのデータ・メンバーが構造を移動または移動できる場合にのみ、移動構造関数または移動付与演算子を合成します.(17)移動構造関数または移動付与演算子を定義するクラスは、独自のコピー操作も定義しなければならない.それ以外の場合、これらのメンバーはデフォルトで定義されて削除されます.(18)クラスに移動コンストラクタなしで使用可能なコピーコンストラクタがある場合、そのオブジェクトはコピーコンストラクタによって「移動」される.コピー代入演算子は、移動代入演算子と同様です.
class StrVec{
public :
StrVec : elements(nullptr) , first_free(nullptr) , cap(nullptr) { }
StrVec(const StrVec&);
~StrVec();
void push_back(const std::string&);
size_t size() const {return first_free - elements;}
size_t capacity() const {return cap - elements;}
std::string *begin() const {return elements;}
std::string *end() const {renturn first_free;}
private :
static std::allocator<std::string> alloc;
void chk_n_alloc() {if (size() == capacity()) reallocate();}
std::pair<std::string*, std::string*> alloc_n_copy(const std::string* , const std::string*);
void free();
void reallocate();
std::string *elements;
std::string *first_free;
std::string *cap;
};
(7)stringの移動構造関数がどのように動作するかについての詳細、および実装に関する他の詳細は、現在開示されていない.(8)新しい規格の最も主要な特性は、コピー対象ではなく移動可能な能力である.(9)標準ライブラリコンテナ、string、shared_ptrクラスは、移動もコピーもサポートします.IOクラスとunique_ptrクラスは移動可能でコピーできません.(10)左の値は永続的で、右の値は短く、右の値は破棄されるオブジェクトを参照します.したがって、右値参照にバインドされたオブジェクトから「盗む」ステータスを取得できます.(11)変数は左の値であるため,この変数が右の値参照タイプであっても,右の値参照を直接変数にバインドすることはできない.(12)移動元オブジェクトを破棄したり、新しい値を付与したりすることができますが、移動元オブジェクトの値は使用できません.(13)移動操作がリソースを「盗む」ため、通常、リソースは割り当てられません.したがって、移動操作は通常、異常を放出しません.(14)異常を投げ出さない移動構造関数と移動付与演算子はnoexceptとしてマークしなければならない.(15)移動操作後、移動後のソースオブジェクトは、効果的に解析可能な状態を維持しなければならないが、ユーザはその値を仮定することはできない.(16)コンパイラは、クラスに独自のバージョンのコピー・メンバーが定義されておらず、すべてのデータ・メンバーが構造を移動または移動できる場合にのみ、移動構造関数または移動付与演算子を合成します.(17)移動構造関数または移動付与演算子を定義するクラスは、独自のコピー操作も定義しなければならない.それ以外の場合、これらのメンバーはデフォルトで定義されて削除されます.(18)クラスに移動コンストラクタなしで使用可能なコピーコンストラクタがある場合、そのオブジェクトはコピーコンストラクタによって「移動」される.コピー代入演算子は、移動代入演算子と同様です.