为什么以下C ++程序打印' 0'而不是' 6'?

时间:2015-12-06 16:55:16

标签: c++ oop constructor

我有两个名为 FWindow FFramwWindow 的课程。 FFramwWindow 类继承 FWindow FWindow 类包含两个构造函数方法。

第一个是默认构造函数,第二个包含一个 int 类型的参数。

我从 FFramwWindow 类默认构造函数中调用第二个构造函数来初始化名为' value'的 FWindow 类的成员变量。

但我不知道为什么它不起作用 -

class FWindow {
public:
    int value;
    FWindow() 
    {
        this->value = 0;
    }
    FWindow(int val) 
    {
        this->value = val;
    }
};

class FFramwWindow : public FWindow
{
public:
    FFramwWindow()
    {
        FWindow::FWindow(6);

        printf("value %d\n", this->value);
    }
};

int main(int argc, _TCHAR* argv[])
{
    FFramwWindow obj;

    return 0;
}

以上代码打印 - value 0

我预期会打印 - value 6

似乎它只调用默认的基类构造函数,而不是我明确调用的第二个。

注意:我使用 Visual Studio 2008

3 个答案:

答案 0 :(得分:8)

因为您应该在构造函数中执行以下操作:

FFramwWindow() : FWindow(6)
{
....

在原始代码中,您创建FWindow的本地(在构造函数范围内)对象。

答案 1 :(得分:2)

代码

FWindow::FWindow(6);

不是对父构造函数的调用,而是创建FWindow的本地实例。 C ++中用于指定应调用哪个FWindow构造函数的正确语法是

FFramwWindow() : FWindow(6)
{
    ...
}

如果没有指定用于基类(以及数据成员)的构造函数,C ++使用默认构造函数,即

FFramwWindow()
{
    ...
}

相当于

FFramwWindow() : FWindow()
{
    ...
}

请注意,如果您有多个继承,则应为每个基类使用逗号分隔它们的构造函数。作为奖励信息,基本构造函数按继承定义中指定的顺序调用,而不是在构造函数中指定它们的那些:

class A {
    A();
    A(int n);
    A(string s);
};

class B {
    B(int n = 6);
}

class C {
    C();
    C(float x);
}

class D: public A, public B, public C {
    D();
}

D::D() : C(3),A(5)
{
}

在此示例中,创建D的实例将按顺序调用A(5)B(6)C(3.0)D()

的构造函数

答案 2 :(得分:1)

在声明派生类的构造函数时,必须调用基类的构造函数。考虑这个例子:

#include<iostream>
class base
{
public:
    int i;
    base()
    {
        i = 0;
    }
    base(int p)
    {
        i = p;
    }
};

class derived1: public base
{
public:
    derived1():base()
    {
        std::cout<<i<<std::endl; //i is 0 here
    }
};

class derived2: public base
{
public:
    derived2():base(10)
    {
        std::cout<<i<<std::endl; //i is 10 here
    }
};

class derived3: public base
{
public:
    derived3(int x):base(x)
    {
        std::cout<<i<<std::endl;
        //this takes an argument from the derived class's constructor
        //as base class's constructor's parameter
    }
};

int main()
{
    derived1 d1;
    derived2 d2;
    derived3 d3(9);
    return 0;
}

derived1类中,调用base类的第一个构造函数。在derived2类中,调用第二个构造函数。在第三种情况下,构造函数接受一个参数,该参数传递给基类的构造函数(这意味着我们使用的是基类的第二个构造函数)。

在你的代码中,你没有调用基类的构造函数,它默认调用不带参数的构造函数。这就是它输出0的原因。

FWindow::FWindow(6);

此语句只是创建一个类FWindow的临时新对象,该对象在执行此语句后立即销毁。构造函数用于在创建对象时自动调用。它们不是手动调用的。

您可以在此处找到一些解释:http://www.geeksforgeeks.org/possible-call-constructor-destructor-explicitly/