为什么无法在 class 主体中分配变量?
Why is it not possible to assign a variable in the class body?
我不确定我是否很好地表达了这个问题,因为我是 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;
}
};
returns 编译错误,即:
error: C2059: syntax error: '='
和
error: C2238: unexpected token(s) preceding ';'
因为class只是一个蓝图,类似于一个宣言。但是,您可以使用构造函数进行初始化。
您混淆了初始化和赋值,它们是完全不同的东西。是的,class 成员声明中不允许使用赋值语句,但对于第一种情况,它是 initialization;
Through a default member initializer, which is simply a brace or equals initializer included in the member declaration
why, in the following code, can the variable xyz be assigned like this
int xyz = 0;
but if written like this
int xyz;
xyz = 0;
returns errors on compilation
那是因为 int xyz = 0
不是 "assignment",而是 "initialization"。 class 主体中允许初始化,而赋值则不允许。
xyz = 0
是一个赋值表达式。在 C++ 中表达式可以出现在许多上下文中,但是对于生成可执行代码的普通表达式,它们只能出现在 initializers 和 statements.语句基本上是C++语言中可执行代码的主要例子。在 C++ 语言中,可执行代码(即语句)应该写在函数内部。这就是语言的工作原理。
因此,在您的情况下,以某种方式 "plant" 您的表达式在函数之外的唯一方法是在 初始化程序 中使用它。例如你可以这样做
struct S
{
int a;
int b = (a = 42);
};
但是这个技巧很丑陋,不明智,而且据我所知没有任何有意义的应用。
您的第一个语法是初始化语法。 =
符号不是赋值运算符,而只是初始化语法的句法元素。即使在这种情况下,实际的初始化代码最终也会成为 constructor 代码的一部分。因此,即使是该代码最终也会成为函数的一部分。
第一个
int xyz = 0
适用于 C++11 标准。
但在第二种情况下,在 class 原型中使用 xyz = 任何值 是被禁止的,因为编译器只希望知道变量的数据类型而不是它的值.同样,一般来说,class 原型应该是一个蓝图,不能用于变量赋值和操作。
我不确定我是否很好地表达了这个问题,因为我是 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;
}
};
returns 编译错误,即:
error: C2059: syntax error: '='
和
error: C2238: unexpected token(s) preceding ';'
因为class只是一个蓝图,类似于一个宣言。但是,您可以使用构造函数进行初始化。
您混淆了初始化和赋值,它们是完全不同的东西。是的,class 成员声明中不允许使用赋值语句,但对于第一种情况,它是 initialization;
Through a default member initializer, which is simply a brace or equals initializer included in the member declaration
why, in the following code, can the variable xyz be assigned like this
int xyz = 0;
but if written like this
int xyz; xyz = 0;
returns errors on compilation
那是因为 int xyz = 0
不是 "assignment",而是 "initialization"。 class 主体中允许初始化,而赋值则不允许。
xyz = 0
是一个赋值表达式。在 C++ 中表达式可以出现在许多上下文中,但是对于生成可执行代码的普通表达式,它们只能出现在 initializers 和 statements.语句基本上是C++语言中可执行代码的主要例子。在 C++ 语言中,可执行代码(即语句)应该写在函数内部。这就是语言的工作原理。
因此,在您的情况下,以某种方式 "plant" 您的表达式在函数之外的唯一方法是在 初始化程序 中使用它。例如你可以这样做
struct S
{
int a;
int b = (a = 42);
};
但是这个技巧很丑陋,不明智,而且据我所知没有任何有意义的应用。
您的第一个语法是初始化语法。 =
符号不是赋值运算符,而只是初始化语法的句法元素。即使在这种情况下,实际的初始化代码最终也会成为 constructor 代码的一部分。因此,即使是该代码最终也会成为函数的一部分。
第一个
int xyz = 0
适用于 C++11 标准。
但在第二种情况下,在 class 原型中使用 xyz = 任何值 是被禁止的,因为编译器只希望知道变量的数据类型而不是它的值.同样,一般来说,class 原型应该是一个蓝图,不能用于变量赋值和操作。