析构函数

时间:2012-03-23 07:37:48

标签: c++

#include <iostream>

using namespace std;

class A{
    int b;
public:
    A(){
        cout<<"Constructor for class A called\n";
        b = 6;
    }
    ~A(){
        cout<"Destructor called for class A\n";
    }
};

class B{
    A a;
public:
    B(){
        cout<<"Constructor for class B called\n";
    }
    ~B(){
        cout<<"Destructor called for class B\n";
    }
};


int main(void){
    B obj1;
    return 0;
}

执行上面的代码时,A和B的构造函数按预期调用,但是当B的对象即obj1超出范围时,只调用B的析构函数。为什么A的析构函数没有被调用,即使A的obj是B的成员之一?

4 个答案:

答案 0 :(得分:5)

你在A的析构函数中错过了<

 cout << "Destructor called for class A\n";

如果您没有收到表达式的编译错误:

 cout < "Destructor called for class A\n"
      |
 //less than operator

好吧,您的编译器正在尝试将coutconst char*进行比较。这是一件奇怪的事情。但是,唉,将<更改为<<,它应该有效:http://ideone.com/8TDyy

答案 1 :(得分:3)

你忘记了&lt;在A的析构函数中的字符。

该行

cout<"Destructor called for class A\n"; 

只是意味着:将cout与给定的字符串进行比较并返回true或false。

你应该写

cout<<"Destructor called for class A\n"; 

然后它才能正常工作。

在&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;操作员使这更清楚(我总是说代码需要呼吸(它需要一些空气))。

答案 2 :(得分:2)

您的代码显示:

cout&lt;“析构函数调用了类A \ n”;

应该有两个&lt;&lt;'s,而不是一个。我很惊讶它完全编译......

答案 3 :(得分:1)

~A(){
        cout<"Destructor called for class A\n";
    }

与cout一起使用的运算符是<<而不是<的运算符小于~A(){ cout<<"Destructor called for class A\n"; } 纠正它,你的代码就没事了。

{{1}}