<More Effective C++>笔记--运算符

本文探讨了C++中运算符重载的关键实践,包括谨慎定义类型转换函数、区分自增自减运算符的前后置形式、避免重载逻辑运算符及正确使用new和delete。通过具体实例说明如何避免常见陷阱。

2 运算符
~~~~~~~~~

2.1 谨慎定义类型转换函数
=========================
   1. 有两种函数允许编译器进行隐式类型转换:
      * 单参数构造函数(包括除了第一个参数,所有参数都有缺省值得情况)
      * 隐式类型转换运算符
        隐式类型转换运算符只是一个样子奇怪的成员函数:operator 关键字,其后跟一个类型符号。你不用定义函数的返回类型,因为返回类型就是这个函数的名字。
   2. explicit关键字,只会拒绝隐式类型转换而调用构造函数。显式类型转换依然合法。
   3. 隐式类型转换只会转换一次,即不会A转成B再转成C
 

 
  1. struct B 
  2.     B(int){}; 
  3. }; 
  4. struct D2 
  5.     D2(B ){}; 
  6. }; 
  7. void test(D2) 
  8.     cout<<"D2 created"<<endl; 
  9. int main() 
  10.     test(1);  //编译出错,不能int->B->D2 



2.2 区别自增和自减operator的前置和后置形式
===========================================
   1. 前置operator不带参数,而后置operator带一个int参数,在调用时,编译器自动赋值为0
   2. 前置返回一个reference,而后置返回一个const对象(主要是为了防止i++++能够编译通过,而且i只增加一次,不合逻辑)
   3. 后置式operator的实现应该以前置式operator为基础。

2.3 千万不要重载&&,||和,操作符(因为你永远无法模拟它们)
==========================================================
   1. C++对&&和||采取“骤死式”的评估方式。
      然而当重定义这些运算符时,“函数调用语义”会取代“骤死式语义”。
      “函数调用语义”意味着:所有参数都必须评估完成,各参数评估的次序未知
   2. C++对,的评估方式为:逗号左边会先评估,然后逗号的右边再被评估,最后整个逗号表达式的结果以逗号右边的值为代表。

2.4 了解不同意义的new和delete
==============================
   1. new operator(也叫new表达式)和operator new是不同的
      A* a = new A(),这里的new是new operator,它是C++内置的,你不能改变它的意义(无法重载),它总是先分配足够内存然后调用构造函数初始化内存中的对象。
      new operator调用operator new来完成第一部分内存的分配步骤,operator new能够被重载
   2. 当调用new operator来分配数组时,就不是调用operator new来分配内存,而是调用operator new[]来分配内存
   3. operator new通常声明为void* operator new(size_t size);这里返回类型为void*因为函数返回的是一个未初始化内存的指针。
      你能够增加额外的参数重载函数operator new,但是第一个参数类型必须是size_t
   4. delete operator和operator delete也是类似的不同。
 

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1162476

这段 Maven 仓库配置代码的作用是指定一个远程仓库,让 Maven 在查找依赖时可以从该仓库获取所需的构件。以下是对这段配置的详细分析: ### 配置作用 - **指定远程仓库**:配置中 `url` 为 `http://maven.aliyun.com/nexus/content/groups/public/`,这表明将阿里云的 Maven 公共仓库作为远程仓库。当本地仓库没有所需的构件时,Maven 会尝试从该远程仓库下载。 - **控制发布版本和快照版本**: - `&lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;` 表示允许从该仓库下载发布版本的构件。 - `&lt;snapshots&gt;&lt;enabled&gt;false&lt;/enabled&gt;&lt;/snapshots&gt;` 表示不允许从该仓库下载快照版本的构件。 ### 配置正确性 该配置在语法上是正确的。`id` 用于唯一标识该仓库,`name` 是仓库的名称,`url` 指向正确的阿里云 Maven 仓库地址,`releases` 和 `snapshots` 的启用状态配置也符合常见的使用场景,通常在正式项目中,不希望使用不稳定的快照版本,所以禁用快照版本的下载。 ### 使用注意事项 - **网络问题**:由于该仓库是远程仓库,需要确保网络可以正常访问 `http://maven.aliyun.com`。如果网络不通,Maven 将无法从该仓库下载构件。 - **仓库更新**:如果仓库中的构件有更新,Maven 可能会使用本地缓存的旧版本。可以使用 `mvn clean install -U` 命令强制更新依赖 [^4]。 - **本地缓存**:如果遇到依赖下载问题,可以尝试清理本地 Maven 缓存,删除 `~/.m2/repository` 目录下相关的构件目录后重新构建 [^4]。 ### 代码示例 以下是将上述仓库配置添加到 `pom.xml` 文件中的完整示例: ```xml &lt;project&gt; &lt;!-- 其他配置 --&gt; &lt;repositories&gt; &lt;repository&gt; &lt;id&gt;nexus-aliyun&lt;/id&gt; &lt;name&gt;nexus-aliyun&lt;/name&gt; &lt;url&gt;http://maven.aliyun.com/nexus/content/groups/public/&lt;/url&gt; &lt;releases&gt; &lt;enabled&gt;true&lt;/enabled&gt; &lt;/releases&gt; &lt;snapshots&gt; &lt;enabled&gt;false&lt;/enabled&gt; &lt;/snapshots&gt; &lt;/repository&gt; &lt;/repositories&gt; &lt;!-- 其他配置 --&gt; &lt;/project&gt; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值