此文章文个人笔记,2012年11月24日 ,觉得有点用,所以贴出来。一来是分享,二是挣点积分。
定义一个类如果programmer没有定义构造函数,用户并没有显示地定义默认构造函数,编译器会为它自动生成一个无关紧要(trivial)的默认构造函数,生成的默认构造函数什么也不错,既不会讲其成员变量置零,也不会做其他的任何事情,只是为了保证程序能够正确;
只要定义了构造函数,不管有参无参数,编译器都不再提供默认构造函数。看到这话时,有个疑问;默认的构造函数是void class(void ) {}这种类型吗?我在程序中提供这么一个呢?一模一样的默认构造函数?哎,有点说不清。
如果我定义了一个构造函数,但是声明对象的时候不用这种构造,会用默认的吗?
于是发现,编译器说没有合适的构造函数,于是我懂了。擦嘞 。只要你定义了构造函数,编译器果然不提供了默认的构造函数。如果还想要无参构造函数,就要自己写了。将我写的带参构造构造函数屏蔽掉,是可以构造的。eg:
class test{
public:
int a;
int b;
};
只要定义了构造函数,不管有参无参数,编译器都不再提供默认构造函数。看到这话时,有个疑问;默认的构造函数是void class(void ) {}这种类型吗?我在程序中提供这么一个呢?一模一样的默认构造函数?哎,有点说不清。
如果我定义了一个构造函数,但是声明对象的时候不用这种构造,会用默认的吗?
#include<iostream>
using namespace std;
class test{
public:
//test()
//{
// cout<<"constructed !"<<endl;
//}
test(int temp)
{
temp=2;
}
~test()
{
cout<<"destructived!"<<endl;
}
public:
int temp;
public:
void fun1()
{
cout<<"test fun1"<<endl;
}
void fun2()
{
cout<<"fun2"<<endl;
}
};
int main()
{
test a;
test b;
a.fun1();
a.fun2();
cin>>a.temp;
cout<<a.temp;
b.fun1();
cin>>b.temp;
return 1;
}
问题来了,被今天的一个问题搞晕了,断点发现没有窗口建立时没对对象构造,但结束时居然调用了对象的析构,把我对构造函数搞混了。现在看来,还是乱,为什么啊?
为什么会调用那奇怪的析构?百度了下析构调用时刻:
1、如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
2、static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
3、如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。
4、如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
今天查,理论知识不过硬啊,不晓得哪里出错了。2012--11-24 by cq