C++编程规范之29:考虑重载,以避免隐式类型转换

简介:

摘要:

    如无必要勿增对象:因素类型转换提供了语法上的便利。但是如果创建临时对象的工作并不不要而且适于优化,那么可以提供签名与常见参数类型精确匹配的重载函数,而且不会导致转换。

隐式转换最常见的例子是字符串的比较,见如下程序:

class string
{
         //......
         String(const char* text);
};
booloperator==(const String&, const String&);
//......代码中的某处......
if (something =="Hello")
{
         ......
}


 

    上述代码中,编译器将进行比较操作,但是“==”操作符的两边都是conststring,这时就会进行隐式转换,从char*隐式转换到string。这样会对程序的性能造成很大的影响,隐式转换操作会复制字符,但是我们只是比较,没有必要复制。

这一个问题的解决方法是:定义重载以避免转换。

booloperator==(const String& lhs, const String& rhs);
booloperator==(const String& lhs, const char* rhs);
booloperator==(const char* lhs, const String& rhs);


    这样看起来会有重复代码,但是这只是“签名重复”而已,因为所有三个重载通常都使用相同的后端函数。这样的简单重载,使你不可能掉入不成熟的优化的陷阱,而且提供它们只是小菜一碟,尤其是在设计程序库的时候,这时想要提前预测在性能敏感的代码中将出现哪些常见类型是很困难的。

相关文章
|
1月前
|
安全 编译器 程序员
【C++】C++的类型转换
【C++】C++的类型转换
|
19天前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
26 1
|
3天前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
16 2
|
26天前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
23 5
|
28天前
|
程序员 编译器 C++
c++重载运算符和重载函数
c++重载运算符和重载函数
26 1
|
30天前
|
存储 安全 程序员
C++中的四种类型转换运算符
reinterpret_cast` 则是非常危险的类型转换,仅用于二进制级别的解释,不检查安全性。`dynamic_cast` 用于类的继承层次间转换,向上转型总是安全的,向下转型时会借助 RTTI 进行安全性检查。只有当转换路径在继承链内时,转换才会成功。
13 1
|
17天前
|
编译器 C++
C++运算符的重载
C++运算符的重载
12 0
|
26天前
|
设计模式 编译器 Linux
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(中)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
21 0
|
26天前
|
安全 编译器 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(上)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
23 0
|
1月前
|
C++
C++ 重载 数组对象输入输出流的实现!!!
C++ 重载 数组对象输入输出流的实现!!!