我是一个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& );
由于
修改
感谢您的回答。 如果我已经正确理解了这一点,那么变量名就被省略了,因为它只是一个原型。对于原型我不需要变量名称,它是可选的。这是对的吗?
但是,对于函数的定义我肯定需要变量名,对吗?
答案 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++,重要的是要认识到这些不同的含义。
同样地,*
至少有三个含义,一旦你掌握了这些含义,你就会有指针和引用。 : - )
如果我已经正确理解了这一点,那么变量名就省略了,因为它只是原型。对于原型我不需要变量名称,它是可选的。这是对的吗?
是
但是,对于函数的定义,我绝对需要变量名,对吗?
没有。虽然你通常会想要它(否则有什么意义?!)在某些情况下你不会这样做,通常当你只引入参数来引入与重载相关的技巧时。
但从技术角度说,你可以根据自己的意愿从声明和/或定义中省略参数名称。
答案 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)
感谢回答者。 如果我已经正确理解了这一点,那么变量名在那里被省略,因为它只是原型。对于原型我不需要变量名称,它是可选的。这是对的吗?
但是,对于函数的定义,我绝对需要变量名,对吗?