导读
1.关于声明:告诉编译器某个东西的名称和类型,但略去细节。std::size_t numDigits(int number);
2.关于定义:提供编译器一些声明所遗漏的细节
- 对对象而言,编译器为此对象拨发内存的地点;
- 对function或function template而言,提供代码本体;
- 对class或class tempalte而言,是列出它们的成员。
3.关于初始化:给对象赋值的过程
4.区分copy构造和copy赋值:如果一个新对象被定义,一定会有一个构造函数被调用Widget w1=w2
;没有新对象被定义,就不会有构造函数被调用w1=w2
,那么当然是赋值操作被调用了。
5.命名习惯:
- lhs,rhs
- Widget *pw,Ariplan *pa…..
1.让自己习惯C++
1.四大块:C、Objected-Oriented C++、Template C++、STL;
2.尽量使用const,enum,inline替换#define;
- const定义常量指针,定义class专属常量
- #ifdef/#ifndef还在使用
- 对于单纯常量,多使用const或enums
- 对于形似函数的宏,最好改用inline函数
3.const的妙用:
- 1)与指针的搭配:
char greetint[]="Hello"
const char *p=greeting;//指向常量
char const *p=greeting;//同上
char* const p=greeting;//指针自身是常亮
const char* const p=greeting;//两者
- 2)与函数的结合:
1.返回常量值:防止返回值被改变;
2.const参数:除非需要改动,否则一定声明为const参数;
3.const成员函数:一、可以比较容易知道哪个函数可改变对象,二、操作const对象成为可能;
4.成员变量前加mutable,即使在const成员函数内也可更改
5.const和non-const函数避免重复:使用const_cast转型,让no-const调用const版本,避免重复;
- 3)确定对象被使用前已被初始化
1.为内置类型采用手工初始化;
2.构造函数最好使用成员初始值列,其排序应该和他们在class声明的次序相同;
3.位免除“跨编译单元之初始化次序”问题,以local static对象替换non-local static对象。