【问题标题】:ampersand (&) at the end of variable etc变量等末尾的和号 (&)
【发布时间】:2014-01-01 00:36:57
【问题描述】:

我是一个 C++ 菜鸟,我在理解代码中的 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

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

friend int date_ok( const date& );

谢谢

编辑:

感谢您的回答。 如果我理解正确的话,变量名就被简单地省略了,因为它只是一个原型。对于原型我不需要变量名,它是可选的。对吗?

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

【问题讨论】:

  • 这是一个参考,在您的列表中。无论如何,&& 是合乎逻辑的。 & 是按位计算的。
  • 它不在变量的末尾,它在type的末尾
  • 有问题的声明没有命名参数。名称完全省略。 const data 部分是类型,这意味着const data & 代表引用类型的参数。此声明中的参数未命名。
  • 如果需要,您还可以将该行重写为friend int date_ok(const date &dateParam);。声明中的形参dateParam仅作文档说明,不影响函数的运行

标签: c++ reference friend


【解决方案1】:

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

【讨论】:

  • 引用类似于指针,但您应该注释引用不可为空,它应该始终“指向”某物
  • 引用也不能重新安装。
  • @Manu343726 引用可以指向本身指向空的东西。所以我不能将其添加为“不可为空”
  • 这真的太恶心了。我可以给自己一个参考点吗?然后会发生什么?
  • 要在int *Y 上调用方法,我们必须这样做,Y-&gt;method(),对吗?但是要在 int&amp; Y 上调用方法,我们可以这样做,Y.method();对吗?
【解决方案2】:

在这种情况下,&amp; 不是运算符。它是类型的一部分。

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

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

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

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

如果我理解正确的话,变量名只是被省略了,因为它只是原型。对于原型我不需要变量名,它是可选的。对吗?

是的。

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

没有。虽然您通常会想要它(否则有什么意义?!)在某些情况下您不需要它,通常是当您只引入参数来进行与重载相关的诡计时。

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

【讨论】:

  • 我认为 ref-qualifiers 是第四个含义,尽管这仍然算作含义 #2...
【解决方案3】:

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

让我们重写一下:

friend int date_ok( const date& check);

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

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

【讨论】:

    【解决方案4】:

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

    friend int date_ok( const date& );
    

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

    如果是,还可以考虑将其设为静态函数,它可以对您的日期对象类的所有内容进行相同的访问。但这会更自然。

    参见。 《101 C++ 编码标准》一书。更喜欢定义静态成员函数,它有利于松散耦合。

    【讨论】:

      【解决方案5】:

      感谢您的回答。 如果我理解正确的话,变量名只是被省略了,因为它只是原型。对于原型我不需要变量名,它是可选的。对吗?

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

      【讨论】:

        猜你喜欢
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2013-04-16
        • 2013-11-02
        • 1970-01-01
        相关资源
        最近更新 更多