[C++]23.神秘的临时对象

一、有趣的问题


输出结果:(是一个随机值)

发生了什么:


思考

答案

代码段Test(0)产生临时对象:

    Test() {
        Test(0); //想直接调用参数构造函数;此时产生临时对象
		         //等价于 Test(0) 不存在
    }

添加init()函数避免产生邻时对象:

class Test {
    int mi;
    
    void init(int i) //为了不让程序产生临时对象,
    {                //实际工程中添加init()函数
        mi = i;
    }
public:
    Test(int i) {
        init(i);
    }
    Test() {
        init(0);
    }
    void print() {
        printf("mi = %d\n", mi);
    }
};

## 二、现代编译器的行为:



三、编程实验:神秘的临时对象

#include <stdio.h>

class Test
{
    int mi;
public:
    Test(int i)
    {
        printf("Test(int i) : %d\n", i);
        mi = i;
    }
    Test(const Test& t)
    {
        printf("Test(const Test& t) : %d\n", t.mi);
        mi = t.mi;
    }
    Test()
    {
        printf("Test()\n");
        mi = 0;
    }
    int print()
    {
        printf("mi = %d\n", mi);
    }
    ~Test()
    {
        printf("~Test()\n");
    }
};

Test func()
{
    return Test(20);
}

int main()
{
    Test t = Test(10); // ==> Test t = 10;
	                   //1.生成临时对象 2.用临时对象初始化化 t 对象
					   //发现:编译器没有调用拷贝构造函数
    
	Test tt = func();  // 等价于:==> Test tt = Test(20); ==> Test tt = 20;
    
    t.print();
    tt.print();
    
	//临时对象会降低效率
    return 0;
}

##四、小结:




本文为听课笔记,课程地址为:

https://item.taobao.com

猜你喜欢

转载自blog.csdn.net/qq_40416052/article/details/83661234