1、在C++程序中调用被C编译器编译后的函数,为什么要加 extern "C"?
答案:C语言不支持函数重载,C++ 提供了C连接交换制定符号extern "C"解决名字匹配问题。
2、如何判断一段程序是由C编译程序还是由C++编译程序编译的?
答案:C++编译时定义了_cplusplus。C编译时定义了_STDC_。
3、main主函数执行完毕后,是否可能会再执行一段代码?给出说明。
答案:如果需要加入一段在main退出后执行的代码,可以使用atexit()函数注册一个函数,代码为:int atexit(void (*funciton)(void));
4、用预处理指令#define声明一个常数,用以表明一年中有多少秒(忽略闰年问题)。
答案:#defineSECONDS_PER_YEAR (60*60*24*365)UL 注意括号,同时不能用分号,不要写出计算出来的实际值,用到无符号长整型。
const
int bufsize = 100; //在C++中注意此处int一定不可少,因为c++中不支持默认int型
char buf[bufsize]; //在C++中这样写没问题
const bufsize; //在C中这样写没问题,但是在C++中是有错误的。
//要做同样的事情,C++需改强制声明为extern:externconst bufsize;
答案:#define MIN(A,B) ((A)<=(B)?(A):(B))
}A; //以最长元素的为对齐单位,sizeof(A)=2+2+2=6
}B; //以最长元素为对齐单位,即为的整数倍,sizeof(B) = 4+2+补齐两位= 8
}; //sizeof(A) = 8,注意:数据对齐,同时静态变量是存放在全局数据区的,sizeof只计算栈中分配的大小。
答案:1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int类型;
3)sizeof可以用类型作参数,还可以用函数作参数(相当于以函数返回值类型作参数);strlen只能用char*做参数,且必须是以"\0"结尾的;
4)数组做sizeof的参数不退化,传递给strlen就退化为指针;
5)sizeof是在编译的时候计算的,strlen是在运行的时候才计算的;
6)sizeof后如果是类型必须加括号,如果是变量名可以不加括号;
7)当使用了一个结构类型或是变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的大小。sizeof不能返回被动态分配的数组或外部数组的大小;
8)sizeof操作符不能用于函数类型、不完全类型或位字段;
char a[7] ="a0\0a0\0"; //strlen(a) =2, sizeof(a) = 7
printf("len = %d\tsizeof = %d\n",strlen(a),sizeof(a));
}; //sizeof(A) = 4,因为静态变量存储在全局数据区,而sizeof计算栈中分配的大小。
答案:一个空类所占空间为1,多重继承的空类所占空间还是1.但是如果是虚继承的话,因为涉及到虚函数表(虚指针),所以其所占空间为4.
2)合法性区别。只用引用之前不要测试它的合法性,而指针则应该总是被测试,防止其为空。
3)可修改。指针可以被重新赋值以指向另一个不同的对象,但是引用则总是指向在初始化时被指定的对象。
4)应用区别。在以下情况下应该使用指针:一是考虑到存在不指向任何对象的可能(这种情况下能够设指针为空),二是需要能够在不同的时刻指向不同的对象(这种情况能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。
答案:1)this只能在成员函数中使用,全局函数和静态函数都不能使用this,只有在成员函数里才有this指针的位置;
3)This指针会因编译器不同而有不同的存放位置,可能是栈,也可能是寄存器或者全局变量;
4)大多数编译器通过ecx寄存器传递this指针,在call之前,编译器会把对应的对象地址放到eax中。This是通过函数的首参数来传递的;
5)普通的类函数都不会创建一个函数表来保存函数指针,只有虚函数才会被放到函数表中。