Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:构造函数、继承和初始化 我刚刚开始学习C++,并且对实例化、构造函数声明和继承的相互作用有点困惑…我想我已经开始对每件事都有了清醒的认识,但我想确保我对事物的概念化是正确的。我已经提供了一个a类和一个我认为正在发生的事情的列表: class Classy{ private: int foo1; int foo2; public: //constructor 1 Classy() { foo1 = 0; foo2 = 0; } //constructor 2 Classy(int bar1) : foo1(bar1), foo2(0) {} //constructor 3 Classy(int bar1, int bar2) : foo1(bar1) { foo2 = bar2; } }; 构造函数1以我习惯的方式做事;对构造函数的调用通过赋值设置foo属性 构造函数2使用从int类继承的构造函数 构造函数3是上述各项的组合_C++_Inheritance_Constructor_Initialization - Fatal编程技术网

C++;:构造函数、继承和初始化 我刚刚开始学习C++,并且对实例化、构造函数声明和继承的相互作用有点困惑…我想我已经开始对每件事都有了清醒的认识,但我想确保我对事物的概念化是正确的。我已经提供了一个a类和一个我认为正在发生的事情的列表: class Classy{ private: int foo1; int foo2; public: //constructor 1 Classy() { foo1 = 0; foo2 = 0; } //constructor 2 Classy(int bar1) : foo1(bar1), foo2(0) {} //constructor 3 Classy(int bar1, int bar2) : foo1(bar1) { foo2 = bar2; } }; 构造函数1以我习惯的方式做事;对构造函数的调用通过赋值设置foo属性 构造函数2使用从int类继承的构造函数 构造函数3是上述各项的组合

C++;:构造函数、继承和初始化 我刚刚开始学习C++,并且对实例化、构造函数声明和继承的相互作用有点困惑…我想我已经开始对每件事都有了清醒的认识,但我想确保我对事物的概念化是正确的。我已经提供了一个a类和一个我认为正在发生的事情的列表: class Classy{ private: int foo1; int foo2; public: //constructor 1 Classy() { foo1 = 0; foo2 = 0; } //constructor 2 Classy(int bar1) : foo1(bar1), foo2(0) {} //constructor 3 Classy(int bar1, int bar2) : foo1(bar1) { foo2 = bar2; } }; 构造函数1以我习惯的方式做事;对构造函数的调用通过赋值设置foo属性 构造函数2使用从int类继承的构造函数 构造函数3是上述各项的组合,c++,inheritance,constructor,initialization,C++,Inheritance,Constructor,Initialization,继承的构造函数也可以来自类的父级-例如: Child(args) : Parent(args) { ...extras } 在我比较熟悉的语言中,它的行为或多或少类似于Child(args){super(args);…extras}。如果我们还有复杂的属性(比如prop1是一个复杂的类-字符串或其他东西),那么我们可以通过如下方式使用它们的构造函数实例化它们: Child(args) : Parent(args), prop1(args) { ...extras } 这算对了吗?我有没有遗漏

继承的构造函数也可以来自类的父级-例如:

Child(args) : Parent(args) { ...extras }
在我比较熟悉的语言中,它的行为或多或少类似于
Child(args){super(args);…extras}
。如果我们还有复杂的属性(比如prop1是一个复杂的类-字符串或其他东西),那么我们可以通过如下方式使用它们的构造函数实例化它们:

Child(args) : Parent(args), prop1(args) { ...extras }
这算对了吗?我有没有遗漏什么方面,或者对我所说的内容进行了有益的阐述?

你滥用了“继承”这个词

这些是子对象构造函数,子对象包括成员变量和基类子对象。“继承”一词仅与基类子对象相关。成员子对象的对应词是composition

使用ctor初始值设定项列表比在构造函数体中赋值要好,原因如下:

  • 它可以用于没有默认构造函数的类型
  • 它可以用于无法分配的类型,例如引用和常量成员变量
  • 它更高效,因为它不需要首先使用默认构造函数创建状态,而默认构造函数只是被替换
在为子对象构造函数构建参数列表时,还可以使用函数和任意表达式——它们不必只是传递给构造函数的参数

如果使用一对空括号,将获得子对象的值初始化,而不是默认初始化。如果有默认构造函数,则它们是相同的。否则,值初始化将使子对象归零,而默认初始化将保留不确定的、可能非法的状态

在C++11中,在调用子对象构造函数时,通常希望使用带有
{}
的通用初始值设定项语法,而不是
()

下面是一个示例,其中这些语法非常有用:

class Classy
{
  // private is the default access specifier for classes
    int bar[100];
    const std::array<int, 100> baz;
    static std::array<int, 100> make_array(int x)
    {
        std::array<int, 100> retval;
        for( int i = 0; i < 100; ++i )
            retval[i] = i * x;
        return retval;
    }
public:
    //constructor 1
    Classy() : bar{}, baz{} {}
    //constructor 2
    Classy(int bar1) : bar{}, baz{make_array(bar1)} {}
};
class Classy
{
//private是类的默认访问说明符
整数条[100];
常数std::数组baz;
静态std::数组生成数组(intx)
{
std::数组检索;
对于(int i=0;i<100;++i)
retval[i]=i*x;
返回返回;
}
公众:
//构造器1
Classy():bar{},baz{}
//建造师2
Classy(intbar1):bar{},baz{make_数组(bar1)}{}
};

Noted-我不习惯所谓的子对象,它的构造函数可以在继承构造函数的同一位置调用。。。也许这就是我困惑的地方?值得深思。什么是ctor初始值设定项?@Nate:ctor初始值设定项列表是介于构造函数主体的
和开头的
{
之间的所有内容。请理解。您能否为您的答案中关于值初始化与默认初始化的部分提供一个代码示例?另外:为什么是统一初始化({})优于构造函数初始化(“()”)?@Nate:这是您的示例。统一初始化适用于聚合(数组、结构)这实际上没有构造函数。明白了!感谢您的解释-术语似乎是我最大的问题,我发现的大多数教程似乎都认为我已经知道了。您熟悉的其他语言可能总是为成员变量提供默认初始化…例如,
null
reference在C++中,对象可以被值包含,默认初始化并不总是有意义的。尽管不是正确的术语,但您有正确的理解;<代码> INT/COM>不是一个类,也没有构造函数。但是<代码> Foo1(BAR1)意味着< /Calp> BAR1'被用作<代码> Foo1的初始化器。