基础知识搜集整理下,以后查看复习什么的方便一点。
-
extern "C"使用
主要用于混合语言编程。比如说C语言调用C++开发的DLL,由于C++语言编译后的 函数符号表是带参数类型的,而C语言编译后函数符号表是不带参数类型的。所以要想在C语言中调用C++的DLL,DLL中导出的函数必须加上extern "C".
例:void foo(int, int )函数
C++编译后,生成 _foo_int_int 之类的符号
C语言编译后,生成_foo之类的符号,不带参数类型,所以C语言不支持函数重载
有关于extern "C"的具体介绍,百度百科讲的比较详细,这里列一个链接 http://baike.baidu.com/view/2816461.htm?fromId=2814224
2. 静态成员函数不能调用成员变量,因为不含this指针。
3. __cdecl 和 __stdcall
__cdecl 是C语言函数调用约定,__stdcall 是C++函数调用约定。参数都是从右到左依次入栈,__stdcall需要在编译时就确定参数个数,因为使用该约定的函数是函数自己清栈,清栈的时候要知道参数个数。__cdecl约定的函数由调用者清栈,所以函数参数个数在编译期可以不确定,可以出现类似 int add(int a, int b, ...) 形式的函数。
4. 数组指针和指针数组
数组指针是一个指针,指针数组是一个数组。
例:int a[2][2] = {{1,2}, {3,4}};
int (*p)[2] = a; //数组指针,只定义了一个指针p。 (*p)[0] 等价于 a[0][0], (*p)[1] 等价于 a[0][1]
int *pp[2] ; //指针数组,[]的优先级比*的优先级高,所以先结合成p[],定义了一个指针数组,pp[0]和pp[1].
5. 指针和引用区别
引用是定义时就要初始化,初始化之后就不可再更改,而指针初始化之后可以更改。
例: int a = 5; int b = 6;
int &c = a; //c是a的引用,以后c一直是a的引用,不会更改,可以理解为 int * const pp, 这个 (*pp)就等价于c;
int *p; //指针可以先不初始化,只是声明
p = &b; //OK,指针初始化之后还可以指向其他地址
c = b; //此时c还是a的引用,只是把b的值赋给了c;该语句后,a 等于 6