作为明年7月入职的职场新人,虽然大学里写了不少project,但实战经验匮乏,实在不是什么牛人。所以还是笨鸟先飞,在一段非常闲适的日子里买来了Effective C++,想进一步提升自我,在入职前打好基础,特此边研读边做笔记一份,有摘录有总结有自己的一些理解。我知道这玩意儿基本没什么人观摩,但万一有人走过路过,望不吝赐教。
Start
声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节。
std::size_t numDigits(int number);
每个函数的声明揭示其声明式:参数&返回类型
如上numDigits函数的签名是std::size_t(int),也就是说"这函数获得一个int 并返回一个std::size_t"。
定义式(Definition):提供编译器一些声明式所遗漏的细节。
定义式为对象分配内存;为function提供代码本体,为class列出其成员(构造)。
class Widget {
public:
Widget();
~Widget();
...
};
template<typenameT>
class GraphNode{
public:
GraphNode();
~GraphNode();
...
};
初始化(Initialization):给予对象初值。
用户自定义类型对象的初始化由构造函数执行;default构造函数要么没有参数,要么每个参数都有缺省值。
class A {
public:
explicit A (int x=0, bool b=true);
};
void doSth (A aObject);
A obj (28); //Right,根据28创建A,第二个参数bool被缺省为true
doSth(28); //Wrong,应该传入参数A,int与A之间不能隐式转换
doSth(A(28)); //Right, cast显式转换
用explicit声明构造函数,阻止了参数隐式类型转换的执行,但仍可进行显式类型转换;因此,除非有隐式转换需要,否则构造函数被鼓励声明为explicit。
copy构造函数:以同型对象初始化自我对象,构造函数的参数为另一同类型对象;
copyassignment操作符:从另一个同型对象中拷贝其值到自我对象,其实就是等号赋值。
class Widget
{
public:
Widget(); //default构造函数
Widget(const Widget& rhs); //copy构造函数
Widget& operator=(const Widget&rhs); //copy assignment操作符
...
};
Widget w1; //call the defaultconstructor
Widget w2(w1); //call the copyconstructor
w1 = w2; //call the copy assignment operator
Then:
Widget w3 =w2;
先用copy构造函数创建w3,再用w2(已定义的)进行等号赋值;值传递就意味着调用copy构造函数。
STL:标准模板库(Standard Template Library),C++标准程序库的一部分,致力于容器(vector,list,set,map,等等),迭代器(vector<int>::iterator,set<string>::iterator,等等), 算法(for_each,find,sort,等等)。
不明确行为(undefined behavior):某些C++构件的行为没有定义,无法稳定估计运行期会发生什么。
int *p = 0; // p为null指针
std::cout << *p; //对null指针取值
char name[] = "Darla";// name数组大小为6(尾端为null)
char c = name[10]; //指向一个无效的数组索引
尽可能避开不明确行为。