C++基础部分面经(未完整会一直更新)

封装(private、public、private):封装可以隐藏实现细节,使得代码模块化,使代码和功能独立

继承(public):继承可以扩展已存在的代码模块(类)。它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。其继承的过程,就是从一般到特殊的过程。

多态(virtual):多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作.使用覆盖/重写重载实现。

虚函数和纯虚函数:虚函数在父类中提供虚函数的实现,为子类提供默认的函数实现,子类可以重写父类的虚函数实现子类的特殊化。纯虚函数被称为抽象类。是对子类的约束,是“接口继承”,在子类中实现。

深拷贝,浅拷贝和赋值:赋值是将一个对象赋值给另外一个新的变量时,赋的是该对象在栈中的地址,两个对象同时指向一个存储空间,是联动的,无论修改哪个对象都会影响另一个对象。
浅拷贝是创建一个新的对象,该对象与原始对象有相同的数据,对于引用类型的成员变量,只负责了引用地址,没有复制实际的数据。创建一个新的对象且与原对象一模一样,新旧对象指向同一块地址。修改基本数据类型不会影响原对象,修改引用类型会连带原对象一起被修改。
深拷贝是创建一个完全独立的新对象,包含原始对象的所有内容,且指针指向新的地址。对拷贝对象进行修改不影响原来的对象。

野指针和悬空指针:野指针是未被初始化的指针,指向无效地址内存区域,访问行为会导致未定义行为。(解决办法将其设置为nullptr)。悬空指针是最初指向的内存被释放的指针。(解决办法是delete后立即置空。智能指针用于避免悬空指针)

重载、重写和隐藏:重载是在同一范围内允许两个以上的函数使用相同的函数名,但参数个数返回值不同。
重写是在派生类中覆盖基类中的同名函数,一般使用override来确保是重写父类的函数。重写函数主体而且要求基类必须是虚函数。
隐藏是在派生类中重写基类中的函数,参数返回值可相同可不同,与重载不同的是不在同一个类中内,隐藏出现在派生类中。和重写不同的是基类中函数是否为虚函数。

内联函数(inline)和宏定义(define)的区别:宏定义是进行文本替换。内联函数是将函数嵌入代码中,省去调用的开销提高执行效率。内敛函数有类型检测、语法判断等,宏定义没有。内联函数可重载。

大端存储和小端存储:大端存储的字数据高字节存放在低地址中。小端存储的字数据高字节存放在高地址中。使用强制类型转换和union联合可可用于判断。

volatile、mutable和explicit:volatile是类型限定符,告诉编译器一个变量可能被语句外的东西修改(操作系统等),每次访问该变量都会从内存中重新读取最新的值,而不使用缓存。常用于多线程或并发编程中。
mutable是修饰符,允许const定义的常量可修改。
explicit是修饰符,修饰构造函数后不允许隐式转换该构造函数,智能通过显示转换来调用该构造函数。

new类型:plain new、nothrow new、placement new。plain new在内存分配失败时不会返回null,会抛出异常。nothrow new在内存分配失败时会返回null,不会抛出异常。placement new只调用对象的构造函数,不分配内存。

C++异常处理方法:

1.try、catch和throw。程序执行流程先由try包裹,未发生异常时,不会进入catch;当发生异常时,throw将抛出异常,然后由catch捕获。

2.函数的1异常声明列表。列举可能发生的异常并抛出。

3.C++标准异常类exception。

  • bad_typeid:使用typeid运算符,如果其操作数是一个多态类的指针,而该指针的值为 NULL,则会拋出此异常
  • bad_cast:在用 dynamic_cast 进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会拋出此异常
  • bad_alloc:在用 new 运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常
  • out_of_range:用 vector 或 string的at 成员函数根据下标访问元素时,如果下标越界,则会拋出此异常

实参和形参:形参只有在被调用时才分配内存单元,在调用结束后立即释放。形参只在函数内部有效。
实参可以是变量、常量、表达式和函数等。无论实参是何种类型的量,在进行函数调用时必须有确定的量,以便把这些值传递给形参。函数调用中发生的数据传送是单向的,数据只能从实参的值传送给形参,反之不行,so形参发生改变实参不受影响。实参和形参在数量、类型上完全一致,否则会发生“类型不匹配”。

值传递,指针传递,引用传递:值传递是函数实参拷贝给形参,函数参数都会被复制一份,函数对参数进行修改不会影响原来的值。指针传递是传递给形参的是地址,函数内部通过地址访问原来的值,函数对参数进行修改时会改变原来的值。引用传递传递变量本身,函数对参数修改会改变原来的值。

new和malloc:new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。new申请内存不需要计算,malloc需要显示计算。内存分配成功,new返回对应类型的指针,malloc返回void *需要强制类型转换成需要的类型。当分配内存失败时,new会抛出异常,malloc返回null。new/delete可以进行自定义类型的构造和析构,malloc/free不可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值