web-dev-qa-db-ja.com

C ++文字列を渡す

おそらく明らかな質問です。

私が持っている場合:

void print(string input)
{
  cout << input << endl;
}

どうやってそれを呼び出すのですか:

print("Yo!");

Std :: stringの代わりにchar *を渡すと文句を言います。通話中にそれを型キャストする方法はありますか?の代わりに:

string send = "Yo!";
print(send);

ありがとう。

33
Josh

_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
_
48
In silico

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」から構築された一時になります)

7
Davis King

まあ、_std::string_はクラス、_const char *_はポインターです。これらは2つの異なるものです。 stringからポインターへは簡単に取得できます(通常、返されるポインターが含まれているため)が、他の方法では、タイプ_std::string_のオブジェクトを作成する必要があります。

私の推奨事項:定数文字列を受け取り、それらを変更しない関数は、引数として常に_const char *_を取る必要があります。そうすれば、(暗黙のc_str()を介して)_std::string_と同様に文字列リテラルでも常に機能します。

6
EboMike
print(string ("Yo!"));

(一時的な)std::stringオブジェクト。

5
svens

明らかな方法は、このような関数を呼び出すことです

print(string("Yo!"));
4
Fiktik

関数がby-valueではなくconst std::string&を受け入れるようにします。これはコピーを回避するだけでなく、関数に文字列を受け入れるときにalwaysが望ましいだけでなく、コンパイラがstd::stringから一時的なchar[]を構築できるようにしますそれを与えて再。 :)

Const char *としてキャストするだけです。 print((const char *) "Yo!")は正常に動作します。

1
Ron Tackaberry