- 三四五三章声明也没有写,讲的是运算符循环语句啥的,感觉没有什么好记的。
- 迭代器记得加取地址符*。对前面一些知识的小结。
#include <iostream> #include <vector> using namespace std; const int maxn = 210; vector<int> a(10,0); int main() { auto x=a.begin(); auto y=a.end(); for(decltype(x) i=x;i!=y;i++) cout<< *i << endl; return 0; }
- 假设
it
是个int
型的vector
迭代器。(*it).empty()
表示先对it
解引用,然后执行点运算符,调用结果对象的empty
成员。箭头运算符->
就是把解引用和成员访问两个操作结合在了一起。 - 某些时候,有必要令局部变量的生命周期贯穿函数调用以及之后的时间。可以将局部变量定义成
static
类型。局部静态对象直到程序的终止才会被销毁。 int *matrix[10]
表示的是10个指针构成的数组。int (*matrix)[10]
表示的是指向含有10个整数的数组的指针。- 和所有数组一样,当将多维数组传递给函数的时候,真正传递的是指向数组首元素的指针。因为我们处理的是数组的数组,所以元素本身就是一个数组,指针就是一个指向数组的指针。
- 可变形参:
initializer_list
也是一种模板类型。void error_msg(initializer_list<string> il) { for(auto beg = il.begin();beg != il.end();++beg) cout << *beg << " "; cout << endl; }
- 不要返回局部对象的引用或者是指针。因为函数完成后,它所占的空间也会被随之释放掉。因此,函数终止意味着局部变量的引用将指向不再有效的内存区域。但是可以单纯的值返回,即return一个局部变量的值。
- 函数的重载:如果同一个作用域内的几个函数名字相同但形参不用,称之为重载。当调用这些函数的时候,编译器会根据传递的实参类型推断想要的是哪个函数。main函数不能重载。
- 指针本身是一个对象,它又可以指向另外一个对象。因此,指针本身是不是常量以及所指的是不是一个常量就是两个相互独立的问题。 顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量。
- 函数匹配指我们把函数调用和某一组的重载函数中的某一个关联起来。也叫作重载确定。
- 内联函数:将函数制定为内联函数,通常就是将它在每个调用点伤“内联地”展开。从而消除了函数在运行时的开销。
- 函数指针指向的是函数而非对象()指向某种特定的类型,函数的类型由它的返回类型和形参类型决定的,与函数名无关。
bool lengthCompare(const string &, const string &) //该函数的类型是bool (const string&, const string &) bool (*pf)(const string &,const string &) //声明该类型的函数指针
- 当我们把函数名作为一个值使用的时候,该函数自动转换成指针。例如按照下面的形式我们可以将lengthCompare的地址赋给pf:
pf = lengthCompare; pf = &lengthCompare;//等价的复制语句,取地址符可选
- 此外我们还可以直接使用指向函数的指针调用该函数,无需提前解引用指针:
bool b1 = pf("hello","goodbye"); bool b2 = (*pf)("hello", "goodbye");
- 每一章后面的小结还是非常有用的。有机会的话可以回顾一下。