【C++】Digest of 《effective C++》--1

《effective C++》阅读笔记01

  • size_t是c++计算个数时使用的某种不带正负号(unsigned)类型。它也是vector,deque和string内的operator[]函数接受的参数类型。

  • 分清楚声明式和定义式,对对象而言,定义式是编译器为此对象拨发内存的地点;对function 或function template而言,定义式提供了代码本身。

  • default构造函数要不没有参数,要不就是每个参数都有缺省值。

  class B {
  public:
    explicit B(int x = 0, bool b = true); //这也是一个default构造函数
  }

构造函数被声明为explicit可以阻止它们被用来执行隐式类型转换,但仍然可以执行显示类型转换。

void dosomething(B object) {...}

B oboj1;
dosomething(bobj1); //ok,因为dosomething接受的是一个B类型的对象
dosomething(28); //错误,dosomething接受一个B类型的对象,不是一个int, 而int和B之间没有隐式转换
dosomething(B(28)); //ok,用B的构造函数将int显式转换为B类型

因为我们一般不希望编译器执行非预期的类型转换,所以我们鼓励将构造函数声明为explicit

copy构造函数和copy assignment操作符

class A {
public:
    A();
    A(const A& a); // copy构造函数
    A& operator= (const A& a); //copy assignment操作符
    ...
};

A a1;
A a2 = a1; //调用copy构造函数
a2 = a1; //调用copy assignment操作符

构造一个新的对象时使用的是copy构造函数,而不用构造新对象时的普通赋值则是调用copy assignment操作符。

copy构造函数对于pass-by-value的传递方式是非常重要的。考虑

void func(A a) {...}

A a1;
func(a1);

这里类型A的对象是pass-by-value,所以a1是被复制进去的,因此会构造一个临时的A对象,这个临时的A对象就是用copy构造函数来完成的。

然而对于自定义类型来说,pass-by-reference是更好的选择

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值