zoukankan      html  css  js  c++  java
  • 32)(典型)构造和析构 拷贝构造 小样例

     1 #include<iostream>
     2 using namespace std;
     3 class ABCD
     4 {
     5 public:
     6     ABCD(int a,int b,int c)
     7     {
     8         _a=a;
     9         _b=b;
    10         _c=c;
    11         cout<<"ABCD()的构造函数"<<"a:  "<<_a <<"b:  "<<_b <<"c:  "<<_c <<endl;    
    12     }
    13     ~ABCD()
    14     {
    15         cout<<"ABCD()的析构函数"<<endl;
    16     
    17     }
    18     int get_a()
    19     {
    20         return  _a;
    21     }
    22 
    23 
    24 private:
    25     int _a;
    26     int _b;
    27     int _c;
    28 };
    29 class MyE
    30 {
    31 public:
    32     MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
    33     {
    34         cout<<"MyE()的构造函数"<<endl;
    35     }
    36     ~MyE()
    37     {
    38         cout<<"MYE()的析构函数"<<endl;
    39     }
    40     MyE(const MyE &another):abcd1(7,8,9),abcd2(10,11,12),m(100)
    41     
    42     {
    43         cout<<"MyE的拷贝构造函数"<<endl;
    44     }
    45 
    46 public:
    47     ABCD abcd1;
    48     ABCD abcd2;
    49     int m;
    50 
    51 };
    52 /**
    53 因为这个mye1是一个普通的变量,所以,
    54 也就是实参给形参赋值,也就有了调用MyE的拷贝构造函数
    55 */
    56 int doThing(MyE mye1)
    57 {
    58     cout<<"dothing()函数"<<endl;
    59     cout<<mye1.abcd1.get_a()<<endl;
    60     return 0;
    61 }
    62 int run()
    63 {
    64     MyE mye;
    65     doThing(mye);
    66     return 0;
    67 }
    68 int run2()
    69 {
    70     cout<<"run2函数开始了"<<endl;
    71     ABCD(400,500,600);//临时对象的生命周期
    72     cout<<"run2结束了"<<endl;
    73     return 0;
    74 }
    75 int main()
    76 {
    77     run();
    78     /**
    79     ①首先调用MyE的无参构造函数,就是MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
    80     ②然后运行那个doThing函数,将mye传进去了,(也就是实参给形参赋值嘛,所以,救调用MyE的拷贝构造函数。
    81 82     */
    83     return 0;
    84 }

      结果截图:

    然后,我调用那个 run2()函数

     1 #include<iostream>
     2 using namespace std;
     3 class ABCD
     4 {
     5 public:
     6     ABCD(int a,int b,int c)
     7     {
     8         _a=a;
     9         _b=b;
    10         _c=c;
    11         cout<<"ABCD()的构造函数"<<"a:  "<<_a <<"b:  "<<_b <<"c:  "<<_c <<endl;    
    12     }
    13     ~ABCD()
    14     {
    15         cout<<"ABCD()的析构函数"<<endl;
    16     
    17     }
    18     int get_a()
    19     {
    20         return  _a;
    21     }
    22 
    23 
    24 private:
    25     int _a;
    26     int _b;
    27     int _c;
    28 };
    29 class MyE
    30 {
    31 public:
    32     MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
    33     {
    34         cout<<"MyE()的构造函数"<<endl;
    35     }
    36     ~MyE()
    37     {
    38         cout<<"MYE()的析构函数"<<endl;
    39     }
    40     MyE(const MyE &another):abcd1(7,8,9),abcd2(10,11,12),m(100)
    41     
    42     {
    43         cout<<"MyE的拷贝构造函数"<<endl;
    44     }
    45 
    46 public:
    47     ABCD abcd1;
    48     ABCD abcd2;
    49     int m;
    50 
    51 };
    52 /**
    53 因为这个mye1是一个普通的变量,所以,
    54 也就是实参给形参赋值,也就有了调用MyE的拷贝构造函数
    55 */
    56 int doThing(MyE mye1)
    57 {
    58     cout<<"dothing()函数"<<endl;
    59     cout<<mye1.abcd1.get_a()<<endl;
    60     return 0;
    61 }
    62 int run()
    63 {
    64     MyE mye;
    65     doThing(mye);
    66     return 0;
    67 }
    68 int run2()
    69 {
    70     cout<<"run2函数开始了"<<endl;
    71     ABCD(400,500,600);//临时对象的生命周期,也就是创建完后吗,就被析构了
    72     cout<<"run2结束了"<<endl;
    73     return 0;
    74 }
    75 int main()
    76 {
    77     //run();
    78     /**
    79     ①首先调用MyE的无参构造函数,就是MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
    80     ②然后运行那个doThing函数,将mye传进去了,(也就是实参给形参赋值嘛,所以,救调用MyE的拷贝构造函数。
    81 82     */
    83     run2();
    84     return 0;
    85 }

            结果i就是:

    3)然后还有一个代码:

     1 #include<iostream>
     2 using namespace std;
     3 class MyTest
     4 {
     5 public:
     6     MyTest(int a,int b,int c)
     7     {
     8         _a=a;
     9         _b=b;
    10         _c=c;
    11     }
    12     MyTest(int a,int b)
    13     {
    14         _a=a;
    15         _b=b;
    16         MyTest(a,b,100);//产生了一个新的匿名对象(这里可以这么写,也就是产生一个对象,紧接着被析构了呗
    17     }
    18     ~MyTest()
    19     {
    20         cout<<"MyTest的析构函数开始啦    ----"<<_a<<" "<<_b<<" "<<_c<<endl;
    21     }
    22     int getC()
    23     {
    24         return _c;
    25     }
    26     void setC(int val)
    27     {
    28     _c=val;
    29     }
    30 private:
    31     int _a;
    32     int _b;
    33     int _c;
    34 
    35 };
    36 int main()
    37 {
    38     MyTest t1(1,2);
    39     //t1.setC(100);
    40     cout<<"MyTest的C数据   "<< t1.getC()<<endl;
    41     return 0;
    42 }

    结果是:    

            在构造中调用构造是一个危险的行为

  • 相关阅读:
    WCF 发布在iis上
    记一次服务器迁移过程
    期末总结
    典型用户和用户场景
    软件工程第四次作业 结对编程 增量开发
    第三次作业 结对编程
    我对git认识
    浅谈对IT的认识!
    本地Git仓库和远程仓库的创建和关联及github上传(git push)时出现error: src refspec master does not match any解决办法
    CSS下拉菜单
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8184106.html
Copyright © 2011-2022 走看看