more effective c++基础议题

条款一:区别引用和指针


1.不能引用空(比指针效率高,不必测试空)
2.引用总是指向最初获取的那个对象(不变性)
3.某些操作符按其语法需求,无法由指针完成,就应选择引用。(某些语法需求)
比如重载 operator[ ] 
vector<int> v(10);
v[5] = 10; // 返回值是引用
如果返回值是指针,则 *v[5] = 10; // 不符合正常操作

其他情况,用指针吧

----------------------------------------------------------------------------------------------

条款二:最好使用C++转型操作符


static_cast / const_cast / dynamic_cast / reinterpret_cast
1.一般转化 用static_cast
2.去常限制 用const_cast
3.(逻辑)继承体系转化  dynamic_cast / static_cast
优先使用dynamic_cast (父-->子)
原因:1.安全(不成功返回空)
            2.类型必须要有虚函数
dynamic_cast”:“Base”不是多态类型
4.(物理)二进制级转化 用reinterpret_cast
reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类

型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,

这是所有映射中最危险的。(这句话是C++编程思想中的原话)
    char *pc = "hello";
    int *pn = reinterpret_cast<int*>(pc);

C的转型,在类中也是逻辑的,但是不是动态的,如 C 继承 A,B, 把A转化成B,C的转型就不如dynamic_cast灵活和动态。static_cast会编译出错
尽量少使用转型!

举例(逻辑与物理)

----------------------------------------------------------------------------------------------




----------------------------------------------------------------------------------------------

条款三:不要以多态方式使用数组


Base array[10]      
Derived array2[10]
void printArray(const Base *array, int n) {
for (int i = 0; i < n; i++)
cout << array[i] << endl;
}
或者通过Base指针删除Derived objects组成的数组
Base *pB = new Derived[10];
void deleteArray(Base *array) { delete [ ] array; }  

多态和指针算数不能混用!
具体类不要继承另一个具体类。


----------------------------------------------------------------------------------------------

条款四:非必要不提供默认构造函数


缺乏默认构造函数会带来一些束缚:
1. Base  array[10].将不能成功
2.对于许多基于模板的容器,要求目标类型必须有默认构造函数


那我需要刻意提供一个吗?如 Base(int num = UNSPECIFIED)
没必要,反而增加判断,影响程序效率。


可以存指针,再开辟空间。(为了节省空间开销,可以使用定位new,但是要注意删除的格式。
大部分情况下,如果谨慎设计template,可以消除对default constructor的需求,如vector.





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值