【问题标题】:C++: newbie initializer list questionC++:新手初始化列表问题
【发布时间】:2010-12-22 23:54:26
【问题描述】:

这里是新手。我正在查看公司代码。

在类 A 中似乎没有成员变量,但在 A 的构造函数中它初始化对象 B,即使类 A 不包含任何类型 B 的成员变量(或根本没有任何成员变量!)。

我想我连问一个问题都不够了解......所以这里发生了什么!?我的直觉是,在尝试初始化变量之前,您需要一个变量。如何在没有对象的情况下初始化对象(或有什么好处)?

.h:

class A: public B
{
public:
     A(bool r = true);
     virtual ~A;

private:
}

.cpp:

A::A(bool r) : B(r ? B::someEnumeration : B::anotherEnumeration)
{
}

A::~A()
{
}

请帮忙。

谢谢, jbu

【问题讨论】:

    标签: c++ list initializer


    【解决方案1】:

    班级A(公开)inherits来自班级B:

    class A: public B
    

    唯一的way to initialize a base class with parameters 是通过初始化列表。

    【讨论】:

    • 那么听起来好像因为 A 类继承自 B 类,所以 A 类型的每个对象都包含对 B 类型对象的隐藏引用?
    • @jbu:它不仅仅是一个引用,它是一个基类子对象。每个 A 实例都包含一个完整的 B 实例作为子对象。继承用于表达“是一个”关系,所以每个 A 也是一个 B。
    • 继承被认为是一种“is-a”关系。 A“是”B。您可以将A 类视为带有额外内容的B。您可以将A 视为B。
    • 相反,public 继承被认为是一种“is-a”关系。
    【解决方案2】:

    这实际上是在 C++ 中调用基类 ctor 的唯一方法,因为没有 super() 这样的东西。

    【讨论】:

    • 确实不可能,因为C++支持多重继承。
    【解决方案3】:
    class A : public B
    {
    };
    
    class B
    {
      public:
      int x;
    };
    

    A 是 B 的派生类型。或者 A 继承 B。

    所以这是有效的......

    A a;
    a.x = 3;
    

    您的其余代码只是在构造 A 时调用 B 的构造函数。

    【讨论】:

      【解决方案4】:
      class A: public B
      {
      public:
           A(bool r = true); // defaults parameter 1 as "true" if no arguments provided ex A *pA = new A();
           virtual ~A;
      
      private:
      }
      

      .cpp

      A::A(bool r) : B(r ? B::someEnumeration : B::anotherEnumeration)
      {
        // calls parent class, and initialize argument 1 with some enumeration based on whether r is true or false
      }
      
      A::~A()
      {
      }
      

      【讨论】:

        【解决方案5】:

        由于构造函数不能被继承,因此基类数据成员将通过在派生类构造函数中传递参数并在初始化列表的帮助下进行初始化。

        您还应该知道,在 多态类 vptr 对各个虚拟表的初始化仅在构造函数中完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-31
          • 1970-01-01
          • 2016-01-06
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          相关资源
          最近更新 更多