京东优惠的时候买了《More Effective C++》和《Effective C++》,在博客上记录下觉得有感触的地方。
条款一:仔细区别pointers和references
这个之前没有太多的关注,之前习惯是函数参数使用reference,然后再通过是否加const来修饰改参数是否可以被修改,这个是不知道什么时候的习惯了。这个条款的总结,可以作为一个参考:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其他语法需求无法由pointers打成,就应该选用references。其他任何时候,请采用pointers。
简要摘录下两者的区别:</div><div>reference无法指向null,对null的引用是未定义的行为,如果使用了reference一般不需要判断这个对象是否是Null,直接使用就好了,指针总要判断是否为null,否则就是恶心的段错误(昨天还刚解决了一个对null指针进行操作引起的段错误);reference指向的对象,之后无法修改,pointer可以。
[cce lang="cpp"]
string s1("a");
string s2("b");
string& rs = s1; //将rs声明为reference,指向s1
rs = s2; //这里执行的是string的operator=,作用是将s1内容变成了"b"
[/cce]
条款三:绝对不要以多态方式处理数组
这里写的是“绝对不要”,看了下主要原因是因为数组的下标操作,需要sizeof数组成员,然后进行偏移,而多态方式大多都直接用基类对象,会导致偏移的长度错乱。
“多态和指针算数不能混用”。
条款三:绝对不要以多态方式处理数组
比如Base arr[3]; 数组的三个元素其实是Base的子类,这样的场景不能使用arr[i]来取数组的第i个元素,是这样的吗?
恩,这种情况下只能存指针,存对象的化,编译器没法通过sizeof来获取对象的偏移量。
嗯,了解了。