例:

#include <stdio.h>

class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
    }
    Test()
    {
        Test(0);
    }
    void print()
    {
        printf("mi = %d\n",mi);
    }
};

int main()
{
   Test t;
   t.print();
    return 0;
}

输出结果:

mi = 9494516

Slide4.PNG

答案:

直接调用构造函数将产生一个临时对象

临时对象的声明周期只有一条语句的时间

临时对象的作用域只在一条语句中

临时对象C++值得警惕的灰色地带

例:

#include <stdio.h>

class Test
{
private:
    int mi;
    void init(int i)
    {
     mi = i;

    }
public:
    Test(int i)
    {
       init(i);
    }
    Test()
    {
       init(0);
    }
    void print()
    {
        printf("mi = %d\n",mi);
    }
};
int main()
{
   Test ti;
   ti.print();

    return 0;
}

输出结果:

mi = 0

现代C++编译器在不影响最终执行的结果的前提下,尽量减少临时对象的产生

例:

#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;
    Test tt = func();  // ==> Test tt = Test(20); ==>         Test tt = 20;
    
    t.print();
    tt.print();
    
    return 0;
}

输出结果:

main begin
Test()
mi = 0
~Test()
Test(int i)
mi = 10
~Test()
main end

小结:

直接调用构造函数将会产生一个临时对象

临时对象是性能的瓶颈,也是bug的来源之一

现代C++编译器会尽力避开临时对象

实际工程开发中需要人为的避开临时对象


YingLi
6 声望5 粉丝

From zero to hero.