测试前的疑问:
函数参数传递过程中,对于类对象,其隐式的类型转换函数(单参构造函数和转换函数)产生的临时变量生命期,以及对引用参数和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关键字。
函数参数传递过程中,对于类对象,其隐式的类型转换函数(单参构造函数和转换函数)产生的临时变量生命期,以及对引用参数和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关键字。