-1

これらのうち、より正しく、より広く使用されているのはどれですか? 実際の質問は最後の質問です。動作が変わると思います。

int *test; //for this, it is probably both?
int* test;


int& test;
int &test;

実際の質問:

const int test;
int const test;


const int* test;
int* const test; //<-- I guess this also have a different meaning if I consider the last one?


const int& test;
int const& test; //also, considering last one, any difference?


const int*& test;
int* const& test; //<-- this is the correct one for stating "I won't modify the passed object, but I may modify the one pointed"? I have had problems with the other one sometimes, does the other one has some other meaning?
const int* const& test; //<-- another meaning?

また、この件に関する視覚的な「あいまいさ」をご存知でしたら、ご指摘いただければ幸いです。

4

4 に答える 4

2

これらを除いて、すべての例で各行に同じセマンティクスが与えられています。

//test is a pointer to a const int.
//test may be modified, but the int
//that it points to may not (through this
//access path).
const int* test;

//test is a const pointer to int.
//test may not be modified, but the
//int that it points to may.
int* const test;



//test is a reference to a pointer to a const int.
//The referenced pointer may be modified, but
//the int that that pointer points to may not be.
const int*& test;
//test is a reference to a const pointer to 
//int. The referenced pointer may not be modified
//but the int may be.
int* const& test; //<-- this is the correct one for stating
                  //    "I won't modify the passed object,
                  //     but I may modify the one pointed"?
                  //       Yes
                  //    I have had problems with the other one sometimes,
                  //    does the other one has some other meaning?
                  //       Yes
//test is a reference to a const pointer to const int.
//The referenced pointer may not be modified, nor may
//the int that it points to.
const int* const& test; //<-- another meaning?
于 2013-03-10T21:19:58.390 に答える
1

まず、空白は、記号を区切る程度を除いて、技術的には重要ではありません。

とは言うものの、既存の宣言を分析することによって物事を理解しようとすることはそれほど遠くありません。

宣言を作成することから始める必要があります。

そして、それらの構造では、constそれが適用されるものの後に配置します。

残念ながらC++に保持されているCの一般的な考え方は、宣言は使用法のようなものであるということです。したがって、たとえば、式*pがを生成する必要があるint場合、の宣言はpになりますint *p。ここで、代わりに式*pがを生成する必要があるとしましょう。int constその場合、宣言はになりますint const *p

C ++では型に重点が置かれているため、C++プログラマーは次のように記述します。

int const* p;

宣言されているものの名​​前からタイプのものを分離します。

ただし、スペースは技術的に重要ではないことを忘れないでください。

そして、意図された使用法の外観から宣言を構築するこの方法を使用すると、C ++コンパイラを使用して、宣言が機能すること、コンパイルされることを簡単にテストできます。

于 2013-03-10T21:20:17.080 に答える
1

スペースを配置する場所、&または*(または、1つ以上のスペースがある場合は、片側または両側に)まったく違いはありません。の配置はconst違いを生みます。

const int *test;

test指しているものが変更されていないことを意味します。それで:

int b = 42;
*test = 42;
test = &b;

*test = 42;違法ですが、新しいアドレスにテストを割り当てることは有効です。

int * const test;

つまり、test値を変更することはできませんが、それが指すものは次のようになります。

int b = 42;
*test = 42;
test = &b;

現在test = &b;は無効です。

const int& test;
int const& test; //also, considering last one, any difference?

どちらも同じです。constとintは。の同じ側です&

これです:

const int*& test;

int *値を変更できない場所への参照があることを意味します。完全に有効で、次のものを使用できます。

test = &b;

この二つ:

int* const& test
const int* const& test;

int *はそれぞれとへの参照でありconst int *、ポインタ自体を変更することはできません。したがって、参照によってポインタを渡す意味はありません。

于 2013-03-10T21:21:49.370 に答える
0

int *xより優れてint &xいると見なされます。なんで? int* x, yint への 2 つのポインターのように見えますが、これは 1 つのポインターと 1 つの int です。 int *x, *y構文が少し改善されました。これらが 2 つのポインターであることがよくわかります。

私はあなたの質問の2番目の部分をカバーしていないことを知っています;)

于 2013-03-10T21:25:58.727 に答える