1. 为什么要使用 extern "C" ?
C++和C语言的编译方式有一些区别, extern "C" 是 为了让CPP和C接口能够通用。
CPP支持多态性,具有相同函数名但参数不同的函数,可以通过参数区分具体调用的是哪一个函数。在编译的时候,CPP编译器会将参数类型和函数名连接在一起,编译成为目标文件。
但是在C语言中没有多态性的概念。C编译器在编译时只会在函数名前面添加一个下划线。由于这种的原因,当采用CPP与C混合编程的时候,就可能会出问题.
例如:
头文件中定义了这样一个函数: int foo(int a, int b);
而这个函数的实现位于一个.c文件中,同时,在.cpp文件中调用了这个函数。
那么,当CPP编译器编译这个函数的时候,就有可能会把这个函数名改成_fooii,这里的ii表示函数的第一参数和第二参数都是整型。
而C编译器却有可能将这个函数名编译成_foo。
连接器工作的时候,发现在.cpp中调用了foo()函数,但是在目标文件中却找不到_fooii这个符号,于是提示连接过程出错。
extern "C" {}这种语法形式就是用来解决这个问题的。 把_foo改成_fooii进行编译。
2. 指针相减操作
以下代码的输出结果是什么?
double dArray[2] = {4, 8}, *p, *q;
p = &dArray[0];
q = p + 1;
cout << q – p << endl;
cout << (int)q - (int)p << endl;
结果: 1 和 8
解释: 第一个是指针加减,按照的是指向地址类型的加减,只跟类型位置有关。q 和p 指向的数据类型以实际数据类型来算差一个位置,因此是1。
而第二个加减是实际指针值得加减,在内存中一个double类型占据8个字节,因此是8
3. 默认构造函数
按默认构造函数定义对象,不需要加括号
4. 三元表达式
三元表达式“?:”问号后面的两个操作数必须为同一类型
5. 变量与常量
把一个变量赋值给一个常量,常量会变成变量