零散笔记(七)

1、何时编译器会自动生成默认构造函数。有需要的时候才会生成。四种情况会自动生成,一是成员变量里有默认构造函数的类,二是基类有默认构造函数,三是有虚函数,四是有虚基类。

2、何时编译器会自动生成拷贝构造函数。有需要的时候才会生成。一是成员变量里有拷贝构造函数的类,二是基类有拷贝构造函数,三是有虚函数,四是有虚基类。

3、如何区分一段代码是C++还是C代码编写的。代码看C++有C没有的东西就行。如果是反汇编,则看函数调用的方式,以及函数入口地址,因为C++是有重载的。

4、用过的设计模式,简单举几个例子。单例模式,就是这个类在程序运行周期里只有一个对象,且该类要提供获取这个对象的接口。工厂模式,接口独立,使创建类的过程延迟到子类进行。观察者模式,当对象发生改变时通知与其关联的另一个对象。装饰器模式,动态地给一个对象增加一些功能。

5、指针和引用的区别。指针和引用都是可以间接访问另一对象的方式。指针有自己的内存空间,占4个字节,而引用没有,sizeof的结果就是被引用的对象的大小。引用在定义时一定要初始化,而指针可以初始化为NULL。使用过程中指针可以改变指向的对象,而引用不能。指针需要*才能得到所指对象,而引用可以直接修改。

6、const关键字。const声明的变量一般是不可修改的。const修饰的函数表示该函数不会修改变量。

7、STL容器有哪些,常用的算法。deque,vector,list,stack,queue,set,map,unordered_set,unordered_map,array,forward_list。算法有sort,foreach,next_pemutation,lower_bound,upper_bound等等。

8、在C++程序中调用被C语言修饰的函数,为什么要加extern “C”。因为C语言没有重载,C++为了实现重载,处理函数的名字的方式是不一样的,extern C就是告诉编译器用C语言的方式来处理这个函数名。

9、流运算符为什么不能通过类的成员函数重载。如果实现的是obj<<value的话,跟普通的重载没区别。但是如果要实现cout<<obj,显然对象在右边,不能使用operator<<(ostream &os)的方法,只能全局声明然后设为友元。

10、智能指针可以放到容器中么。可以的。

11、如何判断浮点数是否相等。相减的绝对值小于某一个数,即可认为是相等。

12、不允许重载的5个运算符。. :: .* ?: sizeof。

13、结构体和联合体的区别。union是数据成员共享内存的,所有数据成员的起始地址都一样,union的大小取决于最大的那个。struct在C++中和class的区别只有访问级别不同。

14、内联函数有什么优点?内联函数和宏定义的区别。内联函数由于没有栈压入和栈弹出的过程,所以调用更快。内联函数是在编译期展开,宏定义是在预处理期展开。内联函数会做类型检查,宏定义不会。内联函数是否展开取决于编译器,宏定义一定会展开。

15、内存对齐的原则。原则一,起始位置是对象大小的整数倍。大小2的要放在6,而不是5。原则二,如果struct a里有struct b,则b的起始位置是b里最大元素的大小的整数倍。原则三,整个结构体的大小是最大元素大小的整数倍。

16、volatile的作用。一,易变性,要求编译器每次获取该变量的内容时,都要从内存中读取,而不是从寄存器中读取。二,不可优化性,要求编译器处理与该变量有关的内容时,不能优化。三,顺序性,要求编译器按顺序执行(实际做不到)。

17、重载和重写和隐藏的区别。重载就是在同一个类内,函数名相同,参数列表不同。重写就是子类里面有相同名字相同参数的父类虚函数。隐藏就是父类并未设置虚函数,但子类有相同名字的函数,参数列表可同可不同。

18、说一下C++的返回值优化。当函数返回值是类时,可能会由于复制构造函数带来巨大的开销。返回值优化就是优化掉这一步,是一项编译器优化技术。

19、什么函数不能声明为虚函数。普通函数,友元函数,构造函数,内联函数,静态成员函数。

20、系统会自动打开和关闭的3个标准的文件是。stdin,stdout,stderr。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注