C++常见问题总结

一、Static:
1、修饰变量和函数,仅仅在本文件内使用函数和变量
2、函数内修饰变量,下次调用时仍维持上次的值
3、static成员变量和函数,属于类所有,所有实例对象只有一份拷贝
4、static成员函数,只能用类名字访问, 不能用this,例A::fun()
二、Const
1、 增加编译阶段检查
2、 可以定义const常量, 具有不可变性,保护被修饰的东西, 防止意外的修改
3、 提高效率, 一般保存在符号表中, 这使得它成为一个编译期间的常量, 没有了存储与读内存的操作, 使得它的效率也很高
三、动静态链接
1、静态链接的优点:运行速度快并且不依赖外部环境、
缺点:浪费空间, 因为每个可执行程都要有一份副本
2、动态链接的优点:节约约内存, 而是这多个程序在执行时共享同一份副本
缺点:性能略差: 因为把链接推迟到了程序运行时, 所以每次执行程序都需要进行链接,依赖外部环境
四、引用与指针有什么区别
1、引用必须被初始化, 指针不必。
2、引用和指针初始化后,引用不能变, 指针可变。
3、不存在空引用,存在空指针
4、引用本身不占存储单元,不能建立数组的引用
五、new、delete、malloc、free
它们都可用于申请动态内存和释放内存, malloc/free, 不在编译器的控制权限之内,
不能够把执行构造函数和析构函数的任务强加于malloc/free
1、malloc/free是C/C++标准库的函数, new/delete是C++操作符
2、new、delete除了分配空间, 创建销毁对象, 调用构造和析构
3、malloc/free手动计算类型大小且, 返回值会void*; new/delete可自己计算类型的大小, 返回对应类型的指针
六delete与 delete []
1、delete只会调用一次析构函数, 而delete[]会调用每一个成员的析构函数
2、new-delete, new[]-delete[]
七、结构体struct和共同体union(联合)的区别
结构体:将不同类型的数据组合成一个整体,是自定义类型
共同体:不同类型的几个变量共同占用一段内存
八、#define和const的区别
1、#define定义的常量没有类型,是一个立即数;const定义的常量有类型名字,存放在静态区域
2、处理阶段不同,#define预处理时进行替换,可能有多个拷贝,const所定义的变量在编译时确定其值,只有一个拷贝
3、#define定义的常量是不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址
4、#define可以定义简单的函数,const不可以定义函数
九、 const char *p -> *p,*p(值)不可改,char * const p -> p, p(指针)不可改
十、strlen计算时不包含’\0’,而sizeof包含’\0,strlen遇到’\0’才结束

一、 构造函数
构造函数是和类名相同的一个函数,它的作用是实现对象的初始化。当对象被创建时,构造函数自动被调用。1、没有类型;2、没有返回值(也不用写void);名字与类名相同;可重载!
二、 析构函数
对象生命结束时都要调用析构函数,且每个对象调用一次。1、没有类型;2、没有返回值(也不用写void);名字与类名相同;3、不带参数,不可重载,析构函数只有一个
三、虚函数、纯虚函数virtual
1、纯虚函数是在虚函数声明的末尾加上=0即可
2、纯虚函数不能有函数体, 有一个例外就是纯虚析构函数(纯虚析构函数可以有函数体)
3、含有纯虚函数的类为抽象类, 不能被实例化, 只能被子类继承
4、抽象类除了有纯虚函数外, 还可以有普通函数, 并且普通函数必须要有函数体
四、线程同步
1、互斥锁来保证同一时间只有一个线程能够访问缓冲区
2、读写锁:如果缓冲区的读操作非常频繁,而写操作比较少,它能提高并发性能
3、自旋锁:如果临界区代码执行时间非常短,需要避免线程频繁的上下文切换,可以使用自旋锁来提高性能
五、C++11引入了许多新的特性
1、指针初始化未nullptr,非NULL
2、出现智能指针,内存自动回收
3、atuo可以用于自动类型推导,decltype获得已知变量的类型
4、初始化列表增加用户自定义类型
5、Lambda表达式,匿名函数
6、简化类型for循环
7、增加正则表达
8、增加右值引用
六、C++中函数的参数传递方式有哪些
1、C++中函数的参数传递方式有值传递、指针传递和引用传递三种方式
七、C++中的多态是如何实现的?
1、C++中的多态是通过虚函数机制来实现的,即将基类中的函数声明为虚函数,在派生类中重写该函数,然后通过基类指针或引用调用函数时,会根据对象的实际类型来确定调用的函数版本。
八、C++中的编译器优化是什么?
1、C++中的编译器优化是指编译器在编译程序时对代码进行优化,包括代码消除、循环展开、函数内联等方式,用于提高程序的执行效率和性能。
九、内存四区
运行前;1、代码区:存放函数体的二进制代码,由操作系统管理2、全局区还包括常量区(字符串常量,const修饰的全局常量)
运行后,栈区,堆区;分全局堆和局部堆
十、类型转换
static_cast:多种数据类型间转换,编译时的类型检查,适用于安全的类型转换
const_cast:去掉const
dynamic_cast:动态类型转换
reinterpret_cast:重新解释类型的转换

一、 进程通信和线程通信
1、进程通信:管道、共享内存、信号量、消息队列、socket
2、线程通信:锁、条件变量、信号量
3、不同服务器进程间通信:RPC协议、消息队列中间件、socket
二、 用户态和内核态
1、 用户态,只能访问自己的内存和部分系统资源,不能直接访问硬件设备和系统内核。
2、 内核态,系统可以访问系统的设备和资源,可以执行特权指令和访问特殊的寄存器
怎么使用到内核态,汇编,编译器选项-mkernel, -march
三、gcc编译c++,gcc new_day.cpp -lstdc++
四、智能指针
自动管理内存分配和释放,避免内存泄漏和悬空指针,提高程序的效率和可靠性
1、unique_ptr:独占智能指针,每个指针只能有一个 unique_ptr 拥有,不能复制或共享
2、shared_ptr:共享智能指针,多个指针可以共享同一个 shared_ptr,可以复制和拷贝。
3、weak_ptr:弱引用智能指针,
五、C++的多线程是并发的,而不是并行的,怎么并行编程
1、OpenMP并行编程
2、MPI并行编程:MPI是一种消息传递接口,分布式并行化
3、CUDA并行编程
4、头文件提供了std::futurestd::promise`类,可以用于实现异步编程
六、内存池是一种内存分配方式
提高内存分配和释放的效率,避免频繁地进行动态内存分配和释放所带来的性能开销,内存池的确可以提高程序的效率和性能。
七、strlen和sizeof
strlen不包括字符串结尾的空字符’\0’的长度
sizeof函数用于计算一个变量或类型所占的字节数,包括整个变量或类型的所有成员。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值