17

C++ では、次の違いは何ですか。

 void func(MyType&); // declaration

 //...
 MyType * ptr;

 func(*ptr); // compiler doesnt give error

 func(ptr); // compiler gives error i thought & represents memory address so 
            // this statement should correct as ptr is only a pointer
            // or address of some real var.
4

1 に答える 1

30

単項接頭演算子&をオブジェクトに適用すると、オブジェクトのアドレスが得られます: &obj宣言しようとしている変数に型修飾子を適用すると、変数の型が
参照に変更されます。&int&

同じことが*:に当てはまります。宣言しようとしている変数の型修飾子 として使用すると、型がポインターになるように変更されます: 。*ptr
*int*

同様に、宣言されている変数に適用された型修飾子[]は、変数の型を配列に変更しますが、配列型のオブジェクトに適用された二項中置演算子[]は、配列のサブオブジェクトの 1 つにアクセスします。


型修飾子が、宣言されている型ではなく、宣言されている変数に適用されるのは役に立ちません。たとえば、これ

int *p, **pp, i, a[10], &r = i; 

intポインター、 へのポインターへのポインターint、バニラint、 10 の配列int、およびint参照を定義します。(後者は、初期化されていない参照を持つことができないため、すぐに初期化されます。)型修飾子は、宣言された変数の型ではなく、型を変更する宣言された変数に構文的に属することに注意してください。それにもかかわらず、型修飾子 (*および&)は変数の型を変更します。
ただし、次の場合、 with pi、およびaは既に宣言されている変数と見なされます。

*pp = &i;
a[0] = i;

*&は単項接頭演算子であり、逆参照ppして のアドレスを生成しi、一方、配列[]の最初のオブジェクトを生成します。inta

C と C++ が型修飾子の周りの空白を気にしないという事実と、それらを配置する際に異なる陣営につながったという事実は、実際には物事を簡単にするものではありません。 型修飾子を型の近くに配置する人もいます。彼らは、それが型を変更するので、そこに行くべきだと主張しています:

int* ptr;

欠点は、複数のオブジェクトを宣言するときに混乱することです。これ

int* a, b;

aへのポインタであると定義されていますがint、であると定義されていbますint。それが、一部の人々が書くことを好む理由です

int *ptr;
int *a, *b;

同じステートメントで複数のオブジェクトを宣言しないことをお勧めします。コードを読みやすくする IMO。また、どちらの規則も自由に選択できます。


さらに複雑なことに、型修飾子単項前置演算子 &andに加えて、「ビット単位の AND」と「乗算」を意味する二項中置演算子and*もあります。さらに侮辱的なことに、C++ では、ユーザー定義型のこれらの演算子の単項プレフィックスバイナリ インフィックスバリアント (およびバイナリ インフィックス) の両方をオーバーロードし、それらのセマンティクスに関して完全に自由にすることができます。 &* []

于 2010-07-28T07:22:29.900 に答える