2012-02-16 18 views
2

これは初歩的なことですが、C++については何も知りません。行うには、それが必要である:C++、文字列、およびポインタ

コードの同じブロックの後半でSTRを参照するために
string *str = getNextRequest(); 

ではなく

string str = getNextRequest(); 

?もしそうなら、どのようなタイプのエラーが発生するでしょうか?

+4

* former *によって生成されたエラーは構文エラーです。 – dasblinkenlight

+0

最初に:文字列* str = getNextRequest(); – triclosan

+0

私は 'string * str'を意味すると思います – Adrian

答えて

10

getNextRequestの戻り値の型に完全に依存。

文字列は、それらが宣言されている範囲全体で使用して再利用することができます。彼らは、本質的に可変のC文字列と一部取り扱いの情報が含まれている、ヘルパーメソッドなど

あなたは、非常に安全に、から文字列を返すことができますコンパイラは関数をコピーしたり、必要に応じて移動したりします。その文字列(ここではstr)は、通常、範囲外の地方などの使用について心配することなく使用できます。

文字列へのポインタが必要な場合がありますが、outパラメータとして使用している場合を除き、これらはまれであり、デザインの奇妙さを示す傾向があります。

0

あなたが使用するのは、getNextRequest()が返すものによって異なります。 string *を返した場合は、最初の行を使用して、stringを返し、2番目の行を使用します。だから、

getNextRequestの宣言は次のようにある場合:次に

string getNextRequest(); 

string str = getNextRequest(); 

が正しいです。宣言は次のようにある場合:

string *getNextRequest(); 

次に、あなたは

string *str = getNextRequest(); 

または

string str = *getNextRequest(); 
+1

最初は' string * str'に変更する必要があります。 –

+0

@MikeSeymour良いキャッチ。気づかなかった – Lou

0
string str = getNextRequest(); 

で行くことができgetNextRequestによって返さstringのコピーを作成します。 strの内容を変更し、これらの変更がgetNextRequestによって返された文字列内にあることを望む場合は、ポインタまたは参照を返す必要があります。

string& getNextRequest() 

など、それを使用します:これはあなたが望むものである場合、あなたのようにgetNextRequestを定義する必要があります

string& str = getNextRequest(); 
0

文字列str * = getNextRequest();

構文エラー

だろう。しかし、あなたの元の質問に答えるために@dasblinkenlight、で述べたように、それが必要なのか?一般的に、必要がない限り、ポインタは使用しないでください。

特にSTLの場合。 STLはポインタとともに使用するように設計されておらず、ダイナミックなメモリ管理を行います。正当な理由がない限り、vector<int>*またはstring*ではなく、常にvector<int> vstring sを使用する必要があります。

0

おそらく、この関数のgetNextRequest()に関する情報を少し用意する必要があります。これ、どこから来たの?としょうかん? API?目的?

関数の戻り値の型が文字列*(strへのポインタ)の場合、文字列は「ヒープ」に割り当てられています。つまり、文字列を参照するコードブロックは関係ありません。ポインタを維持する限り、ポインタにアクセスすることができます。

関数の戻り値の型が単純に文字列(ポインタではない)の場合、strのアドレスではなく値を返します。本質的に、文字列を新しい変数に "コピー"します。この場合、変数はスタックに割り当てられ、コードブロックのスコープ内にあるときにのみ変数を参照することができます。

関連する問題