函数传递类类型参数的几点疑问测试

测试前的疑问:
函数参数传递过程中,对于类对象,其隐式的类型转换函数(单参构造函数和转换函数)产生的临时变量生命期,以及对引用参数和const引用参数的影响,如果其单参构造函数声明为explict那又如何?看看对于类类型的传值,是调用单参构造函数还是用的单参的类型转换操作。

先看一段测试代码:
//value.h
class value
{
public:
    value(int i)
        :x(i)
    {}
public:
    ~value(void);
   
    int x;
};

//value.cpp
#include "value.h"
value::~value(void)
{
}

//test.cpp
#include <iostream>
#include "value.h"

using namespace std;

void Print(const value &v)
{
    cout<<v.x<<endl;
}
int main()
{
    int i = 1;
    Print(i);
    cout<<v.x<<endl;
    return 0;
}

输出:1

几个测试结果:
1、如果把构造函数声明为explicit,则编译出错,得到结论:“函数参数传递过程中即使是内置类型到类类型的转换,也不是直接调用的该类构造函数,而是和普通内置数据类型一样,先调用一个类型转换函数(这里就是单参构造函数)产生一个临时对象,然后再调用拷贝赋值操作符完成赋值操作”,也就是 同样都有临时变量的产生,所以我们可以得到结论2,这里的引用是对该临时对象的引用,故不能修改。

2、如果把函数定义中参数的const去掉,编译出错,得到结论:“ 这里的引用是对参数类型转换过程中产生的临时变量的引用,如果不声明为const,那么即使修改其值,确仅仅对临时变量有影响,很明显,这是程序员不希望看到的,对于该临时变量的生命期,我记得C++标准好像是和对其的引用变量的生命期一致(待查阅)”

3、当然, 对于一般的内置类型的函数参数传递,如果有类型转换,则一定要在引用形参前加上const关键字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值