台湾菜

C++学习笔记整理

twcai • c/c++

最近一直在翻Windows核心编程,记笔记时发现以前看C++写的一些东西,决定好好整理下,当作复习。

指针和迭代器
const_iterator是指向const的对象的迭代器,类似const ctype *ptr,无法通过它给所指的对象赋值。
注意:用iterator访问vector时,vector长度的改变可能使iterator失效; 把const的对象地址赋给一个非const的指针是非法的。

常量指针:

ctype *const ptr = &val;

// 下面是另一种用法:
typedef string *pstring;
const pstring cstr;

指向多维数组的指针的使用

int a[3][5];
int (*p)[5] = a;

delete函数
在释放指向数组的指针指向的内存时,不要遗漏方括号。这是内存泄漏的原因之一。
正确做法:delete [] arrayname;

函数指针
定义一个函数指针跟定义一个多维数组指针比较像,需要用到括号。
e.g.

int (*ptr) (const int &, const int &);

// 下面的方法与上一行等价
typedef int (*CMP) (const int &, const int &);
int IntegerCmp (const int &, const int &);
CMP cmp = IntegerCmp;

// 调用函数指针:
cmp(1, 2);


更容易混淆的是返回函数指针的函数
e.g.
int (*foo(int)) (int, int);
这个函数返回的是一个指向函数的指针:int (*) (int , int)

构造函数初始化列表的用法
e.g.

class Example {
public:
string str;

Example(const string &s) : str(s) {};
};


构造函数定义的隐式转换
e.g.

class Example2 {
public:
Example ex;
int cnt;

Example2(const Example &x) : ex(x), cnt(0) { };
};

// 调用
string stmp = "This is an example.";
Example2 ex2(stmp);


默认实参
主要需要注意参数顺序问题。默认的参数必须靠右,不能与实际接受的参数交错。

comments powered by Disqus