Chinaunix首页 | 论坛 | 博客

Tea

  • 博客访问: 19546
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-24 10:40
个人简介

骚年

文章分类

全部博文(13)

文章存档

2014年(13)

我的朋友

分类: LINUX

2014-07-09 00:25:20

关于构造函数有点混乱,理一下。

默认构造函数:
在没有显式定义构造函数的情况下编译器会为类分析合成一个构造函数,合成的构造函数分两类nontrivial default constructors和trivial default constructors,但是trivial default constructors是不会编译出来的。因此就有了两种说法,一种认为在没有显式定义构造函数的情况下编译器都会为类生成一个默认的构造函数,另一种认为是只有在四种情况下编译器才会为类合成一个默认构造函数。根据前面的描述,现在看来在不同的层面上来讲这两种说法都是对的。

下面说说nontrivial default constructors,具体在哪四种情况下会生成:
 
①如果一个类里面某个成员对象有nontrivial default constructor,编译器就会为我们的类产生nontrivial default constructor。
 
②如果一个派生类的基类有nontrivial default constructor,那么编译器会为派生类合成一个nontrivial default constructor。
 
③如何一个类里面隐式的含有任何virtual function table(或vtbl)、pointer member(或vptr)。
 
④如果一个类虚继承于其它类。

默认构造函数做哪些事:
    在合成的default constructors,只有base class subobjects和member class object会被初始化,所有其它的nonstatic data member,如整数、整数指针、整数数组等等都不会被编译器初始化。

构造函数什么时候调用:
    C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。然而给出一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。

为什么说:如果定义了拷贝构造函数,也必须定义基本数?
    因为在用户没有编写构造函数的情况下编译器会自动给类生成一个默认构造函数。拷贝构造函数和其它构造函数一样也是构造函数的,所以有了它编译器便不会再合成默认构造函数,如果要将类实例化,那必须得有一个不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。

    eg1.只有拷贝构造函数,编译会出错

点击(此处)折叠或打开

  1. #include <iostream>

  2. class Test
  3. {
  4. public:
  5.   Test(const Test &test){}
  6. };

  7. int main()
  8. {
  9.   Test tt;
  10.   return 0;
  11. }

简单的单例模式:
当我们将类的构造函数的access level定义为private,可以限制类的实例化实现单例。

点击(此处)折叠或打开

  1. #include <iostream>

  2. using namespace std;


  3. class CSingleton
  4. {
  5. public:
  6.     static CSingleton * GetInstance()
  7.     {
  8.         if(!m_pInstance)
  9.             m_pInstance = new CSingleton();
  10.         return m_pInstance;
  11.     }

  12.     void SayHello()
  13.     {
  14.         cout<<"Hello"<<endl;
  15.     }


  16. private:
  17.     CSingleton(){m_pInstance = NULL;}

  18.     class CGarbo //它的唯一工作就是在析构函数中删除CSingleton的实例
  19.     {
  20.     public:
  21.         ~CGarbo()
  22.         {
  23.             if(CSingleton::m_pInstance)
  24.                 delete CSingleton::m_pInstance;
  25.         }
  26.     };

  27. private:
  28.     static CGarbo garbo; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数
  29.     static CSingleton *m_pInstance;
  30. };

  31. CSingleton* CSingleton::m_pInstance = NULL;
  32. int main()
  33. {
  34.     CSingleton *myCSingleton = CSingleton::GetInstance();
  35.     myCSingleton->SayHello();

  36.     return 0;
  37. }

阅读(443) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~