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

时间:2014-01-01 00:36:57

标签: 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& );
};

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

例如int * Y =& X

& amp;的含义是什么?参数末尾的运算符?

friend int date_ok( const date& );

由于

修改

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

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

5 个答案:

答案 0 :(得分:38)

方法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

现在我使用引用

int x = 300;
int& Y = x;
Y = 200; // now x = 200
cout << x; // prints 200

答案 1 :(得分:24)

在此上下文中,&不是运营商。它是该类型的一部分。

对于任何给定类型T,类型T&是“对T的引用”。

符号&实际上是has three meanings in C++,重要的是要认识到这些不同的含义。

  • “地址”应用于表达式
  • “引用”时类型的一部分
  • “按位AND”应用于两个数字

同样地,*至少有三个含义,一旦你掌握了这些含义,你就会有指针和引用。 : - )

  

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

  

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

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

但从技术角度说,你可以根据自己的意愿从声明和/或定义中省略参数名称。

答案 2 :(得分:5)

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

让我们改写:

friend int date_ok( const date& check);

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

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

答案 3 :(得分:1)

使用&amp;在函数原型中的类型的末尾允许传递引用,而不是传递值(复制)。 这样您就可以修改友元函数中的日期对象。

friend int date_ok( const date& );

朋友: 在您的类定义中,这意味着您告诉函数date_ok可以访问您班级的所有参数。在契约中,它意味着它几乎是您的类的成员,因此请考虑添加此友元函数而不是成员函数。 (除非你有其他好的原因,比如没有用外国定义污染你的班级)

如果是,还要考虑将其设为静态函数,它可以对日期对象类的内容具有相同的访问权限。但那会更自然。

比照书“101 C ++编码标准”。首选定义静态成员函数,它有利于松散耦合。

答案 4 :(得分:0)

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

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