1.static关键字的作用?
(1)定义全局变量时加上static关键字修饰,表明该全局变量为静态全局变量,作用域为当前文件;
(2)函数定义或声明时加static 关键字修饰,为静态函数,只能在本文件中被调用;
(3)定义局部变量时,用static关键字表示其为静态局部变量,只被初始化一次,之后每次调用函数时,该变量值为上次函数退出时的值。
2.gcc与g++的区别?
(1)对于.c后缀文件来说,gcc将其看作是c程序,g++则将其看成c++程序;
(2)对于.cpp后缀文件,gcc与g++都将其看成c++程序;
(3)在编译阶段,g++会调用gcc;
(4)连接阶段,通常会调用g++完成,因为gcc命令不能自动和c++程序使用的库连接。
3.静态库与共享库(动态库)的区别?
两者不同的原因在于代码被载入的时刻不同。
静态库在程序编译时会被连接到目标代码中,程序在运行时不再需要动态库,其移植方便,体积较大,缺点是浪费空间和资源,因为所有相关的对象与牵扯到的库都会在编译时被连接成一个可执行文件。
动态库则是在程序执行时才会被载入,因此体积较小,不会占用过多空间和资源,可以实现进程间的资源共享。
4.c++中写实拷贝、深拷贝与浅拷贝的区别?
浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。因此在对象释放过程中,原始对象与新对象都指向同一内存块,一块内存被释放两次,会导致程序出现崩溃。
下面的例子可以很明确演示浅拷贝带来的问题:
我们在用s2构造s3时,调用了s3中的拷贝构造函数,但是这个拷贝构造函数只是将s3的地址指向了s2,此时两个指针都指向了一个内存块;这样带来的缺陷:
(1)s3发生改变时,s2也会随之改变;
(2)析构函数执行时,先析构s3,再析构s2,s2与s3指向同一内存,这样内存块会被释放两次,会造成程序崩溃。
深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。
图示可以明确说明深拷贝的原理:
重新开辟一块和源空间大小相同的空间,再将源空间的内容拷贝下来,保证了不同的对象指向不同的地址空间 。
写时拷贝是一种浅拷贝,它的不同之处是引入了计数器。每片不同内容的空间上都再由一个计数器组成,在构造第一个类时,计数器初始化为1,之后每次有新的类也指向同一片空间时,计数器自增;在析构时判断该片空间对应计数器是否为1,为1则执行清理工作,大于1则计数器自减。如果有需要进行增删等操作时,再拷贝空间完成,有利于提高效率。
写时拷贝技术是对于浅拷贝的改进。