Effective C++ 读后笔记五

条款20:宁以pass-by-reference-to-const替换pass-by-value

当需要传递对象作为函数参数时,通常是传递引用,而非传值。原因主要有以下两点:

1.传值的过程实际上是拷贝的过程,当类中有多个成员变量时,需要将所有的变量都拷贝一遍,效率比较低,而传递引用,则不存在拷贝,引用是原对象的别名。实际上操作的是同一个对象。

2.引用作为参数可以避免切割问题。当一个派生类的对象作为实参传递到一个基类作为形参的函数中时,你的本意是想输出派生类的信息,但是因为传值导致的切割问题,实际输出值是基类信息。很好理解,传值是拷贝,所以,当你传递的是派生类时,新生成的临时对象被强制转化为基类对象了,这就是切割。而传引用不存在这个问题是,引用的机制还是指针,当以派生类作为实参时,指针实际指向了派生类,所以可以得到理想的结果。常见的基本数据类型作为参数时还是建议传值,而非引用。
条款21:必须返回对象时,别妄想返回其reference

并不是说引用效率高,就所有对象都使用引用,要知道,引用是对象的别名,在决定使用引用时,要判断是否合理。比如,在重载*运算符时,假设返回的是引用。A c=a*b;即期望原本就存在一个值为a*b的值,并不合理。

条款22:将成员变量声明为private

将成员变量声明为private,就只有类的成员函数和friend函数可以访问他,避免了变量的多次操作,越少的人使用它,封装性就越强,将来要修改此变量的时候受影响的地方就越少,代码越灵活。

条款24:若所有参数皆需类型转换,请为此采用no-member函数

例如你要写一个类,实现复数相乘,恰巧你提供的却不全是class对象,其中一个为数值,这时就需要进行隐式类型转换,当把运算符写成成员函数时,默认是有一个this存在且就是形参的第一个参数,而第二个参数是我们自己定义的,当我们的构造函数是non-explicit时,我们定义的第二个参数是可以进行隐士转换的。如

Rational a;

result=a*2;合法

类似于Rational temp(2);

而result=2*a;不合法,原因是2不能转换为类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值