请选择 进入手机版 | 继续访问电脑版

环信

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: mmap uikit gcc
查看: 274|回复: 0

C++构造和析构

[复制链接]

42

主题

68

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2016-1-21 10:31:06 | 显示全部楼层 |阅读模式

1. 两个特殊的构造函数
    无参构造函数
        当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空
    拷贝构造函数
        当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制
  1.         class Test
  2.         {
  3.         public:
  4.             Test()
  5.             {
  6.                 printf("Test()\n");
  7.             }
  8.             
  9.             Test(const Test& obj)
  10.             {
  11.                 printf("Test(const Test& obj)\n");
  12.             }
  13.         };
  14.        
  15.         int main()
  16.         {
  17.             Test t1;
  18.             Test t2 = t1;
  19.             return 0;
  20.         }
复制代码


构造,析构,深拷贝:
  1.         int main()
  2.         {
  3.             Array a1(10);
  4.             
  5.             for(int i=0; i<a1.length(); i++)
  6.             {
  7.                 a1.setData(i, i);
  8.             }
  9.             
  10.             for(int i=0; i<a1.length(); i++)
  11.             {
  12.                 printf("Element %d: %d\n", i, a1.getData(i));
  13.             }
  14.             
  15.             Array a2 = a1;
  16.             
  17.             for(int i=0; i<a2.length(); i++)
  18.             {
  19.                 printf("Element %d: %d\n", i, a2.getData(i));
  20.             }
  21.             
  22.             a1.destory();
  23.             a2.destory();
  24.             return 0;
  25.         }       
  26.        
  27.         Array.h:
  28.         #ifndef _ARRAY_H_
  29.         #define _ARRAY_H_
  30.         class Array
  31.         {
  32.         private:
  33.             int mLength;
  34.             int* mSpace;
  35.         public:
  36.             Array(int length);
  37.             Array(const Array& obj);
  38.             int length();
  39.             void setData(int index, int value);
  40.             int getData(int index);
  41.             ~Array();
  42.         };
  43.         #endif       
  44.        
  45.         Array.cpp:
  46.         #include "Array.h"
  47.         Array::Array(int length)
  48.         {
  49.             if( length < 0 )
  50.             {
  51.                 length = 0;
  52.             }
  53.             
  54.             mLength = length;
  55.             mSpace = new int[mLength];
  56.         }
  57.        
  58.         Array::Array(const Array& obj)
  59.         {
  60.             mLength = obj.mLength;
  61.             
  62.             mSpace = new int[mLength];
  63.             
  64.             for(int i=0; i<mLength; i++)
  65.             {
  66.                 mSpace[i] = obj.mSpace[i];
  67.             }
  68.         }
  69.        
  70.         int Array::length()
  71.         {
  72.             return mLength;
  73.         }
  74.        
  75.         void Array::setData(int index, int value)
  76.         {
  77.             mSpace[index] = value;
  78.         }
  79.        
  80.         int Array::getData(int index)
  81.         {
  82.             return mSpace[index];
  83.         }
  84.        
  85.         Array::~Array()
  86.         {
  87.             mLength = -1;
  88.             delete[] mSpace;
  89.         }       
复制代码


   

2. 初始化列表对成员变量进行初始化
Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
{
    ...
}
使用初始化列表:
    常量
    引用
    成员对象带参构造函数
    父类成员/对象带参构造函数
不能用初始化列表:
         数组
     结构体
         
成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关
初始化列表先于构造函数的函数体执行
  1.         class M
  2.         {
  3.         private:
  4.             int mI;
  5.         public:
  6.             M(int i)
  7.             {
  8.                 printf("M(int i), i = %d\n", i);
  9.                 mI = i;
  10.             }
  11.             
  12.             int getI()
  13.             {
  14.                 return mI;
  15.             }
  16.         };
  17.        
  18.         class Test
  19.         {
  20.         private:
  21.             const int c;
  22.             M m1;
  23.             M m2;
  24.         public:
  25.             Test() : c(1), m2(3), m1(2)
  26.             {
  27.                 printf("Test()\n");
  28.             }
  29.             
  30.             void print()
  31.             {
  32.                 printf("c = %d, m1.mI = %d, m2.mI = %d\n", c, m1.getI(), m2.getI());
  33.             }
  34.         };
  35.        
  36.         void run()
  37.         {
  38.             Test t1;
  39.             
  40.             t1.print();
  41.         }
  42.        
  43.         int main()
  44.         {
  45.             run();
  46.             
  47.             return 0;
  48.         }       
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|环信 Glofty.com ( 粤ICP备15084637号 )

GMT+8, 2017-4-28 23:57 , Processed in 0.229877 second(s), 22 queries .

快速回复 返回顶部 返回列表