Googleオープンソースプロジェクトスタイルガイド
3617 ワード
単一パラメータのコンストラクション関数にC++キーワードexplicitを使用
定義:
一般に、コンストラクション関数に1つのパラメータしかない場合、暗黙的な変換と見なすことができる.例えば、Foo::Foo(string name)を定義すると、Fooオブジェクトをパラメータとする関数に文字列が渡され、構造関数Foo::Foo(string name)が呼び出され、その文字列がFooに変換された一時オブジェクトが呼び出し関数に渡される.便利そうに見えますが、このように変換して新しいオブジェクトを生成したくない場合は、面倒も伴います.コンストラクション関数が呼び出す暗黙的な変換を避けるためにexplicitとして宣言することができる.利点:時宜に合わない変換を避ける.短所:結論なし:
すべての単一パラメータ構造関数は明示的でなければならない.クラス定義では、キーワードexplicitを単一パラメータ構築関数の前に追加します:explicit Foo(string name);
例外:ごく少数の場合、コピー構造関数はexplicitと明記することができる.他のクラスの透明包装器としてのクラスも特例の一つである.同様の例外は注釈で明確に説明すべきである.
以上、Googleオープンソースプロジェクトスタイルガイドの第3節を参照してください.
http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/classes/
元のクラスの単一パラメータ構築関数は,explicitキーワードを用いて表示宣言を行わない場合に,対応するパラメータタイプを自動的に変換して生成することができる.
例:
上記のコードはキーワードexplicitを除去すればコンパイルできます.キーワードexplicitを付けると、表示する呼び出しの単一パラメータの構造関数を示します.
コピーコンストラクタ
Tip
コード内でクラスオブジェクトをコピーする必要がある場合にのみ、コピーコンストラクション関数を使用します.ほとんどの場合は不要ですが、DISALLOW_を使用します.COPY_AND_ASSIGN.
定義:
コピーコンストラクション関数は、1つのオブジェクトを新しいオブジェクトにコピーするときに呼び出される(特にオブジェクトが値を渡すとき).
メリット:
コピーコンストラクタは、コピー対象をより容易にする.STL容器は、全ての内容をコピー可能、付与可能であることを要求する.
欠点:
C++における暗黙的なオブジェクトコピーは多くの性能問題とバグの根源である.コピーコンストラクション関数は、コードの可読性を低下させ、伝達参照よりも伝達値のオブジェクトを追跡することが困難になり、オブジェクトの修正箇所がつかめなくなる.
結論:
ほとんどのクラスはコピー可能である必要はなく、コピー構造関数や付与演算子を再ロードする必要もない.残念なことに、自分から宣言しないと、コンパイラは自動的に生成され、publicになります.
クラスの
private:コピー構造関数と付与操作を追加する空の実装は、宣言のみで定義されていません.これらの空の関数は
private、他のコードが使用しようとすると、コンパイラがエラーを報告します.便宜上、ご利用いただけます
DISALLOW_COPY_AND_ASSIGNマクロ:
にある
class foo:中:
上記のように、ほとんどの場合DISALLOW_を使用する必要があります.COPY_AND_ASSIGNマクロクラスがコピー可能である必要がある場合は、そのクラスのヘッダファイルに原由を説明し、コピー構造関数と付与操作を合理的に定義する必要がある.注意operator=で自己付与値を検出する場合(yospaly注:operator=受信パラメータはそのオブジェクト自体である).
STL容器の値として使用できるように、クラスをコピー可能にする衝動があるかもしれません.ほとんどの類似の場合、本当にすべきことは、オブジェクトのポインタをSTL容器に入れることである.std::tr 1::shared_を使用することも考えられます.ptr.
定義:
一般に、コンストラクション関数に1つのパラメータしかない場合、暗黙的な変換と見なすことができる.例えば、Foo::Foo(string name)を定義すると、Fooオブジェクトをパラメータとする関数に文字列が渡され、構造関数Foo::Foo(string name)が呼び出され、その文字列がFooに変換された一時オブジェクトが呼び出し関数に渡される.便利そうに見えますが、このように変換して新しいオブジェクトを生成したくない場合は、面倒も伴います.コンストラクション関数が呼び出す暗黙的な変換を避けるためにexplicitとして宣言することができる.利点:時宜に合わない変換を避ける.短所:結論なし:
すべての単一パラメータ構造関数は明示的でなければならない.クラス定義では、キーワードexplicitを単一パラメータ構築関数の前に追加します:explicit Foo(string name);
例外:ごく少数の場合、コピー構造関数はexplicitと明記することができる.他のクラスの透明包装器としてのクラスも特例の一つである.同様の例外は注釈で明確に説明すべきである.
以上、Googleオープンソースプロジェクトスタイルガイドの第3節を参照してください.
http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/classes/
元のクラスの単一パラメータ構築関数は,explicitキーワードを用いて表示宣言を行わない場合に,対応するパラメータタイプを自動的に変換して生成することができる.
例:
//explicit
class CSample
{
public:
CSample::CSample(){};
explicit CSample::CSample(int a)
{
m = a;
}
int m;
};
void f(CSample noSample)
{
return;
}
void main()
{
f(1);
return;
}
上記のコードはキーワードexplicitを除去すればコンパイルできます.キーワードexplicitを付けると、表示する呼び出しの単一パラメータの構造関数を示します.
コピーコンストラクタ
Tip
コード内でクラスオブジェクトをコピーする必要がある場合にのみ、コピーコンストラクション関数を使用します.ほとんどの場合は不要ですが、DISALLOW_を使用します.COPY_AND_ASSIGN.
定義:
コピーコンストラクション関数は、1つのオブジェクトを新しいオブジェクトにコピーするときに呼び出される(特にオブジェクトが値を渡すとき).
メリット:
コピーコンストラクタは、コピー対象をより容易にする.STL容器は、全ての内容をコピー可能、付与可能であることを要求する.
欠点:
C++における暗黙的なオブジェクトコピーは多くの性能問題とバグの根源である.コピーコンストラクション関数は、コードの可読性を低下させ、伝達参照よりも伝達値のオブジェクトを追跡することが困難になり、オブジェクトの修正箇所がつかめなくなる.
結論:
ほとんどのクラスはコピー可能である必要はなく、コピー構造関数や付与演算子を再ロードする必要もない.残念なことに、自分から宣言しないと、コンパイラは自動的に生成され、publicになります.
クラスの
private:コピー構造関数と付与操作を追加する空の実装は、宣言のみで定義されていません.これらの空の関数は
private、他のコードが使用しようとすると、コンパイラがエラーを報告します.便宜上、ご利用いただけます
DISALLOW_COPY_AND_ASSIGNマクロ:
// operator=
// private:
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
にある
class foo:中:
class Foo {
public:
Foo(int f);
~Foo();
private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};
上記のように、ほとんどの場合DISALLOW_を使用する必要があります.COPY_AND_ASSIGNマクロクラスがコピー可能である必要がある場合は、そのクラスのヘッダファイルに原由を説明し、コピー構造関数と付与操作を合理的に定義する必要がある.注意operator=で自己付与値を検出する場合(yospaly注:operator=受信パラメータはそのオブジェクト自体である).
STL容器の値として使用できるように、クラスをコピー可能にする衝動があるかもしれません.ほとんどの類似の場合、本当にすべきことは、オブジェクトのポインタをSTL容器に入れることである.std::tr 1::shared_を使用することも考えられます.ptr.