变量等末尾的符号(&;) 我是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& ); };

变量等末尾的符号(&;) 我是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& ); };,c++,reference,friend,C++,Reference,Friend,关于“&”字符,我理解它作为引用、地址和逻辑运算符的一般用法 例如int*Y=&X 参数末尾的&运算符的含义是什么 friend int date_ok( const date& ); 谢谢 编辑: 谢谢你的回答。 如果我理解正确的话,变量名只是被省略了,因为它只是一个原型。对于原型,我不需要变量名,它是可选的。对吗 但是,对于函数的定义,我肯定需要变量名,对吗?const-date&被方法date\u-ok接受意味着date\u-ok引用类型const-date。它的工作原理与指针类

关于“&”字符,我理解它作为引用、地址和逻辑运算符的一般用法

例如int*Y=&X

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

friend int date_ok( const date& );
谢谢

编辑:

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


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

const-date&
被方法
date\u-ok
接受意味着
date\u-ok
引用类型
const-date
。它的工作原理与指针类似,只是语法稍微复杂一些。。甜的

在您的示例中,
int*Y=&x
生成
Y
类型的指针
int*
,然后为其分配
x
的地址。当我想改变“无论它在
Y
所指的地址是什么”的值时,我说
*Y=200

所以

intx=300;
int*Y=&x;
*Y=200;//现在x=200

cout因此,对于初学者,我认为您可能会更困惑,因为代码的作者遗漏了一些非常重要的内容(尽管是可选的):变量名

让我们重写一下:

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


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

在函数原型的类型末尾使用&可以通过引用传递,而不是通过值(copy)传递。 这样,您可以在friend函数中修改date对象

friend int date_ok( const date& );
朋友: 在您的类定义中,这意味着您告诉我们一个函数
date\u ok
可以访问您的类的所有参数。实际上,它意味着它几乎是你的类的一个成员,所以考虑添加这个朋友函数而不是成员函数。(除非你有其他好的理由,比如不要用外国的定义污染你的课堂)

如果是的话,也可以考虑把它变成一个静态函数,它可以有相同的访问日期对象类的内脏。但这更自然


<〈101 C++编码标准〉。更喜欢定义静态成员函数,它支持松耦合。

在此上下文中,
&
不是运算符。它是类型的一部分

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

实际上,符号
&
,识别这些不同的含义很重要

  • 应用于表达式时的“地址”
  • 作为类型的一部分时的“引用”
  • 应用于两个数字时的“按位与”
类似地,
*
至少有三种含义,一旦你掌握了它们,你就会有指针和引用

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

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

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

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

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


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

它是一个引用,在您的列表中。无论如何,
&&
是合乎逻辑的
&
是按位的。它不在变量的末尾,而是在类型的末尾。所讨论的声明没有命名参数。这个名字被完全省略了。
const data
部分是类型,这意味着
const data&
代表引用类型的参数。该参数在此声明中未命名。您还可以将该行重写为
friend int date_ok(const date&dateParam)如果你想的话。声明中的形式参数dateParam仅用于文档目的,不影响函数引用的操作。函数引用类似于指针,但您应说明引用不可为null,且应始终为“指向”引用也不可重置。@Manu343726引用可以指向本身指向null的对象。所以我不能加上“不能为空”这真是太恶心了。我能给它自己一个参照点吗?那么会发生什么呢?是的,没错@Theredpea我想ref限定符是第四个意思,尽管这实际上算作意思#2仍然。。。
friend int date_ok( const date& check);
friend int date_ok( const date& );