c++析构函数与返回值问题? 析构函数有返回值吗
C#判断问题: 1.构造函数与析构函数都不能有返回值 2.一个类可以有多个析构函数
1是对的,2是错的,一个类有且只有一个析构函数...
c++中关于析构函数的问题
楼主,实际上析构函数会被调用3次,而非2次,在函数system("pause");调用结束后还会有一次,可以单步调试一下看看。
要了解析构函数调用几次,分别析构了哪些对象,可以先看一下构造了哪些对象,何时构造的。
首先,最明显的,对象b是首先被构造的;
其次,形参a是一定要构造的,构造方式是调用func(b);时,b作为实参传递给形参a,这时调用复制构造函数,构造了对象a;
最后,return a;时,将a作为返回值返回给调用处,所以还会通过复制构造函数构造一个A的对象,它暂时没有名字,姑且叫做c;
了解了构造的对象,我们再看析构过程。在main函数中,有对象b和c,在函数func中,有对象a。当func(b);调用结束出栈时,a最先被析构,第一次析构的是a;
之后,由于返回的c由于没有被接收,更没有使用,它在函数func出栈后也会立即被析构,第二次析构的是c;
最后,当main函数返回时,即程序结束时(此时system("pause");已调用结束,即你按过了任意键),b才会被析构,它是最后被析构的A的对象。
c++关于构造函数的返回值问题
1.构造函数当然没有返回值,他只是描述了类初始化的行为。
2.但是new是有返回值的啊!new返回的一定是类实例的指针啊,所以new tree返回的是tree*,所以构造函数跟返回该类的空间是没有关系的。
下面举个例子给你看看:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class tree {
int value;
public:
tree(int v):value(v){}
int get_value() {return value;}
};
int main(int argc, char *argv[])
{
//ifstream in_file("zhidao.text");
queue
for (int i = 0;i< 10 ;++i )
{
tree * tmp = new tree(i);
q.push(tmp);
}
//test code
while(!q.empty())
{
cout<
q.pop();
}
cout< return 0; } 关于析构函数的说明: 1。当程序的执行离开实例化自动对象所在的作用域时,自动对象就会撤销,这时析构函数隐式调用.并不是说在main函数结束时才执行。 2。析构函数本身并不释放对象占用的内存空间,它只是在系统收回对象的内存空间之前执行扫尾工作.析构函数体内并不一定要有delete语句。可以有也可以没 3。和构造函数一样,每个类都有一个析构函数,即使没有显式提供一个析构函数,编译器也会生成一个空的析构函数 . 补充说明: 离开实例化自动对象所在的作用域这句的意思就是说比如你有一个自定义类和一个自定义函数,你在这个函数里声明一个这个类的对象,这个对象就是实例化自动对象,它的作用域仅限于该函数体内,然后你在main函数里调用这个函数,调用结束后,那个类的对象就离开了它的作用域,这时,那个类的析构函数就会被编译器隐式调用。 当主函数结束,回收内存的工作就开始了,但这个工作是由编译器的内存回收机制在后台执行。如果在类的实现中,有动态分配内存和动态分配数组的语句,那么最好在析构函数里提供delete语句! 更正二楼的一个观点,析构函数绝不是在main函数结束时自动执行的!!!!!!C++中的一个关于类的析构函数的问题