C++ 为什么这段代码可以工作,发生的事情的名称是什么?

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) {

不久前我看到了下面的代码,没有人能回答我是什么,也没有人知道它。 我使用VisualStudio 2010作为C++,保存在CPP中(在Win32 CMD程序的一个项目中),然后声明如下:

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++书籍中学习一些语言基础知识,特别是“类和构造函数”,这会对你有好处吗?没有任务;更确切地说,这是初始化……即使有很大的压力,我也无法想象你在要求什么。