C/C++教程

C++类对象常见面试题(二)

本文主要是介绍C++类对象常见面试题(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、单例模式的原理
1、禁止在类外创建对象:把构造函数私有化
2、确保类对象只有一份:在类中定义一个静态指针或类对象
3、提供一个获取类对象的接口:设计静态成员函数用于获取类对象

二、介绍懒汉模式和饿汉模式
饿汉模式的单例:
程序运行时就实例化出类对象,不管后期是否用得上,都已经创建完毕
优点:绝对不可能被多线程同时运行时创建多份
缺点:如果后期用不到,就浪费资源了

懒汉模式的单例:
程序直到真正使用类对象时才创建对象
优点:什么时候使用什么时候创建,如果不使用就不会被创建,节约资源
缺点:多个线程同时创建,有可能创建出来多份

三、运算符函数
运算符函数的格式:

   单目运算符:    #O 都会被编译器翻译成      
           成员函数:          
            [] O::operator#(void)        
            {
   
            }                                               
        返回值不确定,没有参数,唯一参与者就是调用者本身this                                 
        全局函数:
            [] operator#(O& o)
            {

            }
        运算符成员函数、运算符全局函数,只能实现一个,不能同时实现
        
    双目运算符:    a # b
        成员函数:
            []  A::operator#(B& b)
            {

            }
        全局函数:
            [] operator#(A& a,B& b)
            {

            }

四、为什么要重载new/delete?
1、可以让运算符函数记录每次分配、释放堆内存的地址,检查出是否产生内存泄漏
2、对于字节较少、且频繁申请释放的对象,可以多分配点内存来预防内存碎片

五、什么是智能指针,普通指针、智能指针的优缺点和相同点,如何使用?
1、智能指针也是指针,会负责自动释放所指向的对象。
2、普通指针的缺点:当一个常规指针离开作用域时,只有存储该指针本身所占用的内存4/8字节被释放而它原本指向的内存空间不会被释放,当free、delete、delete[]等函数和语句都无法执行,或者忘记了执行就形成内存泄漏。
3、智能指针的优点:智能指针是一个封装了常规指针的类类型对象,当该对象离开作用域时,它的析构函数会自动释放常规指针所指向的内存,这样就做到了自动释放。
4、智能指针的缺点:(1)不能跨作用域(2)不能多个指针指向同一个对象,否则会出现重复析构导致内存崩溃(3)不能指向对象数组(指向数组析构时要调用delete[])(4)不能放入容器中
5、相同点:智能指针虽然是类对象,但是它重载了*->可以像常规指针一样来使用。
6、使用方法:

#include <memory>
       auto_ptr<类型> ptr(new 类型);

此时ptr就可以像普通指针一样来使用了

六、重载运算符函数有哪些限制?
1、五种运算符不能重载:(1)::域限定符 (2).直接成员访问运算符 (3)?:三目运算符 (4)sizeof字节长度运算符 (5)typedef类型重定义操作符
2、只能重载为全局函数的运算符: <<输出运算符 >>输入运算符
3、只能重载为成员函数的运算符:=赋值运算符 ->间接成员访问运算符 []下标运算符 ()类型转换运算符

七、什么是继承?
1、当遇到问题时,先查现有的类能否解决一部分问题,如果有则继承该类,在此类的基础上进行拓展从而解决最终问题,达到缩短解决问题的时间的目的(代码复用)。
2、当遇到一个复杂问题时,可以先把复杂问题分解成若干个小问题,然后为每个问题设计一个类来解决,最终通过继承语法把这些类汇总到一个类中,从而达到解决复杂问题的目的,可以降低解决问题的难度,同时可以让多个程序员同时解决该问题。

八、继承的特点
1、C++中继承可以有多个父类
2、子类会继承父类所有内容
3、子类对象可以向父类转换(缩小),但是父类对象不能向子类转换(放大)
4、子类会隐藏父类的同名成员,在子类中直接访问到的是子类的同名成员,可以使用域限定符,来访问指定的父类同名成员
5、子类与父类的同名函数不能构成重载,因为在不同一个作用域下,继承的成员函数会向隐藏成员函数一样隐藏掉了
6、在执行子类的构造函数前,会按照继承表中父类的继承顺序来执行父类的构造函数,默认执行父类的无参构造,可以在子类的构造函数的初始化列表中显示地调用父类的有参构造
7、在子类的析构函数执行完成后再调用父类的析构函数,会按照继承表的顺序,逆序执行父类的析构函数
8、当子类执行拷贝构造是,默认也是调用父类的无参构造,可以在子类的拷贝构造的初始化列表中显示地调用父类的有参构造
9、当子类执行赋值操作时,默认不会调用父类的赋值操作函数,如果需要调用父类的赋值操作函数,可以加域限定符和赋值函数名来调用 (父类名::operator=(obj);)

九、继承的方式与访问属性
public:成员可以在任何地方访问
private:成员只能在类内访问
protected:成员只能在类内和子类中访问

十、继承方式的影响
1、父类的成员是否能在子类中访问,是设计父类时的访问控制属性决定的
2、继承方式能够决定父类成员被子类继承后,在子类中变成什么样的访问控制属性
3、只有public继承方式继承父类时,父类的指针或引用才可以指向子类对象

这篇关于C++类对象常见面试题(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!