2016-11-17 7 views
-1

私は基本的にconst char *値を文字列に割り当てています。 私は条件をチェックし、文字列をデフォルト値として空に設定しています。文字列にconst char *を割り当てる危険性はありますか?

name=""; 

は、上記のアプローチであるので、私はそれを使用して行われていたら、私は空の文字列を設定し

ClassName:: ClassName(X x, string name):X(x), name(){}

を次のように私は空に文字列を設定していますパラメータ化コンストラクタで

初期化の正しい?

また、const char *を文字列に割り当てる危険性はありますか?

const char* diag; 
string name; 

name= diag; 
+1

'name =" ";'は余計です。 _ "const char *を文字列に割り当てるリスクもありますか?" _ No. –

+0

いいえ、リスクはありません。 'string'はその参照として' const char * 'を使います。 –

+0

std :: string - 具体的には、[string :: operator =](http://www.cplusplus.com/reference/string/string/operator=/)を参照してください。文字列にchar配列を代入すると、それはそのページのように文字列にコピーされます。したがって、char *がnullで終わる限り、安全です。 –

答えて

3

クラスstd::stringchar *の目的のための対応するコンストラクタと代入演算子を有しています。このタイプのオブジェクトに関連して発生する可能性のある唯一の問題は、初期化子がヌルポインタの場合です。

が宣言されている場合は、この

const char *name = ""; 

その後、nameのような変数がNULLポインタではないことを考慮してください。 "'\0'"のconst char[1]の配列の最初の文字へのポインタで、 "空の"文字列リテラルに対応し、静的な記憶期間を持ちます。

あなたは一例

std::strig s(name); 

または

std::string s = name; 

のために書く場合はリテラルの「空」の文字列からコピーするものは何もありませんbecsuse、あなたはタイプstd::stringの空のオブジェクトsを取得します。

したがって、タイプstd::stringのオブジェクトを宣言することは意味がありません。 NULLで終了、それ以外のstd ::文字列があるそこに問題はないが、一般的には、あなたが文字の配列がconst char *によって指されていることを知る必要があり、あなたの例では

std::string s; 
+1

@πάνταῥεῖしかし、規格によれば、イニシャライザはヌルポインタであってはならない。 –

+0

@πάνταῥεῖ:この参照によれば、ヌルポインタは未定義の動作です:http://en.cppreference.com/w/cpp/string/basic_string/basic_string –

+0

@πάνταῥεῖそして何? –

0

を書くのに十分ですコンストラクタは配列の最後を過ぎてメモリを読み続けるでしょう。

関連する問題