隐式类型转换,其他类型的变量可以通过构造函数隐式转换为一个类类型的对象,这里隐式转换会产生一个无名的临时对象,这个对象是常量不能被修改。所以说,不能将其赋值给一个非 const 的引用,这样编译不通过,最好是赋值给 const 型的引用 const T&。也可以赋值给 值类型,const、非 const 都行,但是这种效率不高。
这里只需注意通过隐式类型转换产生的临时对象是无名的常量对象。
通过隐式类型转换产生的临时对象和通过函数返回值返回的一个临时的无名对象不同。通过函数返回的临时对象,可以是常量也可以是变量。如果是变量,我们还可以修改这个无名的变量,虽然这样做没有意义,一般情况下有副作用。因为本该修改的没有得到修改。
通过函数返回值得到的无名的临时对象是否具有常量性,是由函数的返回值类型决定的。是有程序员自己定义函数的时候决定的。而隐式类型转换生成的无名的临时对象的常量性是由编译器自动决定的,与程序员无关。
防止隐式类型转换可以通过 explicit 关键字。
class T
{
public:
T(int a = 1, int b = 2) {}
};
T t;
t = 5;
这样是首先 5 转换为一个无名的常量性临时对象,然后复制给 t,这里用的赋值运算符是编译器提供的默认 operator =。其形参类型为 const T&。
如果程序员自己提供了 operator =,并且形参类型为 T& 而非 const T&。这样编译就会报错。因为不能将常量复制给 非 const 引用。只是由 C++ 的语法决定的。
一般情况下,如果不改变实参,在定义函数的时候都尽量将形参类型声明为 const T&。这样做的好处是效率高,并且避免不必要的麻烦。这是一种最为可靠和安全的方法。
另外,隐式类型转换和类型转换操作符在一起的时候还容易产生二义性。这种情况下,最好针对各种不同的参数类型,进行各种重载。但是还要考虑模板带来的二义性等。
posted on 2011-04-29 00:56
unixfy 阅读(283)
评论(0) 编辑 收藏 引用