Effictive C++ 第一章 让自已习惯c++

第一章 让自已习惯c++
1,将c++视为一个联邦
从一个次语言迁移到另一个次语言的时候,原则可能改变.这一些次语言包括C语言 面向对象 模板元编程 STL 比如就内置类型 C编程时侯传值要比传引用高效但面向对象时对于自定义类型则反之
2,用const enum inline 代替#define
首先为什么要代替#define 因为他没有作用域和封装的概念,然后他是预编译指令我们看到的和编译器看到的并不用,夜编译进行的替换可能会导致错误。
#define a (1.23)
const b=1.23
这里的a并不会进入符号表而b可以而且替换产生的代码量要大于常量
有一个特殊的规定 类的静态常量如果是整型(int char enum)可以在声明的时候赋初值但这不是定义而且不需亚定义,除非需要取地址的时候
class a
{
private: static const int m=5;//这是声明
}
const int a::m;//这是定义
遗憾的是不是所有的编译器都支持这种in-class初值设定但有时又需要声明时指定初值 比如
class a{
private: static const int m=5;
int num[m];
}
数组需要声明时指定大小且为常量 解决办法为用enum替代
enum{m=5}
我们经常这样写
#define MAX(a,b) ((a)>(b)?(a):(b))
这样写的好处是可以避免函数调用的开销,但是由于预编译替换的原因,使得可能出现未知的错误,即使你的实参都加了括号。比如
int a=5,b-0;
MAX(++a,b);
int a=5,b=10;
MAX(++a,b)
前者执行完a=7,后者a=6 这取决于和谁比较
为了得到宏的快捷和函数的安全性(作用域与访问限制)我们可以写成template inline的函数
template
inline int MAX(const &T a,const &T b)
{
return (a>b?a:b);
}
宏我们可以用const enum和inline处理,但是#include,#ifdef等预编译指令是目前无法替代的
3.尽量使用const
如果已经知道这个值不变,那么就告诉编译器,让编译器帮助你检查
const int *p与int const *p一样都是不能通过他改变指向的值 称为指常量指针,他被称为底层const low level const
int const p 不能改变指针指向的地址 称为指针常量,他被称为顶层const top level const
当const 作用在STL上时
const vector::iterator p等价于T
const p 是常量指针指针本身不能变也就不能递增或递减而要定义指针常量需用vector ::const_iterator p 它可以递增递减但不能通过它改变指向的值
const 真正有威力的是它可以和函数的返回值 形参和函数本身联合使用
const multipy operator (const &op1,const &op2){}
它重载了乘法返回常量意味着,操作后的值不能改变比如if(a
b=c)这种笔误就无效
const 成员函数的含义为,不能通过这个函数修改类的非静态变量,如果2个成员断数只有是不是const 的区别那么他俩可以被重载,重载的区别就是是否为常量对象调用
char& operator [](const int pos){return text[pos]}
const char& operator[](const int pos) const{return text[pos];}
T tb
tb[0]=0调用前者合法
const T ctb
ctb[0]=0 调用后者不合法 同为他返回的是常量引用
这里返回值为引用是必要的 如果是char那么被赋值的是个副本第一个存储位置的值不会变
bitwise const与logical const的区别没看懂
补充有关const形参凼叛的重载和隐式转换的内容,
4.保证变量的初始化
构造函数:
自定义类的初始化通过构造函数实现,需要说明的是,在进入构造函数体执行的赋值语句,不算初始化。所谓的初始化是动作在进入构造函数之前。1在构造函数内部赋值的操作其实分为两步,先调用default构造函数为类的变量初始化,然后这些变量立即在函数体内赋予新值,default构造函数做的工作都浪费了,效率低。所以都是采用构造函数初始化列表的形式实现,初始化列表在初始化的时候调用的是拷贝构造函数。
初始化顺序:
变量的初始化顺序去取决于声明顺序,与在初始化列表中的顺序无关
不同编译单元内定义的非局部static变量的初始化顺序:
static可以定义在namaspace、class、file和函数中,其中在函数中的是local static,其他所有的都是non-local static.由于不同编译单元内定义的非局部static变量的初始化顺序是不确定的,所以当一个编译单元内定义的非局部static变量用另一个编译单元内定义的非局部static变量初始化,那么他的值是不确定的。解决的方案,就是将non-local变成local,具体来讲,为这个变量写一个函数,在函数内部定义为static形式,并且返回他的引用。原理在于,C++保证,函数内的non local static对象在该函数调用期间,首次遇到定义时被初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值