c++の技術評論社「ポケットリファレンス」を読んで勉強しています。
参照に関して、不明な点がありましたので、ご教授ねがいたいです。
基本文法のところで、
参照は、関数の仮引数および戻り値でも使用できます。
とあり、以下のコードが例として挙げられています。
const int& square(const int &v){//仮引数と戻り値は参照 static int result=v*v; //静的宣言をせいておかないと、 //戻った後破棄されてしまう。 return result; }
関数の仮引数を参照にすることで、無駄なコピーが発生しません。これは特に大きなオブジェクトを関数へ渡す場合に、コピーによるメモリ消費を抑えられ、コピー処理に時間もかからないため有効です。
参照は、ポインタと違い、一時オブジェクトや定数もconst参照へ渡せます。
Struct S{ int data=0; }; void fr(S&v); void fr(int &v); void fcr(const S&v); void fcr(const int&v); S s; int a=42; fr(s); //オブジェクトを参照で渡す fr(a); //オブジェクトを参照で渡す //fr(S());//エラー。一時オブジェクトを参照で渡すことはできない。 //fr(42);//エラー。整数リテラルを参照で渡すことはできない。 fcr(S());//一時オブジェクトをconst参照で渡すことが可能。 fcr(42);//整数リテラルをconst参照で渡すことが可能。 void fp(S*v); void fp(int*v); //fp(&S());//エラー。一時オブジェクトのアドレスは取得できない。 //fp(&42);//エラー。整数リテラルのアドレスは取得できない。
とありました。。
①まず
const int& square(const int &v)
仮引数で、参照を使うのはわかりますが、int &squareと参照にしているのは、
戻り値==「int型関数square」という意味であっていますでしょうか。
②そして
void fr(S&v); void fr(int &v); void fcr(const S&v); void fcr(const int&v);
例えば一番上の場合、クラスSオブジェクト○○を引数にとる関数frを宣言していると思いますが、
この場合のvをなんというのでしょうか。
③そして、下のコードに関して
//fr(S());//エラー。一時オブジェクトを参照で渡すことはできない。 //fr(42);//エラー。整数リテラルを参照で渡すことはできない。 fcr(S());//一時オブジェクトをconst参照で渡すことが可能。 fcr(42);//整数リテラルをconst参照で渡すことが可能。
まず、一時オブジェクトとはなにかがあまり理解できません。
なぜ、一時オブジェクトや整数リテラルを参照で渡すことができないのかが、わかりません。
整数リテラルは、定数とC言語の本を読んだので、
だからconstで渡せることができるのでしょうか。
④↓以下のコードは、整数リテラルにアドレスはないからでしょうか。
void fp(S*v); void fp(int*v); //fp(&S());//エラー。一時オブジェクトのアドレスは取得できない。 //fp(&42);//エラー。整数リテラルのアドレスは取得できない。
以上お願いします(--)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/05 04:46
2019/08/05 04:58
2019/08/05 08:59