个人笔记 C++构造函数,析构函数

此文章文个人笔记,2012年11月24日 ,觉得有点用,所以贴出来。一来是分享,二是挣点积分。


定义一个类如果programmer没有定义构造函数, 用户并没有显示地定义默认构造函数,编译器会为它自动生成一个无关紧要(trivial)的默认构造函数,生成的默认构造函数什么也不错,既不会讲其成员变量置零,也不会做其他的任何事情,只是为了保证程序能够正确;
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


你可能感兴趣的:(C++,Win32,构造函数,析构函数)