c++面试常见题目

const用法

总的来说,修饰变量则变量无法被修改,修饰成员函数则函数不能修改变量,且不能调用非const变量。
(1)定义常量,不可被修改,定义时候必须初始化
(2)修饰形参,配合引用,解决引用可能带来的参数改变(引用值始终保持不变)
(3)修饰函数的返回值,返回值不能被修改,且只能赋值给const修饰的变量。
(4)修饰类的成员函数,使内部类不能修改成员变量,且不能调用非const成员函数,并且使用时必须实例化才能使用。

New用法

在堆上分配空间,是运算符,在编译时执行。和delect配套使用,不配套会引起内存泄露。

Malloc/free

是标准库函数,会在运行时执行

Extern

外部声明变量,功能是声明该变量可以被外部使用

Static

静态声明,会分配固定内存空间,(1)在函数内部定义局部变量,只能在函数内部使用,且会延续上一次函数执行最后的值。(2)在函数外部定义全局静态变量(3)在类中定义静态函数,只能调用该类中静态变量,没有this指针,不能被实例化。(4)在类中定义成员变量,该变量只能在该类中使用

Set和map

实现原理基于红黑树红黑树是一种特殊的二叉查找树(1)每个节点或者是黑色,或者是红色 (2)根节点是黑色(3) 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点(4)如果一个节点是红色的,则它的子节点必须是黑色的(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(6)决定了没有一条路径会比其他路径长出2倍,因此红黑树是接近平衡的二叉树

Virtual

定义虚函数,定义基类虚函数,实现多态特性。使用限制!(1)非类成员函数和构造函数不能定义为虚函数,析构函数可以(2)声明函数的类体中使用关键字virtual,而定义中不需要使用。(3)如果基类中为虚函数,派生类中同名函数为虚函数(4)如果某个成员函数为虚函数,则基类或者派生类中不能出现同名并且返回值相同的同名函数。

Template

模板:模板函数,作用是如果需要传入不同类型参数,可以利用模板实现。
代码:template T A::g(T a,T b)

Sizeof

是运算符,是计算占用空间大小,在编译时处理

Final

禁用重写
禁用继承,使用规则class super final{}

Override

重写,在子类中重写函数
overload,将语义相近的几个函数用同一个名字表示,但是参数和返回值不同,这就是函数重载。特征:相同范围(同一个类中)、函数名字相同、参数不同、virtual关键字可有可无
override,派生类覆盖基类的虚函数,实现接口的重用。特征:不同范围(基类和派生类)、函数名字相同、参数相同、基类中必须有virtual关键字(必须是虚函数)
overwrite,派生类屏蔽了其同名的基类函数。特征:不同范围(基类和派生类)、函数名字相同、参数不同或者参数相同且无virtual关键字

STL库

C++标准库函数,里面有许多数据格式,而且运行速度很快。
序列式容器:可以被排序,Vetor是数组,连续空间分配。list是链表,分布连续,有键值。
关联式容器:内部分布是二叉树,每个容器都有其固定算法
STL库最有特点的就是其中的迭代器,使用户可以按照顺序读取容器

虚函数

利用关键字创建虚函数,主要作用是实现多态功能,创建虚函数时会创建虚函数表,虚函数表的各表项为指向对应虚函数的指针,在执行构造函数时,指向基础类的指针会指向具体类的this指针。

析构函数

释放内存

构造函数

构建函数,不可以是虚函数,也不可以用const定义。

虚函数表

创建虚函数时会创建虚函数表,虚函数表的各表项为指向对应虚函数的指针

纯虚函数

不能被实例化,没有this指针,主要作用是提供接口,在 基类 中不能对 虚函数 给出有意义的 实现 ,而把它声明为纯虚函数,它的实现留给该基类的 派生类 去做。.这就是纯虚函数的作用。. 纯虚函数也可以叫 抽象函数 ,一般来说它只有函数名、参数和返回值类型,不需要函数体。

内存泄漏

指没有释放内存。(1)new和delect没有配套(2)删除数组采用delect没有采用delect[](3)析构函数没有用虚函数,派生类没有析构

友元函数

有元函数是可以访问类的私有成员的非成员函数。它是定义在类外的普通函数,不属于任何类,但是需要在类的定义中加以声明。
friend 类型 函数名(形式参数);
一个函数可以是多个类的友元函数,只需要在各个类中分别声明。

智能指针

不要使用auto_ptr,因为他的缺陷导致我们拷贝构造/赋值的时候有很大的麻烦。在不需要拷贝构造/赋值的时候,可以使用unique_ptr。有拷贝构造/赋值的情况,推荐使用shared_ptr.类内有访问其他shared_ptr对象时,指针类型设为weak_ptr,可以不改其他其他shared_ptr对象的引用计数。代码中尽量不用delete关键字,因为我们的内存的管理与释放全权交给对象

编程规范

可行性、可读性、结构清晰、精简

类型的强制转换

static_cast :编译时期的静态类型检查
static_cast < type-id > ( expression )
该运算符把expression转换成type-id类型,在编译时使用类型信息执行转换,在转换时执行必要的检测(指针越界、类型检查),其操作数相对是安全的
dynamic_cast:运行时的检查
用于在集成体系中进行安全的向下转换downcast,即基类指针/引用->派生类指针/引用
dynamic_cast是4个转换中唯一的RTTI操作符,提供运行时类型检查。
dynamic_cast如果不能转换返回NULL
源类中必须要有虚函数,保证多态,才能使用dynamic_cast(expression)
const_cast
去除const常量属性,使其可以修改 ; volatile属性的转换
reinterpret_cast
通常为了将一种数据类型转换成另一种数据类型

进程和线程

线程是进程的细化,线程是用户运行的基本单位。进程之间会互斥访问,同一个进程之间的线程可以共享一段区域。不同进程的线程之间通讯属于进程间的通讯。线程之间的互斥是通过信号量、临界区、互斥量、事件控制的。Thread mythread1(函数名)可以用来创建线程

管道和线程

管道可以用来进程之间的通讯,Python subpress。可以通过把数据输入管道,输出到另一个进程或者线程

大端和小端

大端模式是高位字节存放在低位内存。小端是高位存放在高位。

内联函数和宏

内联函数是展开,宏是替换。内联函数在编译时候展开,宏在预编译时替换。内联函数不能用循环,否则消耗更大。

深拷贝和浅拷贝

深拷贝会申请新的内存空间,浅拷贝就是常用的赋值。如果拷贝对象有指针,浅拷贝会造成在在执行析构函数时指针悬空。

指针数组和数组指针

数组指针是指数组的指针,指的是指向数组的指针。指针数组是元素全为指针的数组。

声明和定义

声明不分配内存空间,定义要分配内存空间。

静态库和动态库

静态库使用的时候会直接拷贝库,动态库使用的时候编译时只会生成动态库的引用,运行时才会加载,不会增加程序的体量。

引用和指针

指针指向的是地址,引用只内存别名。引用一定要初始化,指针不需要。引用不需要分配内存空间,指针需要。引用初始化不能改变,指针可以改变。

线程的阻塞和非阻塞

阻塞:当线程需要的条件没有准备好的时候,就会造成线程的大量切换,很容易造成阻塞。非阻塞原理就是如果先前条件达不到,就会睡眠,不会触发到,这样就不会产生大量的切换。原理就是把事件划分为小事件。

struct和class

两则相差不大,但是class默认成员和继承类型是私有的,struct默认成员和继承类型为公共的。
35.debug和release
debug是库比较少,release比较正式,内容更加全面。

TCP和UDP

TCP是有连接传输稳定,UDP是无连接不稳定

Typedef和define

Define只做机械替换,不做检查,Typedef会进行正确性检查。两个对指针的定义也不同,define定义常量指针,Typedef定义指针常量。

vector和list

vector就是一个动态增长的数组,里面有一个指针指向一片连续的空间,当空间装不下的时候,会申请一片更大的空间,将原来的数据拷贝过去,并释放原来的旧空间。当删除的时候空间并不会被释放,只是清空了里面的数据。对比array是静态空间一旦配置了就不能改变大小。
list是不连续的,有键值。

申请进程或者线程

采用thread mythread1(函数名)
thread th2(proc,a);//第一个参数为函数名,第二个参数为该函数的第一个参数
cout << “主线程中显示子线程id为” << th2.get_id() << endl;
th2.join();//此时主线程被阻塞直至子线程执行结束。

全局变量和全局静态变量和局部静态变量

全局变量可以被外界声明,静态变量都不能被外界声明。函数体内是局部静态变量,函数体外是全局静态变量。

全局函数和全局静态函数和类中的静态函数

全局函数可以被外界声明使用,静态函数不能,类中的静态函数可以使用static声明的变量,不可以使用非静态变量。类中的静态变量只归属于类中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

�Wang Chien Po

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值