おそらく明らかな質問です。
私が持っている場合:
void print(string input)
{
cout << input << endl;
}
どうやってそれを呼び出すのですか:
print("Yo!");
Std :: stringの代わりにchar *を渡すと文句を言います。通話中にそれを型キャストする方法はありますか?の代わりに:
string send = "Yo!";
print(send);
ありがとう。
_const std::string&
_をとる関数を書くことができます:
_void print(const std::string& input)
{
cout << input << endl;
}
_
または_const char*
_:
_void print(const char* input)
{
cout << input << endl;
}
_
どちらの方法でも、次のように呼び出すことができます。
_print("Hello World!\n"); // A temporary is made
std::string someString = //...
print(someString); // No temporary is made
_
2番目のバージョンでは、_std::string
_ sに対してc_str()
を呼び出す必要があります。
_print("Hello World!\n"); // No temporary is made
std::string someString = //...
print(someString.c_str()); // No temporary is made
_
Const char *をとるstd :: stringのコンストラクターがあるため、print( "yo!")を呼び出すことができるはずです。これらの単一引数コンストラクターは、引数からクラス型への暗黙的な変換を定義します(コンストラクターが明示的に宣言されている場合を除き、std :: stringの場合はそうではありません)。このコードを実際にコンパイルしようとしましたか?
_void print(std::string input)
{
cout << input << endl;
}
int main()
{
print("yo");
}
_
GCCではうまくコンパイルされます。ただし、このvoid print(std::string& input)
のようにprintを宣言した場合、非const参照を一時にバインドできないため、コンパイルに失敗します(文字列は「yo」から構築された一時になります)
まあ、_std::string
_はクラス、_const char *
_はポインターです。これらは2つの異なるものです。 string
からポインターへは簡単に取得できます(通常、返されるポインターが含まれているため)が、他の方法では、タイプ_std::string
_のオブジェクトを作成する必要があります。
私の推奨事項:定数文字列を受け取り、それらを変更しない関数は、引数として常に_const char *
_を取る必要があります。そうすれば、(暗黙のc_str()
を介して)_std::string
_と同様に文字列リテラルでも常に機能します。
print(string ("Yo!"));
(一時的な)std::string
オブジェクト。
明らかな方法は、このような関数を呼び出すことです
print(string("Yo!"));
関数がby-valueではなくconst std::string&
を受け入れるようにします。これはコピーを回避するだけでなく、関数に文字列を受け入れるときにalwaysが望ましいだけでなく、コンパイラがstd::string
から一時的なchar[]
を構築できるようにしますそれを与えて再。 :)
Const char *としてキャストするだけです。 print((const char *) "Yo!")は正常に動作します。