zoukankan      html  css  js  c++  java
  • 临时对象

    直接上代码:

    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 }



     

  • 相关阅读:
    首发Zend Studio 9.0.2正式版注册破解
    PHP 中Cookie和Session的使用
    PHP设计模式职责和单例模式
    软件工程工具学习(1)Visio
    java复习(4)数字处理类
    java复习(1)java与C++区别
    微信开发(1)微信防撤回功能实现
    java复习(3)字符串、数组
    java复习(2)java基础杂记
    java复习(5)接口、继承、多态
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2419472.html
Copyright © 2011-2022 走看看