变量末尾的&符号(&)等

sni*_*por 32 c++ reference friend

我是一个C++ noob,我在代码中理解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& );
};
Run Code Online (Sandbox Code Playgroud)

关于'&'字符,我理解它作为参考,地址和逻辑运算符的一般用法......

例如int*Y =&X

参数末尾的&运算符是什么意思?

friend int date_ok( const date& );
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:

谢谢你的回答.如果我已经正确理解了这一点,那么变量名就被省略了,因为它只是一个原型.对于原型我不需要变量名称,它是可选的.那是对的吗?

但是,对于函数的定义我肯定需要变量名,对吧?

Ani*_*nge 39

const date&被方法接受date_ok意味着date_ok采用类型的引用const date.它的工作方式类似于指针,除了语法稍微多一点..含糖

在你的例子中,int* Y = &x创建Y一个类型的指针,int *然后为其分配地址x.当我想改变"无论它在地址指向的地方Y" 的价值时,我说*Y = 200;

所以,

int x = 300;
int *Y = &x;
*Y = 200; // now x = 200
cout << x; // prints 200
Run Code Online (Sandbox Code Playgroud)

相反,现在我使用参考

int x = 300;
int& Y = x;
Y = 200; // now x = 200
cout << x; // prints 200
Run Code Online (Sandbox Code Playgroud)

  • 引用类似于指针,但您应该注释引用不可为空,并且它应该始终“指向”某些东西 (4认同)
  • 参考也不能重新安装。 (4认同)
  • 这实在是太病态了。我可以给自己做一个参考点吗?然后会发生什么? (2认同)

Lig*_*ica 24

在这种情况下,&不是运营商.它是该类型的一部分.

对于任何给定类型T,类型T&是"引用T".

&事实上,符号在C++中有三个含义,识别这些不同的含义很重要.

  • 应用于表达式时的"地址"
  • 部分类型时的"引用"
  • 当应用于两个数字时,"按位AND"

同样,*至少有三个含义,一旦你掌握了这些含义,你就会有指针和参考.:-)

如果我已经正确理解了这一点,那么变量名在那里被省略,因为它只是原型.对于原型我不需要变量名称,它是可选的.那是对的吗?

是.

但是,对于函数的定义我绝对需要变量名,对吧?

不会.虽然你通常会想要它(否则有什么意义?!)在某些情况下你不会这样做,通常当你只引入参数来引入与过载相关的技巧时.

但从技术上讲,您可以根据需要从声明和/或定义中省略参数名称.


Mar*_*ark 5

因此,对于初学者,我认为你可能会更加困惑,因为该代码的作者省略了一些非常重要的东西(尽管是可选的):变量名.

让我们改写:

friend int date_ok( const date& check);
Run Code Online (Sandbox Code Playgroud)

变量'check'的类型是const date&.我们将它作为"常量引用"传递给函数.换句话说,它是我们传入的任何内容的别名(通过指针魔术),但我们无法修改它.

我们这样做的原因是我们可以将大对象(如a std::vector)传递给函数而不复制它们.按值传递会产生复制操作.对于一个int,无关紧要(它几乎没有时间),对于一个类来说,它可能更重要.经验法则是始终通过引用传递对象,并且如果您不打算修改它们,则通过const引用传递它们.(这个经验法则忽略了移动语义,但我假设你还不知道那个).