06 2021 档案

25、C++的顶层const和底层const
摘要:概念区分: 1.顶层const:指的是const修饰的变量本身是一个常量,无法修改,指的是指针,就是 * 号的右边 2.底层const:指的是const修饰的变量所指向的对象是一个常量,指的是所指变量,就是 * 号的左边 区分作用: 1.执行对象拷贝时有限制,常量的底层const不能赋值给非常量的底 阅读全文
posted @ 2021-06-28 00:44 超人不会灰啊 阅读(99) 评论(0) 推荐(0)
43、如何用代码判断大小端存储
摘要:大端存储:字数据的高字节存储在低地址中 小端存储:字数据的低字节存储在低地址中 如何在代码中进行判断呢?下面介绍两种判断方式: 阅读全文
posted @ 2021-06-26 21:57 超人不会灰啊 阅读(115) 评论(0) 推荐(0)
42、public,protected和private访问和继承权限/public/protected/private 的区别?
摘要:1.public的变量和函数在类的内部外部都可以访问。 2.protected的变量和函数只能在类的内部和其派生类中访问。 3.private修饰的元素只能在类内访问。 (一)访问权限 派生类可以继承基类中除了构造/析构、赋值运算符重载函数之外的成员,但是这些成员的访问属性在 派生过程中也是可以调整 阅读全文
posted @ 2021-06-26 21:50 超人不会灰啊 阅读(333) 评论(0) 推荐(0)
41、auto、decltype和decltype(auto)的用法
摘要:(1)auto C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同,auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须 有初始值。举个例子: (2)decl 阅读全文
posted @ 2021-06-26 21:26 超人不会灰啊 阅读(802) 评论(0) 推荐(0)
40、构造函数、析构函数、虚函数可否声明为内联函数
摘要:首先,将这些函数声明为内联函数,在语法上没有错误。因为inline同register一样,只是建议编译器这样操作,编译器并不一定真正的内联。 register关键字:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存 寻址访问,以提高效率 构造函数和析构函数声明为内联函数是没有 阅读全文
posted @ 2021-06-26 20:57 超人不会灰啊 阅读(499) 评论(0) 推荐(0)
39、内联函数和宏定义的区别
摘要:内联(inline)函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函 数可以直接嵌入到目标代码中。 一、内联函数适用场景 1.使用宏定义的地方都可以使用inline函数 2.作为类成员接口函数来读写类的私有成员或者保护成员,会提高效率 二、为什么不能把所有的函数写成内 阅读全文
posted @ 2021-06-24 07:10 超人不会灰啊 阅读(524) 评论(0) 推荐(0)
38、浅拷贝和深拷贝的区别
摘要:浅拷贝: 浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原 来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会出现错误。 深拷贝: 深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值,即使原先的对象被析构掉,释放内存了也 不会影响到深拷贝得到的值 阅读全文
posted @ 2021-06-23 22:00 超人不会灰啊 阅读(74) 评论(0) 推荐(0)
36、C++的多态如何实现
摘要:C++的多态性,一言以蔽之就是: 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来 调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的 函数。 举个例子: 例子中,Base为基类,其中的函数为虚函数。子类1继承并 阅读全文
posted @ 2021-06-23 21:56 超人不会灰啊 阅读(198) 评论(0) 推荐(0)
35、C++中的重载、重写(覆盖)和隐藏的区别
摘要:(1)重载(overload) 重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目 有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否 是虚函数无关。举个例子: (2)重写(覆盖)(override) 重写指的是在派生类 阅读全文
posted @ 2021-06-23 16:56 超人不会灰啊 阅读(299) 评论(0) 推荐(0)
34、构造函数能否声明为虚函数或者纯虚函数,析构函数呢?
摘要:构造函数: 1.构造函数不能定义为虚函数。在构造函数中可以调用虚函数,不过此时调用的是正在构造的类中的 虚函数,而不是子类的虚函数,因为此时子类尚未构造好。 2.虚函数对应一个vtable(虚函数表),类中存储一个vptr指向这个vtable。如果构造函数是虚函数, 就需要通过vtable调用,可是 阅读全文
posted @ 2021-06-23 16:31 超人不会灰啊 阅读(771) 评论(0) 推荐(0)
33、为什么析构函数一般写成虚函数
摘要:由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派 生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。 如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函 数而不调用派生类析构函数 阅读全文
posted @ 2021-06-23 16:26 超人不会灰啊 阅读(449) 评论(0) 推荐(0)
32、C和C++的类型安全
摘要:什么是类型安全? 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。 “类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候 也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。 类型安全的编程语言与类型安全 阅读全文
posted @ 2021-06-23 16:16 超人不会灰啊 阅读(226) 评论(0) 推荐(0)
31、模板函数和模板类的特例化
摘要:引入原因 : 编写单一的模板,它能适应多种类型的需求,使每种类型都具有相同的功能,但对于某种特定类型,如果要实现其特有的功能,单一模板就无法做到,这时就需要模板特例化 定义 : 对单一模板提供的一个特殊实例,它将一个或多个模板参数绑定到特定的类型或值上 (1)模板函数特例化 必须为原函数模板的每个模 阅读全文
posted @ 2021-06-23 15:51 超人不会灰啊 阅读(278) 评论(0) 推荐(0)
30、extern"C"的用法
摘要:为了能够正确的在C++代码中调用C语言的代码:在程序中加上extern "C"后,相当于告诉编译器这部分 代码是C语言写的,因此要按照C语言进行编译,而不是C++; 哪些情况下使用extern "C": (1)C++代码中调用C语言代码; (2)在C++中的头文件中使用; (3)在多个人协同开发时, 阅读全文
posted @ 2021-06-23 15:08 超人不会灰啊 阅读(140) 评论(0) 推荐(0)
28、拷贝初始化和直接初始化
摘要:一.当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的 构造函数,拷贝初始化总是调用拷贝构造函数。拷贝初始化首先使用指定构造函数创建一个临时对 象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。举例如下: 二.为了提高效率,允许编译器跳过创建临时对象这一步 阅读全文
posted @ 2021-06-23 14:36 超人不会灰啊 阅读(261) 评论(0) 推荐(0)
26、类的对象存储空间?
摘要:1.非静态成员的数据类型大小之和 2.编译器加入的额外成员变量(如指向虚函数表的指针)。 3.为了边缘对齐优化加入的padding。 4.空类(无非静态数据成员)的对象的size为1, 当作为基类时, size为0. 阅读全文
posted @ 2021-06-23 14:19 超人不会灰啊 阅读(145) 评论(0) 推荐(0)
24、C++中const和static的作用
摘要:一、static 不考虑类的情况: 1. 隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用。 2. 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区。 3. 静态变量在函数内定义,始终存在,且只进行 阅读全文
posted @ 2021-06-23 14:00 超人不会灰啊 阅读(112) 评论(0) 推荐(0)
23、define宏定义和const的区别
摘要:一、编译阶段 1.define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用 二、安全性 1.define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部的内容,要不然很容易出错 2.const常量有数据类型,编译器可以对其进行类型安全检查 阅读全文
posted @ 2021-06-22 20:35 超人不会灰啊 阅读(196) 评论(0) 推荐(0)
22、C++中struct和class的区别
摘要:一、相同点 1.两者都拥有成员函数、公有和私有部分 2.任何可以使用class完成的工作,同样可以使用struct完成 二、不同点 1.两者中如果不对成员不指定公私有,struct默认是公有的,class则默认是私有的 2.class默认是private继承,而struct模式是public继承 三 阅读全文
posted @ 2021-06-22 17:19 超人不会灰啊 阅读(269) 评论(0) 推荐(0)
21、C++与Java的区别
摘要:一、语言特性 1.Java语言给开发人员提供了更为简洁的语法;完全面向对象,由于JVM可以安装到任何的操作系统 上,所以说它的可移植性强 2.Java语言中没有指针的概念,引入了真正的数组。不同于C++中利用指针实现的“伪数组”,Java引 入了真正的数组,同时将容易造成麻烦的指针从语言中去掉,这将 阅读全文
posted @ 2021-06-22 16:48 超人不会灰啊 阅读(409) 评论(0) 推荐(0)
20、C和C++的区别
摘要:1.C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 2.标准C++中的字符串类取代了标准C函数库头文件中的字符数组处理函数(C中没有字符串类型)。 3.C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。 4.C++中的try/ 阅读全文
posted @ 2021-06-22 16:18 超人不会灰啊 阅读(119) 评论(0) 推荐(0)
19、迭代器失效的情况
摘要:1.数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后在iter++,是没有意义的。 2.链表型数据结构:对于li 阅读全文
posted @ 2021-06-21 00:04 超人不会灰啊 阅读(117) 评论(0) 推荐(0)
13、哪几种情况必须用到初始化成员列表?
摘要:一,需要初始化的数据成员是对象的情况;二,需要初始化const修饰的类成员;三,需要初始化引用成员数据; 阅读全文
posted @ 2021-06-20 16:48 超人不会灰啊 阅读(272) 评论(0) 推荐(0)
18、野指针和悬空指针
摘要:都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。 1.野指针,指的是没有被初始化过的指针 因此,为了防止出错,对于指针初始化时都是赋值为 nullptr ,这样在使用时编译器就会直接报 错,产生非法内存访问。 2.悬空指针,指针最初指向的内存已经被释放了 阅读全文
posted @ 2021-06-20 14:39 超人不会灰啊 阅读(379) 评论(0) 推荐(0)
17、数组名和指针(这里为指向数组首元素的指针)区别?
摘要:1.二者均可通过增减偏移量来访问数组中的元素。就是 “[ ]”。 2.数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。就是 “++”“--”。 3.当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数 阅读全文
posted @ 2021-06-20 14:34 超人不会灰啊 阅读(245) 评论(0) 推荐(0)
16、a和&a有什么区别?
摘要:int main() { int a[10] = {1,2,3,4,5}; int (*p)[10] = &a; int* q = a; cout << *(a + 1) << endl; // 输出2 cout << (*p)[1]<< endl; // 输出2 cout << q[1]; // 阅读全文
posted @ 2021-06-20 14:20 超人不会灰啊 阅读(752) 评论(0) 推荐(0)
15、常量指针和指针常量区别?
摘要:1.常量指针是一个不能给改变指向的指针。指针是个常量,不能中途改变指向,如int *const p。 2.指针常量是一个指针,读成常量的指针,指向一个只读变量。如int const *p或const int *p。 阅读全文
posted @ 2021-06-20 10:53 超人不会灰啊 阅读(516) 评论(0) 推荐(0)
14、strlen和sizeof区别?
摘要:1.sizeof是运算符,并不是函数,结果在编译时得到而非运行中获得;strlen是字符处理的库函数。 2.sizeof参数可以是任何数据的类型或者数据(sizeof参数不退化);strlen的参数只能是字符指针 且结尾是'\0'的字符串。 3.因为sizeof值在编译时确定,所以不能用来得到动态分 阅读全文
posted @ 2021-06-20 01:31 超人不会灰啊 阅读(93) 评论(0) 推荐(0)
12、变量声明和定义区别?
摘要:1.声明仅仅是把变量的声明的位置及类型提供给编译器,并不分配内存空间;定义要在定义的地方为 其分配存储空间。 2.相同变量可以在多处声明(外部变量extern),但只能在一处定义。 阅读全文
posted @ 2021-06-20 01:10 超人不会灰啊 阅读(194) 评论(0) 推荐(0)
10、宏定义和函数和typedef有何区别?
摘要:1.宏定义在编译前完成替换,相当于直接插入代码,替换之后的代码参与编译,运行时不存在函数调用,运行就更快。函数调用就需要跳转到具体的函数,速度就更慢。 2.宏定义直接插入代码,没有返回值。函数有返回值。 3.宏定义没有参数类型检测,函数有参数类型检测。 4.宏定义后不加分号。 1.宏主要用于定义常量 阅读全文
posted @ 2021-06-20 00:28 超人不会灰啊 阅读(254) 评论(0) 推荐(0)
9、delete和delete[]区别?
摘要:delete只会调用一次析构函数。 delete[]会调用数组中每个元素的析构函数。 阅读全文
posted @ 2021-06-08 17:16 超人不会灰啊 阅读(127) 评论(0) 推荐(0)
8、new和delete是如何实现的?
摘要:new的实现过程是:首先调用名为operator new的标准库函数,分配足够大的原始为类型化的内存,以保存指定类型的一个对象;接下来运行该类型的一个构造函数,用指定初始化构造对象;最后返回指向新分配并构造后的的对象的指针 delete的实现过程:对指针指向的对象运行适当的析构函数;然后通过调用名为 阅读全文
posted @ 2021-06-08 17:15 超人不会灰啊 阅读(164) 评论(0) 推荐(0)
7、new / delete 与 malloc / free的异同
摘要:相同点: 都可用于内存的动态申请和释放 不同点: 前者是C++运算符,后者是C/C++语言标准库函数 new自动计算要分配的空间大小,malloc需要手工计算 new是类型安全的,malloc不是 new调用名为operator new的标准库函数分配足够空间并调用相关对象的构造函数,delete对 阅读全文
posted @ 2021-06-08 17:05 超人不会灰啊 阅读(95) 评论(0) 推荐(0)
6、基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间
摘要:虚函数表是全局共享的元素,即全局仅有一个,在编译时就构造完成 由于虚表指针vptr跟虚函数密不可分,对于有虚函数或者继承于拥有虚函数的基类,对该类进行实例化 时,在构造函数执行时会对虚表指针进行初始化,并且存在对象内存布局的最前面。 阅读全文
posted @ 2021-06-08 00:12 超人不会灰啊 阅读(402) 评论(0) 推荐(0)
4、堆和栈的区别
摘要:申请方式不同: 栈由系统自动分配。 堆是程序员自己申请和释放的。 申请大小限制不同: 栈顶和栈底是之前预设好的,栈是向栈底扩展,栈向下,向低地址方向增长,大小固定,可以通过ulimit -a查看,由ulimit -s修改。 堆向高地址扩展,是不连续的内存区域,大小可以灵活调整。 申请效率不同: 栈由 阅读全文
posted @ 2021-06-08 00:09 超人不会灰啊 阅读(203) 评论(0) 推荐(0)
3、指针和引用的区别
摘要:指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向,而引用在初始化之后不可再改变 sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向 阅读全文
posted @ 2021-06-08 00:05 超人不会灰啊 阅读(250) 评论(0) 推荐(0)
2、结构体内存对齐问题?
摘要:结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同。 未特殊说明时,按结构体中size最大的成员对齐(若有double成员,按8字节对齐。) c++11以后引入两个关键字 alignas与 alignof。其中 alignof 可以计算出类型的对齐方式, alignas 可 以指定结构 阅读全文
posted @ 2021-06-08 00:03 超人不会灰啊 阅读(124) 评论(0) 推荐(0)
1、在main执行之前和之后执行的代码可能是什么?
摘要:1、在main执行之前和之后执行的代码可能是什么? main函数执行之前,主要就是初始化系统相关资源: 设置栈指针 初始化静态 static 变量和 global 全局变量,即 .data 段的内容 将未初始化部分的全局变量赋初值:数值型 short , int , long 等为 0 , bool 阅读全文
posted @ 2021-06-08 00:01 超人不会灰啊 阅读(489) 评论(1) 推荐(0)