《深入探索C++对象模型》第二章:构造函数语意学(下)

26 篇文章 1 订阅

1、程序转化语意学

(1)参数的初始化

把一个class object当做参数传给一个函数,相当于以下形式的调用:

X xx = arg;
其中 xx 代表形式参数,而arg代表实参。因此,如果有以下这个函数:

void foo(X x0)
下面这样的调用方式:

X xx;
foo(xx);
一种策略是导入临时性object:

X _temp0;
_temp0.X::X(xx);
foo(_temp0);
//这里foo的声明要修改为void foo(X &x0)
临时变量会在foo调用结束后调用自身的析构函数,另一种策略是拷贝建构的方式 把实际参数直接建构在其应该的位置上
(2)返回值的初始化

已知下面这个函数的定义:

X bar()
{
    X xx;
    return xx;
}
双阶段转化:

1、加上一个额外参数,类型是class object的引用,这个参数将用来防止被拷贝构建而得的返回值

2、在return之前安插一个copy constructor调用操作,以便欲传回的object的内容当做上述新增参数的初值

改写后的函数如下:

void bar(X &_result)
{
    X xx;
    xx.X::X();
    .....
    _result.X::X(xx);
    return;
}

现在编译器必须转换每一个bar调用操作:

X xx = bar();

X xx;
bar(xx);
对于以上情况我们可以提出优化方案(在编译器层面),以result参数取代named return value:

void bar(X &_result)
{
    _result.X::X();
    //直接处理_result
    return;
}

即NRV优化,少了一次拷贝构造函数的调用。

2、成员们的初始化队伍

这个只要记住尽量在初始化列表中进行初始化,初始化的顺序和声明有关,和在列表中的顺序无关。



————————————————————————————————————————————————————

第二章OVER,吃饭去...








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值