要理解这一点,您首先需要理解指针和引用。假设您已经知道什么是指针和引用,我将简单地解释您所询问的类型声明语法。
在 C 语言中,据说“声明遵循使用”。这意味着声明变量的语法模仿使用变量:通常在声明中您将有一个基本类型,例如int
or float
后面跟着一些看起来像表达式的东西。例如在int *y
基本类型是int
表达式看起来很相似是*y
。此后,该表达式计算为具有给定基类型的值。
So int *y
意味着稍后的表达式*y
is an int
。这意味着y
必须是一个指向 int 的指针。这同样适用于函数参数,实际上也适用于整个函数声明:
int *foo(int **bar);
在上面的int **bar
says **bar
是一个 int,意味着*bar
是一个指向 int 的指针,并且bar
是一个指向 int 指针的指针。它还声明*foo(arg)
将是一个 int (给定arg
适当的类型),这意味着foo(arg)
结果是一个指向 int 的指针。所以整个函数声明是“foo 是一个函数,它接受一个指向 int 的指针,并返回一个指向 int 的指针。”
C++ 添加了引用的概念,并在此过程中稍微搞乱了 C 风格的声明。因为使用取址运算符获取变量的地址&
必须产生一个指针,C 没有任何用处&
在声明中;int &x
意思是&x
是一个 int,意味着x
是某种类型,获取该类型的地址会产生 int。² 因此,由于未使用此语法,C++ 将其用于完全不同的目的。
In C++ int &x
意思是x
是对 int 的引用。使用变量不涉及任何运算符来“取消引用”引用,因此引用声明符符号与地址运算符冲突并不重要。相同的符号在两种上下文中意味着完全不同的事物,并且永远不需要在允许另一种含义的上下文中使用一种含义。
So char &foo(int &a)
声明一个函数,该函数接受对 int 的引用并返回对 char 的引用。func(&x)
是一个取地址的表达式x
并将其传递给func
.
1. In fact in the original C syntax for declaring functions 'declarations follow use' was even more strictly followed. For example you'd declare a function as int foo(a,b)
and the types of parameters were declared elsewhere, so that the declaration would look exactly like a use, without the extra typenames.
2. Of course int *&x;
could make sense in that *&x
could be an int, but C doesn't actually do that.