C++:构造函数、继承和初始化

标签 c++ inheritance constructor initialization

我刚刚开始学习 C++,对实例化、构造函数声明和继承之间的相互作用感到有点困惑...我想我开始对所有事情都头头是道,但我想确定我已经正确地概念化了事物。我提供了一个类和我认为正在发生的事情的列表:

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; }
};
  • Constructor 1 按照我习惯的方式做事;调用构造函数通过赋值设置 foo 属性。
  • 构造函数 2 使用从 int 类继承的构造函数。
  • Constructor 3 是上述的组合。

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

Child(args) : Parent(args) { ...extras }

或多或少表现得像 Child(args) { super(args); ...extras } 我更熟悉的语言。如果我们还有复杂的属性(比如 prop1 是一个复杂的类——一个字符串或其他东西),那么我们可以通过这样的方式用它们的构造函数实例化它们:

Child(args) : Parent(args), prop1(args) { ...extras }

这是否正确总结了一切?是否有任何我遗漏的方面,或对我所说内容的有用阐述?

最佳答案

你滥用了继承这个词。

那些是子对象构造函数,子对象包括成员变量和基类子对象。 继承 一词只与基类子对象相关。成员子对象的对应词是组合

使用 ctor-initializer 列表比在构造函数体内赋值更好,原因如下:

  • 它可以用于没有默认构造函数的类型。
  • 它可以用于不能赋值的类型,例如引用和常量成员变量。
  • 效率更高,因为它不需要先使用默认构造函数创建状态,只需替换即可。

在为子对象构造函数构建参数列表时,您还可以使用函数和任意表达式——它们不必只是传递给构造函数的参数。

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

在 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)} {}
};

关于C++:构造函数、继承和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22740524/

相关文章:

c++ - 使用构造函数重新定义

python - 你如何在 __init__ 中调用类的方法?

C++ VS2013 : overwriting default constructor not working

c++ - 什么时候可以将模板专门用于私有(private)成员类型?

c++ - 调用非静态函数作为谓词?

c++ - 许多具有相同构造函数的类

java - java中继承情况下的同步

c++ - MPI:Waitany 对 ibcast 调用没有反应

c++ - 单击按钮时将当前位置/订单保存在 QTabWidget 中 - 用户设置

python - Django 的多重继承