• C++之匿名对象与析构函数的关系


    原文链接:https://www.cnblogs.com/fuao2000/p/11065594.html

    只是转发学习!!

     1 #include <iostream>
     2  
     3 using namespace std;
     4  
     5 class Location{
     6 public:
     7     Location(int xx = 0, int yy = 0){
     8         X = xx; Y = yy; cout << "Constructor Object.
    ";
     9     }
    10     Location(const Location& obj){//copy构造函数
    11         X = obj.X;
    12         Y = obj.Y;
    13     }
    14     ~Location(){
    15         cout << X << "," << Y <<" "<< "Object destroyed." << endl;
    16     }
    17     int GetX(){ return X; }
    18     int GetY(){ return Y; }
    19 private:
    20     int X;
    21     int Y;
    22 };
    23  
    24 //g()返回一个元素
    25 //结论1:函数的返回值是一个元素(复杂类型),返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数)
    26 //
    27 //结论2:匿名对象的去和留
    28 //如果用匿名对象初始化 另外一个同类型的对象,匿名对象转成有名对象
    29 //如果用匿名对象赋值给 另外一个同类型的对象,匿名对象被析构
    30 Location g(){
    31     Location A(1, 2);
    32     return A;//A是一个局部变量,当生命周期完毕,会调用析构函数释放空间。此时新建了一个匿名对象来接返回值,因此会调用匿名对象类的复制构造函数,相当于A来初始化匿名对象
    33 }
    34  
    35 void playobj01(){
    36     cout << "playobj01执行开始
    " << endl;
    37     g();//匿名对象会被析构掉;
    38     printf("匿名对象会析构掉
    ");
    39     cout << "playobj01执行完毕
    " << endl;
    40 }
    41  
    42 void playobj02(){
    43     cout << "playobj02执行开始
    " << endl;
    44     //用匿名对象初始化m 此时c++编译器 直接把匿名对象转成了m
    45     Location m = g();
    46     printf("匿名对象被转正,不会析构掉
    ");//速度就会加快
    47     cout << m.GetX() << endl;
    48     cout << "playobj02执行完毕
    " << endl;
    49 }
    50  
    51 void playobj03(){
    52     cout << "playobj03执行开始
    " << endl;
    53     Location m2(1, 2);
    54     m2 = g();
    55     printf("因此用匿名对象赋值给m2,匿名对象被析构掉
    ");
    56     cout << m2.GetX() << endl;
    57     cout << "playobj03执行完毕
    " << endl;
    58 }
    59  
    60 int main()
    61 {
    62     playobj01();
    63     playobj02();
    64     playobj03();
    65     system("pause"); 
    66     return 0;
    67 }

     总结:

        //本质上是c++编译器做了优化,当发现匿名对象初始化一个新对象时,会直接把这个匿名对象转成新对象
        //不会再去构造生成一个新对象--这是c++编译器为了效率上的考虑
  • 相关阅读:
    使用keytool转换签名证书格式,keyStore、jks签名证书相互转换
    Mybatis中jdbcType和javaType的对应关系
    springboot通过已有的server.key,crt,ca证书生成jks文件并开启HTTPS 并启动双向认证+动态加载信任库
    uniapp 生成Android证书及.keystore转.jks、.pem
    查看mysql数据库及表编码格式
    springboot连接mysql报错errorCode 0, state 08S01
    redis注册成windows服务步骤
    lt is detected that the motherboard VT is not enabled, and the games may lag or crash.
    Python %字符串格式化 (%操作符)
    Maven安装教程
  • 原文地址:https://www.cnblogs.com/abtious/p/12572726.html
Copyright © 2020-2023  润新知