2

私はちょうど興味があります、私はここで何が起こっているのか知りたいです:

class Test
{
char * name;
public:
Test(char * c) : name(c){}
};

1) なぜ機能しないTest(const char * c) : name(c){}のですか? char * nameconstじゃないから?しかし、これはどうですか:

main(){
char * name = "Peter";
}

nameはchar*ですが、"Peter"constはchar*ですよね?では、その初期化はどのように機能するのでしょうか。

2) Test(char * c) : name(c){ c[0] = 'a'; }- これによりプログラムがクラッシュします。なんで?

無知で申し訳ありません。

4

5 に答える 5

7

うまくいかないのはなぜTest(const char * c) : name(c) {} ですか?char * nameそうじゃないからconst

正しい。

この初期化はどのように機能しますか:char * name = "Peter";

C++ 文字列リテラルは型です(キーワード1がないため、Cだけではなく、 herechar const[]を参照してください)。この代入は C++ では非推奨と見なされますが、Cとの後方互換性のために2はまだ許可されています。char[]const

Test(char * c) : name(c) { c[0] = 'a'; }プログラムをクラッシュさせます。なんで?

初期化するときに何に渡しTestますか?文字列リテラルまたは不正なポインターを渡す場合は、許可されていc[0] = 'a'ません。


1古いバージョンの C プログラミング言語 (1978 年に発行された K&R の本に記載されている) には、constキーワードが含まれていませんでした。それ以来、ANSI Cconstは C++ からのアイデアを借りてきました。
2 C++03 では有効ですが、C++11 では有効ではなくなりました。

于 2013-09-23T16:08:55.937 に答える
2

まず第一に、これは C++ ですstd::string。. 使用を真剣に検討する必要があります。

あなたの質問に関して"Peter"は、文字リテラルであるため、変更できず、確かに書き込むことはできません。あなたはできる:

  • メンバー変数を持ち、次のように宣言して、あなたconst char *がやっているように初期化しますname(c)"Peter"const
  • char *メンバー変数を持ち、コンテンツをコピーします (たとえばname(strdup(c))、デストラクタで解放することを忘れないでください。
于 2013-09-23T16:10:22.983 に答える
0
  1. 正しい。

  2. "Peter" は文字列リテラルであるため、通常は読み取り専用のメモリ ロケーションに格納されます (実際には、使用しているデバイスの種類によって異なります)。文字列リテラルを変更しようとしたときに何が起こるかは未定義です (ただし、変更すべきではないと推測できます)。

std::stringとにかく使うべきです。

于 2013-09-23T16:13:29.437 に答える
-2

1a) 右

1b)"Peter"ではありません。ただしconst char*char*変更することはできません。constその理由は、言語に存在する以前の時代との互換性のためです。多くのコードがすでに存在し、char* p = "fred";そのコードを一夜にして違法にすることはできませんでした。

2)そのコンストラクターの使用方法を確認せずに、なぜプログラムがクラッシュするのかはわかりません。

于 2013-09-23T16:09:22.237 に答える