我不确定我是否已经很好地表达了这个问题,因为我是c ++的新手,但我想知道为什么在下面的代码中,变量xyz
可以像这样分配
class Fraction {
public:
int num, denom;
int xyz = 0;
// Constructors
Fraction() {
num = 0;
denom = 1;
}
Fraction(int n, int d) {
num = n;
denom = d;
}
};
但如果写得像这样
class Fraction {
public:
int num, denom;
int xyz;
xyz = 0;
// Constructors
Fraction() {
num = 0;
denom = 1;
}
Fraction(int n, int d) {
num = n;
denom = d;
}
};
在编译时返回错误,即:
error: C2059: syntax error: '='
和
error: C2238: unexpected token(s) preceding ';'
答案 0 :(得分:2)
您对初始化和分配感到困惑,他们完全不同。是的,在班级成员声明中不允许分配声明,但对于第一种情况,它是initialization;
通过默认成员初始值设定项,它只是成员声明中包含的大括号或等于初始化程序
答案 1 :(得分:2)
为什么在以下代码中,可以像这样分配变量xyz
int xyz = 0;
但如果写得像这样
int xyz; xyz = 0;
在编译时返回错误
那是因为int xyz = 0
不是"分配",它""初始化"。在类体中允许初始化,而不是赋值。
答案 2 :(得分:2)
xyz = 0
是一个赋值表达式。有许多上下文中的表达式可以出现在C ++中,但是当涉及到生成可执行代码的普通表达式时,它们只能出现在 initializers 和语句中。语句基本上是C ++语言中可执行代码的主要示例。在C ++语言中,可执行代码(即语句)应该写在函数内部。这就是语言的运作方式。
所以,在你的情况下,以某种方式的唯一方式"植物"您在函数外部的表达式是在初始值设定项中使用它。例如,你可以做这样的事情
struct S
{
int a;
int b = (a = 42);
};
但是这个伎俩很丑陋,不明智,并且没有我知道的有意义的应用程序。
您的第一个语法是初始化语法。 =
符号不是赋值运算符,而只是初始化语法的语法元素。即使在这种情况下,实际的初始化代码最终也会成为构造函数代码的一部分。所以,即使代码最终也会成为函数的一部分。
答案 3 :(得分:1)
因为类只是一个蓝图,类似于声明。但是,您可以使用构造函数进行初始化。
答案 4 :(得分:0)
第一个
int xyz = 0
对C ++ 11标准有效。
但是在第二种情况下,禁止在类原型中使用 xyz = any value ,因为编译器希望只知道变量的数据类型而不是其值。通常,类原型应该是蓝图,不能用于变量赋值和操作。