1.extern关键字
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,
第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块和其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。
2.static 关键字的作用
static 修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在程序退出时销毁。
static 修饰全局变量时,全局变量本来就存储在静态区,static并不会改变他的属性,但是static会限制其链接属性,被static修饰的变量只能被包含该定义的文件访问。
static修饰函数时,函数只能在包含该函数定义的文件中被调用。(函数的声明和实现必须在一个文件下。)
3.关键字const与宏定义
4.内联函数inline的优劣
内敛函数的出现是为了节省函数调用的时间,就内联函数放在函数体中。正常的函数调用时间是有函数栈,参数栈,这样函数调用说额外多一点时间。使用inline之后可以节省时间。
劣势是inline编译的时候会放在函数体里,使得程序变大。
5.final和override
https://blog.csdn.net/lsfreeing/article/details/79598111
6.delete数组的一部分会发生什么,为什么这样
现将《Effective C++》中正确的观点、结论摘录如下:
当你使用new时,有两件事会发生。第一,内存被配置(透过函数operator new)。第二,会有一个(或以上)的constructors针对此内存被调用。当你使用delete时,也有两件事发生:一个(或以上)的destructors会针对此内存被调用,然后内存被释放(透过函数operator delete)。
如果你使用delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组。
string *stringPtr1 = new string;
string *stringPtr2 = new string[100];
……
delete stringPtr1;
delete [] stringPtr2;
如果你对着stringPtr1使用“[]”形式,其结果未定义。如果你对着stringPtr2没有使用“[]”形式,其结果亦未定义。犹有进者,这对内建型别如int者亦未定义,即使这类型别并没有destructors。
- 因此,游戏规则很简单,如果你在调用new时使用了[],则你在调用delete时也使用[],如果你在调用new的时候没有[],那么你也不应该在调用时使用[]。
7.系统是怎么知道指针越界的
8.C++编译器有哪些常见的优化
https://blog.csdn.net/dcrmg/article/details/51959808
8.mangling
https://blog.csdn.net/u013220338/article/details/51472322
9.成员函数指针了解么?可以转换为Void*么?为什么?
https://blog.csdn.net/acmdream/article/details/62038423
10.delegate是什么?实现思路?与event的区别?
11.使用过模板么?了解哪些特性?
https://www.cnblogs.com/pasoraku/archive/2013/04/12/3016782.html
12.听说过转发构造么?
13.C++中四种Cast的使用场景是什么?
https://blog.csdn.net/huilingwu/article/details/51960024
14.volatile是干啥的
https://www.cnblogs.com/god-of-death/p/7852394.html
15.share_prt与weak_ptr的区别?
share_prt 是智能指针
https://www.cnblogs.com/lsgxeva/p/7788061.html
16.C++四种类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast
https://www.cnblogs.com/chenyangchun/p/6795923.html
17.内存对齐的原则
https://www.cnblogs.com/zrtqsk/p/4371773.html
18.C++ 的内存管理
https://www.cnblogs.com/mrlsx/p/5411874.html
19delete和delete[]的区别
https://www.cnblogs.com/wangjian8888/p/7905176.html
20、molloc和new的区别
21手动实现strcpy函数、
char* strcpy(char *to,char *from){
if(NULL==to||NULL==from) //不检查指针的有效性,说明答题者不注重代码的健壮性。
throw "point error"; //应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。
int i;
for(i=0;from[i]!='\0';++i){//直接使用字面常量(如本例中的0)会减少程序的可维护性
to[i]=from[i];
}
return to;//return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值
}