Essential C++ 笔记 - 第二章面向过程的编程风格
一、传址与传值
// 传值(by value)
void swap(int val1, int val2) {
int temp = val1;
val1 = val2;
val2 = temp;
} // 调用函数swap后,val1和val2的值不互换
//传址(by reference)
void swap(int& val1, int& val2) {
int temp = val1;
val1 = val2;
val2 = temp;
} // 调用函数swap后,val1和val2的值互换
void swap(int* val1, int* val2) {
int temp = *val1;
*val1 = *val2;
*val2 = temp;
} // 调用函数swap后,val1和val2的值互换
// 传址的方式让函数的参数和传入的实际对象产生了关联,函数内对入参的改变会影响到实际对象。
将参数声明为reference的理由:
1、希望得以直接对所传入的对象进行修改
2、降低复制大型对象的负担
reference参数和pointer参数的区别:
pointer可能不指向某个实际对象,当提领pointer时,需要先确定其值非0
reference必定会代表某个对象
二、动态内存管理
int* pi = new int; // 未初始化
int* pi = new int(); // 零值初始化
int* pi = new int(1024);// 定值初始化,初始化为1024
delete pi; // 删除new的单个对象
pi = nullptr;
int* pia = new int[24]; // 生成一个数组对象
delete [] pia; // 删除new的数组对象
pia = nullptr;
三、局部静态对象
// 函数返回后,局部静态对象仍然存在
// 在其他函数中仍然可以访问elems中的内容
vector<int>* fibon_seq(int size) {
static vector<int> elems;
// ...
return &elems;
}
四、函数重载( overloading )
// 传入的参数表不相同,调用同名但内容不相同的程序。
void display_message(char);
// 传入参数类型不同
void display_message(const string&);
// 传入参数数目不同
void display_message(char, char);
// const重载
void display_message(char) const;
// 传入参数的顺序不同
void display_message(char, int);
void display_message(int, char);
// 返回值不同不能作为函数重载的依据
// 如果函数形参是指针或引用通过const修饰,则是函数重载;否则不是函数重载
void display_message(char* c);
void display_message(const char* c);
// 编译通过
void display_message(char c);
void display_message(const char c);
// 编译失败
五、函数指针( Pointer to Functions )
// 函数指针的应用
const vector<int>* fibon_seq(int size);
const vector<int>* lucas_seq(int size);
const vector<int>* pell_seq(int size);
bool seq_elem(int pos, int& elem, const vector<int>* (*seq_ptr)(int)) {
// ...
}
// 使用fibon_seq、lucas_seq、pell_seq作为函数seq_elem的入参
六、头文件
头文件使用尖括号(<>)和双引号的区别:
如果该文件被认定是标准的或者项目专属的头文件,我们便以尖括号将文件名括住,编译器搜寻此文件时,会先在某些默认的驱动器目录中找寻;
如果该文件时由双引号括住的,此文件便被认为时一个用户自行提供的头文件,编译器搜寻此文件时,会由含入此文件的文件苏哦在驱动器目录开始找起。