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

环信

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C++范例: 初始化列表和拷贝构造函数的深拷贝

[复制链接]

42

主题

68

帖子

229

积分

中级会员

Rank: 3Rank: 3

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

  1. #include <iostream>

  2. using namespace std;

  3. class Test1{
  4.     int kk;
  5. public:
  6.     Test1(int i){}
  7. };
  8. class Test2{
  9. public:
  10.     Test2(int i){}
  11. };

  12. class Test : public Test2
  13. {
  14. private:
  15.     int mI;

  16. public:
  17.     const int ii;
  18.     int& j;
  19.     Test1 tt1;
  20.     /*
  21.      * 初始化列表:
  22.      *      常量
  23.      *      引用
  24.      *      成员对象带参构造函数
  25.      *      父类成员/对象带参构造函数
  26.      * 不能用初始化列表:
  27.      *      数组
  28.      *      结构体
  29.      *
  30.      */

  31.     Test(int i=0) : mI(i), ii(9), j(i), Test2(10), tt1(11)
  32.     {
  33.         printf("Test(), mI = %d\n", mI);
  34.     }

  35.     /*
  36.      * 拷贝构造函数
  37.      */
  38.     Test(const Test& t, int i=0) : mI(t.mI), ii(9), j(i), Test2(10), tt1(11)
  39.     {
  40.         cout<<"B(copy)"<<endl;
  41.     }

  42.     ~Test()
  43.     {
  44.         printf("~Test(), mI = %d\n", mI);
  45.     }
  46. };

  47. class String{
  48.     char *p;
  49.     int n;
  50. public:
  51.     String(int n):p(new char[n]),n(n){
  52.         cout<<"String()"<<endl;
  53.     }

  54.     //深拷贝
  55.     String(const String& s):p(new char[s.n]), n(s.n){
  56.         cout<<"String(copy)"<<endl;
  57.         for(int i=0; i<n; ++i)
  58.         {
  59.             p[i] = s.p[i];
  60.         }
  61.     }

  62.     ~String(){
  63.         cout<<"~String()"<<endl;
  64.         delete[] p;
  65.     }

  66.     void full(char ch){
  67.         for(int i = 0; i<n; ++i)
  68.         {
  69.             p[i] = ch+i;
  70.         }
  71.     }

  72.     void show()
  73.     {
  74.         for(int i = 0; i<n; ++i)
  75.         {
  76.             cout<<p[i];
  77.         }
  78.         cout<<endl;
  79.     }
  80. };

  81. void run()
  82. {
  83.     Test t1(1);
  84.     Test t2(2);
  85.     Test t3(t1);

  86.     Test t4;
  87. }

  88. int main()
  89. {
  90.     run();

  91.     String s1(10);
  92.     s1.full('a');
  93.     String s2(s1);//默认拷贝构造函数会逐字节拷贝旧对象到新对象中
  94.     s1.full('A');
  95.     s1.show();
  96.     s2.show();
  97.     return 0;
  98. }

复制代码



回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2017-3-28 02:25 , Processed in 0.223460 second(s), 22 queries .

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