由于类的转换运算符与类的运算符重载函数,在某些地方上使用的时候,有功能相似的地方,如果两者都存在于类中,那么虽然运行结果正确,但其运行过程会出现一些意向不到的步骤,导致程序运行效率降低。
下面的例子就是这个情况,代码如下:
//例4 //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者 #include <iostream> using namespace std; class Test { public: Test(int a = 0) { cout<<this<<":"<<"载入构造函数!"<<a<<endl; Test::a = a; } Test(Test &temp) { cout<<"载入拷贝构造函数!"<<endl; Test::a = temp.a; } ~Test() { cout<<this<<":"<<"载入析构函数!"<<this->a<<endl; cin.get(); } Test operator +(Test& temp2) { cout<<this<<"|"<<&temp2<<"载入加运算符重载函数!"<<endl; Test result(this->a+temp2.a); return result; } operator int() { cout<<this<<":"<<"载入转换运算符函数的内存地址:"<<this->a<<endl; return Test::a; } public: int a; }; int main() { Test a(100),b(100); cout<<"a的内存地址:"<<&a<<" | b的内存地址:"<<&b<<endl; Test c=a+b; cout<<"c的内存地址:"<<&c<<endl; cout<<c.a<<endl; system("pause"); }
运行过程见下图。

从图中我们可以清晰的看到,不必要的运算过程被执行,导致开销增大,读者在理解此例的时候要格外小心!
现在总结一下转换运算符的优点与缺点:
优点:在不提供带有类对象参数的运算符重载函数的情况下,转换运算符重载函数可以将类对象转换成需要的类型,然后进行运算,最后在构造成类对象,这一点和类的运算符重载函数有相同的功效。(例2就是这种情况)
缺点:如果一个类只有转换运算符重载函数,而没有真正意义上运算符重载函数,当用转换运算符重载函数替代运算符重载函数,进行工作的时候,就会让程序的可读性降低,歪曲了运算符操作的真正含义。(例2中的c=a+b;//隐式转换,就是例子,事实上a+b的作用只是对返回的整型数据进行了加运算,而对象赋值的操作是系统隐式的帮大家转换成了c=Test(a+b)。)
最后我们来说一下,多路径转换的多义性问题,多义性问题一直是C++编程中容易忽视的问题,但它的确是不容小视,当问题隐藏起来的时候你不会发觉,一旦触发麻烦就来了。 |