• 临时对象


    直接上代码:

    View Code
     1 #include <iostream>
    2 using namespace std;
    3
    4 class B
    5 {
    6 public:
    7 B()
    8 {
    9 cout << "default constructor " << endl;
    10 }
    11 ~B()
    12 {
    13 cout << "destructed" << data << endl;
    14 }
    15 B(int i) : data(i)
    16 {
    17 cout << "constructed by parameter" << data << endl;
    18 }
    19 private:
    20 int data;
    21 };
    22
    23 B play ()
    24 {
    25 B b(1);
    26 return b; // 按值返回
    27 }
    28
    29 void play2(B b) // 按值传参
    30 {
    31 }
    32
    33 void main()
    34 {
    35 B t1 = play();
    36
    37 play2(t1);
    38 }

     输出:

    constructed by parameter1
    destructed1
    destructed1
    destructed1
    请按任意键继续. . .

    a.按值返回和b.按值传参的位置都会产生一个临时对象。a、b是产生临时对象的两种情况。

    问题来了:

       假如有如下代码,那么结果会是什么呢?

    View Code
     1 #include <iostream>
    2 using namespace std;
    3
    4 class B
    5 {
    6 public:
    7 B()
    8 {
    9 cout << "default constructor " << endl;
    10 }
    11 ~B()
    12 {
    13 cout << "destructed" << data << endl;
    14 }
    15 B(int i) : data(i)
    16 {
    17 cout << "constructed by parameter" << data << endl;
    18 }
    19 private:
    20 int data;
    21 };
    22
    23 B play( B b) // 按值传参
    24 {
    25 return b; // 按值返回
    26 }
    27 void main()
    28 {
    29 B t1 = play();
    30
    31 play2(t1);
    32 }

    输出:

    constructed by parameter5
    destructed5
    destructed5
    请按任意键继续. . .

    可能会问,不是应该有3次析构吗? 怎么只有两次。

    这里是编译器对临时对象做了处理,如果参数和返回值是同一对象,那么只产生传参时候的一次临时对象。[自己理解得,不一定正确]

    解决临时对象的方法:

    使用引用。

    View Code
     1 #include <iostream>
    2 using namespace std;
    3
    4 class B
    5 {
    6 public:
    7 B()
    8 {
    9 cout << "default constructor " << endl;
    10 }
    11 ~B()
    12 {
    13 cout << "destructed" << data << endl;
    14 }
    15 B(int i) : data(i)
    16 {
    17 cout << "constructed by parameter" << data << endl;
    18 }
    19 private:
    20 int data;
    21 };
    22
    23 B play( B &b) // 按值传参
    24 {
    25 return b; // 按值返回
    26 }
    27 void main()
    28 {
    29 B t2(5);
    30 B t1 = play(t2);
    31
    32 }



     

  • 相关阅读:
    pandas高效实现条件逻辑
    Python教程:文件、异常处理和其他
    最终初学者指南,以数据科学用例赢得分类黑客马拉松
    用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统
    一幅图像能顶16x16字!——用于大规模图像缩放识别的变压器(对ICLR 2021年论文的简要回顾)
    接缝雕刻算法:一种看似不可能的图像大小调整方法
    apache与nginx的优缺点的比较
    php5与php7的区别
    git基本的命令大全
    redis和membercache的区别
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2419472.html
Copyright © 2020-2023  润新知