【More Effective C++】操作符
条款五:对定制的类型转换函数保持警觉
两类可以由编译器完成类型转换的函数:单变量constructor和隐式类型转换操作符,其中隐式类型转换函数
1 class Rational{ 2 public: 3 Rational(int numerator = 0, int denominaion = 1); 4 operator double() const; //隐式类型转换函数 5 private: 6 int a; 7 int b; 8 } 9 10 11 Rational::Rational(int numerator = 0, int denominaion = 1){ 12 a=numerator ; 13 b=denominaion ; 14 } 15 16 Rational::operator double() const 17 { 18 return (double)a/b; 19 }
- 可利用explicit关键词修饰constructor来禁止自动隐式转换
- 一个程序不可能完成两次及以上的隐式转换过程
条款六:自增和自减的前置后置形式
- 前自增(自减)返回一个引用,后自增返回const对象
条款七:勿重载&&,||和,操作符
- C/C++对真假表达式采用骤死式评估,即语句中的第一个表达式就能确定该语句的结果那么就不会检验该语句中剩余部分
- 重载&&和||会使得骤死式评估方式失效,产生不可预见的后果
条款八:operator new和new operator
- 经常使用的new是new operator,该过程分为两步骤:1、分配足够的内存。2、调用类的constructor构造对象
- 分配内存需要调用函数operator new,该函数可单独使用可以重载,重载之后使用new operator就会调用新的函数
1 void * operator new(size_t size); 2 void * classA = operator new(sizeof(classA));//用法,只分配内存,不调用constructor
- 在已分配的内存中构造对象使用placement new,会调用constructor,不会调用deconstructor,该方法可在栈中生成对象
1 void * operator new(size_t, void * location){ //placement new形式 2 return location; 3 } 4 5 //placement new用法:buffer内存地址,paramete构造函数参数 6 classA * constructorclassA(void * buffer, int paramete){ 7 return new (buffer) classA(paramete); 8 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现