web-dev-qa-db-ja.com

変数などの末尾のアンパサンド(&)

私はC++初心者で、コードのC++構文を理解するのに問題があります。今、私はかなり混乱しています。

class date
{
private:
int day, month, year;
int correct_date( void );
public:
void set_date( int d, int m, int y );
void actual( void );
void print( void );
void inc( void );
friend int date_ok( const date& );
};

「&」文字については、参照、アドレス、論理演算子としての一般的な使用法を理解しています...

たとえば、int * Y =&X

パラメータの最後にある&演算子の意味は何ですか?

friend int date_ok( const date& );

ありがとう

編集:

答えてくれてありがとう。これを正しく理解していれば、変数名は単なるプロトタイプであるため、単純に省略されました。プロトタイプの場合、変数名は必要ありません。オプションです。あれは正しいですか?

ただし、関数の定義には、変数名が必要ですよね?

31
snipor

const date&メソッドによって受け入れられるdate_okは、date_ok型がconst date型の参照を取ることを意味します。ポインタに似ていますが、構文がやや甘い点が異なります。

あなたの例では、int* Y = &xYint *型のポインターにしてから、xのアドレスを割り当てます。 「Yが指すアドレスにあるものは何でも」の値を変更したい場合は、*Y = 200;と言います。

そう、

int x = 300;
int *Y = &x;
*Y = 200; // now x = 200
cout << x; // prints 200

その代わりに、私はリファレンスを使用します

int x = 300;
int& Y = x;
Y = 200; // now x = 200
cout << x; // prints 200
38
Aniket Inge

このコンテキストでは、&は演算子ではありません。タイプの一部です。

特定のタイプTの場合、タイプT&は「Tへの参照」です。

象徴 &実際には C++では3つの意味があります であり、それらの異なる意味を認識することが重要です。

  • 式に適用される場合の「のアドレス」
  • 型の一部である場合の「参照」
  • 2つの数値に適用される場合の「ビット単位のAND」

同様に、*には少なくとも3つの意味があり、それらを理解すると、ポインターと参照が表示されます。 :-)

これを正しく理解していれば、変数名は単なるプロトタイプであるため、そこでは省略されています。プロトタイプの場合、変数名は必要ありません。オプションです。あれは正しいですか?

はい。

ただし、関数の定義には、変数名が必要ですよね?

いいえ。通常は必要になりますが(そうでない場合は何ですか?!)、そうではない状況があります。通常は、オーバーロード関連のトリックを行うためのパラメーターを導入しただけの場合です。

しかし、純粋に技術的に言えば、宣言および/または定義から引数名を省略できます。

ですから、まず第一に、そのコードの作成者が非常に重要な(オプションではありますが)変数名を省略しているという点で、あなたはもっと混乱していると思います。

それを書き直しましょう:

friend int date_ok( const date& check);

変数「check」のタイプはconst date&。これを「定数参照」として関数に渡します。言い換えれば、それは(ポインタマジックを介して)渡したもののエイリアスですが、変更することはできません。

これを行う理由は、大きなオブジェクト(std::vector)それらのコピーを作成せずに関数に。値渡しではコピー操作が発生します。 intの場合、それは重要ではありません(時間はほとんどかかりません)。クラスの場合は、より重要です。経験則では、常にオブジェクトを参照渡しし、変更するつもりがない場合はconst参照渡しします。 (この経験則では、移動のセマンティクスは無視されますが、それについてはまだ知らないと仮定します)。

5
Mark

関数プロトタイプの型の最後で&を使用すると、値渡し(コピー)ではなく、参照渡しが可能になります。このようにして、フレンド関数で日付オブジェクトを変更できます。

friend int date_ok( const date& );

フレンド:クラス定義では、これは関数date_okは、クラスのすべてのパラメーターにアクセスできます。実際には、それはほとんどクラスのメンバーであることを意味するため、メンバー関数としてではなく、このフレンド関数を追加することを検討してください。 (他のgoodの理由がない限り(クラスを外部定義で汚染しないなど)

はいの場合は、静的関数にすることも検討してください。これは、日付オブジェクトクラスの内部へのすべてのアクセスを同じにすることができます。しかし、それはより自然です。

cf.本「101 C++コーディング標準」。静的メンバー関数の定義を優先し、疎結合を優先します。

1

答えてくれてありがとう。これを正しく理解していれば、変数名は単なるプロトタイプであるため、そこで省略されました。プロトタイプの場合、変数名は必要ありません。オプションです。あれは正しいですか?

ただし、関数の定義には、変数名が必要ですよね?

0
snipor