C++ 为什么这段代码可以工作,发生的事情的名称是什么?
不久前我看到了下面的代码,没有人能回答我是什么,也没有人知道它。 我使用VisualStudio 2010作为C++,保存在CPP中(在Win32 CMD程序的一个项目中),然后声明如下:C++ 为什么这段代码可以工作,发生的事情的名称是什么?,c++,C++,不久前我看到了下面的代码,没有人能回答我是什么,也没有人知道它。 我使用VisualStudio 2010作为C++,保存在CPP中(在Win32 CMD程序的一个项目中),然后声明如下: class People { private: string name; short age; public: People (string name,short age) : name(name), age(age) {
class People {
private:
string name;
short age;
public:
People (string name,short age)
: name(name),
age(age)
{
//
}
inline string getName(void) {return name;}
};
class Professor : public People {
private:
int salary;
int nAlunos;
public:
Professor(string name, short age, int salary, int nAlunos)
: People(name,age),
salary(salary),
nAlunos(nAlunos)
{
//
}
};
为什么这种价值观的分配是有效的
请注意,我没有明确地编写:name=newName
,这些东西是独立工作的
我也尝试过wxDev CPP并成功了。它被称为初始化列表,只对构造函数有效 它被称为初始化列表,只对构造函数有效 注意,我没有明确地写:“name=newName” 是的,你知道。。。只是以不同的方式
People (string name,short age) : name(name),age(age) {}
构造函数正在将name
初始化为传入的name
(与age
相同)
(正如Kerrek SB在下面的评论中指出的,赋值和初始化之间存在着很大的技术差异。有关初始化列表教程的链接,请参见@adpalumbo-answer)
注意,我没有明确地写:“name=newName”
是的,你知道。。。只是以不同的方式
People (string name,short age) : name(name),age(age) {}
构造函数正在将name
初始化为传入的name
(与age
相同)
(正如Kerrek SB在下面的评论中指出的,赋值和初始化之间有很大的技术区别。参见@adpalumbo answer以获得初始化列表教程的链接)你是指初始化列表吗?在这里,您可以作为构造函数的一部分初始化父类和成员变量
你是说初始化列表?在这里,您可以作为构造函数的一部分初始化父类和成员变量 现在什么是
名称(name)
括号中的name
是作为构造函数参数接收的变量。括号前的name
是People类成员变量。代码一起初始化接收到的类成员变量的参数
Professor(string name, short age, int salary, int nAlunos)
: People(name,age),
// ^^^^^^^^^^^^^^ Base class constructor with arguments being invoked
现在,您需要以这种方式从派生类显式调用带有参数的构造函数。如果没有它,编译器将调用基类默认构造函数(没有参数的构造函数),并将导致错误。基类没有默认构造函数,编译器无法继续
现在什么是名称(name)
括号中的name
是作为构造函数参数接收的变量。括号前的name
是People类成员变量。代码一起初始化接收到的类成员变量的参数
Professor(string name, short age, int salary, int nAlunos)
: People(name,age),
// ^^^^^^^^^^^^^^ Base class constructor with arguments being invoked
现在,您需要以这种方式从派生类显式调用带有参数的构造函数。如果没有它,编译器将调用基类默认构造函数(没有参数的构造函数),并将导致错误。基类没有默认构造函数,编译器无法进一步处理。下面的代码
People (string arg_name, short arg_age)
:
name(arg_name),
age(arg_age)
{
//
}
相当于
People (string arg_name, short arg_age)
{
name = arg_name;
age = arg_age;
}
不同之处在于,第一段代码使用初始化列表,其中人员
对象、姓名
和年龄
的成员通过直接初始化来构造,而姓名=arg_姓名
分配(副本)arg\u name
到已构建name
对象的成员(name
成员也是对象)。以下代码
People (string arg_name, short arg_age)
:
name(arg_name),
age(arg_age)
{
//
}
相当于
People (string arg_name, short arg_age)
{
name = arg_name;
age = arg_age;
}
不同之处在于,第一段代码使用初始化列表,其中人员
对象、姓名
和年龄
的成员通过直接初始化来构造,而姓名=arg_姓名
分配(副本)arg\u name
到已构建name
对象的成员(name
成员也是对象)。此特定代码:
class Foo {
private:
int value;
public:
void Foo (int newValue) {
value = newValue
}
}
…大致相当于此代码:
class Foo {
private:
int value;
public:
void Foo (int newValue) : value (newValue) {
}
}
正如其他人所指出的,后者被称为。在本例中,您可以采用任何一种方式,但有时需要一个初始值设定项列表(例如初始化基类)
一个细微差别是,以下措施不起作用:
class Foo {
private:
int value;
public:
void Foo (int value) {
value = value
// you'd have to write this.value = value
// otherwise it assumes both mentions of value are to the argument
}
}
另一方面,一个细微差别是初始值设定项列表方法具有特殊的作用域。它假设在括号表达式中提到“value”时,它引用参数…而结果隐式存储在成员中:
class Foo {
private:
int value;
public:
void Foo (int value) : value (value) {
}
}
这是一个品味和风格的问题,你是否认为构造函数的参数应该有一个不同的名称,而不是它们将被分配到的字段。我喜欢自己设计新的xxx,新的yyy,只是为了避免混淆。这个特殊的代码:
class Foo {
private:
int value;
public:
void Foo (int newValue) {
value = newValue
}
}
…大致相当于此代码:
class Foo {
private:
int value;
public:
void Foo (int newValue) : value (newValue) {
}
}
正如其他人所指出的,后者被称为。在本例中,您可以采用任何一种方式,但有时需要一个初始值设定项列表(例如初始化基类)
一个细微差别是,以下措施不起作用:
class Foo {
private:
int value;
public:
void Foo (int value) {
value = value
// you'd have to write this.value = value
// otherwise it assumes both mentions of value are to the argument
}
}
另一方面,一个细微差别是初始值设定项列表方法具有特殊的作用域。它假设在括号表达式中提到“value”时,它引用参数…而结果隐式存储在成员中:
class Foo {
private:
int value;
public:
void Foo (int value) : value (value) {
}
}
这是一个品味和风格的问题,你是否认为构造函数的参数应该有一个不同的名称,而不是它们将被分配到的字段。我喜欢<代码> NeXXXX < /C>,<代码> NeYyyy < /Cord>样式我自己…只是为了避免混淆。< /P>我不确定问题是什么,但是也许你会从一本好的C++书籍中学习一些语言基础知识,特别是“类和构造函数”,这会对你有好处吗?没有任务;更确切地说,这是初始化……即使有很大的压力,我也无法想象你在要求什么。