C ++ - 在为参数化构造函数设置值时,返回0基类变量

时间:2014-08-30 06:21:56

标签: c++

我一直试图找出过去一小时的错误,所以问。 即使我让我的参数化构造函数接受默认长度,但它在同一个类中正确显示它们但在我尝试使用它时在派生类 中返回0那里。

#include<iostream>
class rectangle
{

    protected :
    //int length=12,breadth=13; // LINE A
    int length,breadth;         // LINE B

public: 


    rectangle(){}  // Empty default constructor
    rectangle (int len , int br)
    {
    length =len ,breadth =br;

    }

void area_rect()
    {
    std::cout << "\n Area is " << (length*breadth);
    std::cout << "\n Length,Breadth : " << length << "  "<<breadth<< "\n";
    }   

};

class box : public rectangle
{   
    int depth;
    public:
    box() {}   // Again empty constructor of derived class
    box(int d)
    {
    depth = d;
    }

    void area_box()
    {
    std::cout << "VOLUME IS : "<<(length*breadth*depth)<< "\n";
    }

};


int main()

{
rectangle r(10,20);
r.area_rect();
box b(30);
b.area_box();

return 0;
}

- 取消注释行B,并且注释A给出

 Area is 200
 Length,Breadth : 10  20
VOLUME IS : 0

- 取消注释A行,并且注释B给出

 Area is 200
 Length,Breadth : 10  20
VOLUME IS : 4680

1 个答案:

答案 0 :(得分:4)

总是应该在构造函数中初始化简单的成员变量:

   rectangle() : length(0), breadth(0) {};

否则他们会保持“未初始化”,这意味着他们有垃圾价值。

对于对象成员变量(例如,如果你有std::string color;作为rectangle的另一个私有成员变量),则会调用默认构造函数。

派生类构造函数应调用(或隐式调用,如果忘记它)基类构造函数:

   box () : rectangle () {}

BTW,使用所有警告和调试信息编译代码(如果使用GCC,例如g++ -Wall -g),然后使用调试器(例如gdb)逐步运行程序并查询各种数据。

另外,研究一些用C ++编写的自由软件的源代码;它会教你很多。