关于声明语义的一些问题

时间:2013-03-10 21:12:44

标签: c++ semantics

哪些更正确且使用更广泛?实际问题是最后一个,我认为行为会发生变化。

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 个答案:

答案 0 :(得分: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?

答案 1 :(得分:1)

首先,除了分隔符号的程度外,空格在技术上并不重要。

也就是说,通过分析现有的声明,你不会试图理解事物。

您应该从构建声明开始。

在这些结构中,将const放在适用的任何内容之后。

不幸的是,C语言的一般概念是用C ++表示的。因此,如果表达式*p应该产生int,则p的声明将为int *p。现在让我们说,表达式*p应该产生int const,然后声明将是int const *p

在C ++中,重点是类型,因此C ++程序员可能会将其写为

int const* p;

将类型事物与声明的内容的名称分开。

但请记住,空间无关紧要技术上

通过这种从预期用法的外观构造声明的方式,您可以轻松地使用C ++编译器来测试您的声明是否有效,它是否可以编译。

答案 2 :(得分: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 *的引用,我们无法更改指针本身 - 因此无需通过引用传递它。

答案 3 :(得分:0)

int *xint &x被认为更好。为什么? int* x, y似乎是两个指向int的指针,但这是一个指针和一个int。 int *x, *y语法更好一点 - 你可以更好地看到这些是两个指针。

我知道我没有涵盖你问题的第二部分;)