c ++如何编写构造函数?

时间:2011-03-31 23:20:10

标签: c++ constructor

我不习惯使用c ++而且编写构造函数时遇到问题 看到这个例子,是我正在处理的代码的简短版本:

class B {
public:
  B(int x);
}

class A {
public:
  B b;
  A(){
    // here I have to initialize b
  }
}

抛出编译器错误,因为我需要在A的构造函数中初始化b,因为B没有默认的构造函数。

我想我已经在初始化列表中做了,但是B(int x)参数是我必须用某种算法计算的值,所以我不知道应该如何正确完成,或者如果我'我错过了什么或做错了。

在像java这样的其他语言中,我会引用B并在A的构造函数中初始化它,之后需要获取初始化值的其他代码。

在这种情况下,初始化b的正确方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:11)

您可以在构造函数初始化列表

中调用函数
class B {
public:
  B(int x);
}; // note semicolon

class A {
public:
  B b;

  A()
  :b(calculateValue()) {
    // here I have to initialize b
  }

  static int calculateValue() {
    /* ... */
  }
}; // note semicolon

请注意,在初始化列表中,该类被认为是完全定义的,因此您也可以看到稍后声明的成员。最好不要在构造函数初始化列表中使用非静态函数,因为此时尚未初始化所有成员。静态成员函数调用很好。

答案 1 :(得分:1)

您使用初始化列表,如下所示:

A() : b(f(x)) {}

答案 2 :(得分:-1)

#include<iostream>

class B {
    public:
        B(){} // A default constructor is a must, if you have other variations of constructor
        B(int x){}
}; // class body ends with a semicolon

class A {
    private:
        B b;
    public:
        A(){
            // here I have to initialize b
        }
        void write(){
            std::cout<<"Awesome";
        }
};

int main(){
    A a;
    a.write();
}

在C ++中,如果你有一个带参数的构造函数,那么必须使用默认构造函数,这与其他语言不同。这就是你需要改变的全部。感谢。