C++编程规范之30:避免重载&&,||或,(逗号)

简介:

摘要:

    明智就是知道合适适可而止:内置的&&,||和,(逗号)得到了编译器的特殊照顾。如果重载它们,它们就会变成普通函数,具有完全不同的语义(这将违反地26条:保持重载操作符的自然语义和第31条:不要编写依赖函数参数求值顺序的代码),这肯定会引入微妙的错误和缺陷。不要轻率地重载这些操作符。

    不能重载operator&&、operator||或者operator,的主要原因是,无法在三种情况下实现内置操作符的完整语义,而程序员通常都会需要这些语义。说的更具体一些,就是内置版本的特殊之处在于它是从左到右求职,而且&&和||还使用短路求值。

    内置版本的&&和||首先计算左边表达式的值,如果这个值能够决定结果,就不会计算第二个表达式的值,但是如果重载&&和||,这些函数在调用在执行执行总是对所有的参数进行求值,同时函数参数的求值顺序是不确定的。

    逗号操作符也存在同样的脆弱性。与&&和||一样,内置逗号保证其表达式是从左到右按顺序求值的。用户自定义的逗号操作符无法保证是从左到右求值。

相关文章
|
1月前
|
C++
C++类自加自减与<<运算符的重载实现
C++类自加自减与<<运算符的重载实现
|
2月前
|
自然语言处理 算法 Java
C/C++ 程序员编程规范之注释
C/C++ 程序员编程规范之注释
45 1
|
2月前
|
编译器 C++
c++重载函数和重载运算符
c++重载函数和重载运算符
20 0
|
2月前
|
存储 算法 编译器
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
【C++ 内存管理 重载new/delete 运算符 新特性】深入探索C++14 新的/删除的省略(new/delete elision)的原理与应用
56 0
|
2月前
|
算法 C++ 开发者
【C++运算符重载】深入理解C++中的流运算符 >>和<<重载
【C++运算符重载】深入理解C++中的流运算符 >>和<<重载
38 0
|
2天前
|
编译器 C++
【C++】类与对象(运算符重载、const成员、取地址重载)
【C++】类与对象(运算符重载、const成员、取地址重载)
8 2
|
2天前
|
编译器 C语言 C++
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
6 1
【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)
|
6天前
|
C++
【C++小小知识点】重载、覆盖(重写)、隐藏(重定义)的对比【详解】(23)
【C++小小知识点】重载、覆盖(重写)、隐藏(重定义)的对比【详解】(23)
|
2月前
|
算法 安全 编译器
【C++运算符重载】深入理解C++中的类型转换与重载
【C++运算符重载】深入理解C++中的类型转换与重载
30 0
|
2月前
|
算法 程序员 C++
【C++运算符重载】探究C++中的下标运算符[]重载
【C++运算符重载】探究C++中的下标运算符[]重载
14 0