C++——临时对象

class Test
{
    int t;

public:
    Test()
    {
        Test(0);
    }

    Test(int rec)
    {
        t = rec;
    }

    int getVal();
};

int Test::getVal()
{
    return t;
}

这个程序,比较简单,说一下产生问题的点,类有两个构造函数,一个无参的,一个含有一个int类型的构造函数,程序的本意是在无参构造函数中利用都有参数的构造函数去初始化类,运行之后,查看t的值,是一个随机值。程序的结果和我们的本意是不同的,造成这个结果的原因是临时对象

当我们Test o定义一个对象时,会调用无参的初始化函数,所以会进而调用Test(0),这里手工调用了构造函数,手工调用构造函数的结果是产生了一个新的临时对象,它的作用域只在当前这一条语句当中,而且作用域也是当前语句。所以这个无参的构造函数调用结束后只是产生了一个临时对象,然后就进行了销毁。我们定义的o对象的成员变量并没有初始化或者赋值,所以这就是为什么结果是一个随机值。如果想按照上述想法可以写成如下形式。

class Test
{
    int t;

public:
    Test()
    {
        *this = Test(0);
    }

    Test(int rec)
    {
        t = rec;
    }

    int getVal();
};

int Test::getVal()
{
    return t;
}

这里我们把产生的临时对象赋值给了当前我们定义的对象。因为编译器默认提供了对象的重载赋值符号,所以会完成成员变量的浅拷贝。因为这里不涉及成员变量占用系统资源,所以浅拷贝是可以的。

但是在程序设计里,应该尽量避免临时对象的产生。编译器也会在不影响结果的调用下尽量少的产生临时对象。比如Test a = Test(0),语法来说应该是产生了一个临时对象然后调用拷贝构造函数初始化了a对象,但是编译器优化成了Test a(10),因为编译器这样做没有影响结果而且避免了临时对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值