摘要: # 53.delete p、delete [] p、allocator都有什么作用? 1、 动态数组管理new一个数组时,[]中必须是一个整数,但是不一定是常量整数,普通数组必须是一个常量整数; `delete p`是用于释放由`new`运算符分配的单个对象的内存。如果使用`new[]`运算符创建了 阅读全文
posted @ 2023-07-03 21:43 CodeMagicianT 阅读(426) 评论(0) 推荐(0)
摘要: # 51.深拷贝与浅拷可以描述一下吗? ## 1.浅拷贝 同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为**浅拷贝。** 浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到 阅读全文
posted @ 2023-07-03 21:42 CodeMagicianT 阅读(39) 评论(0) 推荐(0)
摘要: # 52.new和malloc的区别 **相同点** ●都可用于内存的动态申请和释放 ●new和malloc都可以分配指定大小的内存块,并且分配的内存都在堆上。 ●new和malloc的结果都返回一个指向已分配内存的指针。 ●都允许使用字面量作为参数来分配内存。 **不同点** ●前者是C++运算符 阅读全文
posted @ 2023-07-03 21:42 CodeMagicianT 阅读(125) 评论(0) 推荐(0)
摘要: # 50.从汇编层去解释一下引用 ``` 9: int x = 1; 00401048 mov dword ptr [ebp-4],1 10: int &b = x; 0040104F lea eax,[ebp-4] 00401052 mov dword ptr [ebp-8],eax ``` x的 阅读全文
posted @ 2023-07-03 21:41 CodeMagicianT 阅读(77) 评论(0) 推荐(0)
摘要: # 47.静态变量什么时候初始化? 1.初始化只有一次,但是可以多次赋值,在主程序之前,编译器已经为其分配好了内存。 2.静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执 阅读全文
posted @ 2023-07-03 21:40 CodeMagicianT 阅读(436) 评论(0) 推荐(0)
摘要: # 48.const关键字的作用有哪些? 编写程序过程中,我们有时不希望改变某个变量的值。此时就可以使用关键字 **const** 对变量的类型加以限定。 ***初始化和const*** 因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。一如既往,初始值可以是任意复杂的表达 阅读全文
posted @ 2023-07-03 21:40 CodeMagicianT 阅读(95) 评论(0) 推荐(0)
摘要: # 49.什么是类的继承? ## 1.类与类之间的关系 has-A包含关系,用以描述一个类由多个部件类构成,实现has-A关系用类的成员属性表示,即一个类的成员属性是另一个已经定义好的类; use-A,一个类使用另一个类,通过类之间的成员函数相互联系,定义友元或者通过传递参数的方式来实现; is-A 阅读全文
posted @ 2023-07-03 21:40 CodeMagicianT 阅读(68) 评论(0) 推荐(0)
摘要: # 45.形参与实参的区别? 1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确 阅读全文
posted @ 2023-07-03 21:39 CodeMagicianT 阅读(88) 评论(0) 推荐(0)
摘要: # 46.值传递、指针传递、引用传递的区别和效率 1.值传递:有一个实参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象或是大的结构体对象,将耗费一定的时间和空间。(传值) 2.指针传递:同样有一个实参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个固定为4字节(32位操作系统)的地址。(传值 阅读全文
posted @ 2023-07-03 21:39 CodeMagicianT 阅读(383) 评论(0) 推荐(0)
摘要: # 43.static的用法和作用? 在C++中,`static`关键字有多种用法,可以用于声明静态成员变量、静态成员函数、静态局部变量和静态全局变量。下面是它们的作用和特点: ## 1.静态成员变量 ●在类内声明,类外进行定义和初始化(const修饰的静态成员变量最好在类内初始化) ```C++ 阅读全文
posted @ 2023-07-03 21:38 CodeMagicianT 阅读(132) 评论(0) 推荐(0)
摘要: # 44.C++中的const 编写程序过程中,我们有时不希望改变某个变量的值。此时就可以使用关键字 **const** 对变量的类型加以限定。 ***初始化和const*** 因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。一如既往,初始值可以是任意复杂的表达式: `` 阅读全文
posted @ 2023-07-03 21:38 CodeMagicianT 阅读(158) 评论(0) 推荐(0)
摘要: # 42.C++的异常处理的方法 在程序执行过程中,由于程序员的疏忽或是系统资源紧张等因素都有可能导致异常,任何程序都无法保证绝对的稳定,常见的异常有: - 数组下标越界 - 除法计算时除数为0 - 动态分配空间时空间不足 - ... 如果不及时对这些异常进行处理,程序多数情况下都会崩溃。 ## 1 阅读全文
posted @ 2023-07-03 21:37 CodeMagicianT 阅读(107) 评论(0) 推荐(0)
摘要: # 41.C++中有几种类型的new 在C++中,new有三种典型的使用方法:plain new,nothrow new和placement new (1)**plain new** 言下之意就是普通的new,就是我们常用的new,在C++中定义如下: ```C++ void* operator n 阅读全文
posted @ 2023-07-03 21:36 CodeMagicianT 阅读(152) 评论(0) 推荐(0)
摘要: # 39.volatile、mutable和explicit关键字的用法 ## 1.**volatile** ==☀警告== ``` volatile的确切含义与机器有关,只能通过阅读编译器文档来理解。要想让使用了volatile的程序在移植到新机器或新编译器后仍然有效,通常需要对该程序进行某些改变 阅读全文
posted @ 2023-07-03 21:35 CodeMagicianT 阅读(138) 评论(0) 推荐(0)
摘要: # 40.什么情况下会调用拷贝构造函数 - 用类的一个实例化对象去初始化另一个对象的时候 - 函数的参数是类的对象时(非引用传递) - 函数的返回值是函数体内局部对象的类的对象时 ,此时虽然发生(Named return Value优化)NRV优化,但是由于返回方式是值传递,所以会在返回值的地方调用 阅读全文
posted @ 2023-07-03 21:35 CodeMagicianT 阅读(100) 评论(0) 推荐(0)
摘要: # 38.如何用代码判断大小端存储? 大端存储:字数据的高字节存储在低地址中 小端存储:字数据的低字节存储在低地址中 例如:32bit的数字0x12345678 **所以在Socket编程中,往往需要将操作系统所用的小端存储的IP地址转换为大端存储,这样才能进行网络传输** 小端模式中的存储方式为: 阅读全文
posted @ 2023-07-03 21:29 CodeMagicianT 阅读(102) 评论(0) 推荐(0)
摘要: # 37.public,protected和private访问和继承权限的区别? - public的变量和函数在类的内部外部都可以访问。 - protected的变量和函数只能在类的内部和其派生类中访问。 - private修饰的元素只能在类内访问 派生类可以继承基类中除了构造/析构、赋值运算符重载 阅读全文
posted @ 2023-07-03 21:28 CodeMagicianT 阅读(112) 评论(0) 推荐(0)
摘要: # 36.内联函数和宏定义的区别 ■在使用时,宏只做简单字符串替换(编译前)。内联函数在编译时直接将函数代码嵌入到目标代码中,可以进行参数类型检查(编译时),语法判断等功能,且具有返回值,可以实现重载。 ■宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误,宏定义时要注意书写(参数要括起来)否则 阅读全文
posted @ 2023-07-03 21:26 CodeMagicianT 阅读(91) 评论(0) 推荐(0)
摘要: # 33.C++中的重载、重写(覆盖)和隐藏的区别 (1)重载(overload) 重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关。举个例子: ```C+ 阅读全文
posted @ 2023-07-03 21:25 CodeMagicianT 阅读(220) 评论(0) 推荐(0)
摘要: # 34.C++有哪几种的构造函数 C++中的构造函数可以分为4类: - 默认构造函数:在没有显式定义构造函数时,C++会自动生成一个默认构造函数,该函数没有参数,不执行任何操作。 - 初始化构造函数(有参数) - 拷贝构造函数:当使用现有对象初始化新对象时,拷贝构造函数被调用。它的语法是在函数声明 阅读全文
posted @ 2023-07-03 21:25 CodeMagicianT 阅读(465) 评论(0) 推荐(0)
摘要: # 35.浅拷贝和深拷贝的区别 **浅拷贝** 浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会出现错误。 **深拷贝** 深拷贝不仅拷贝值,还开辟出一块新的空间用来存放新的值,即使原先的对象被析构 阅读全文
posted @ 2023-07-03 21:25 CodeMagicianT 阅读(48) 评论(0) 推荐(0)
摘要: # 32.C和C++的类型安全 **什么是类型安全?** 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型 阅读全文
posted @ 2023-07-03 21:24 CodeMagicianT 阅读(154) 评论(0) 推荐(0)
摘要: # 31.野指针和悬空指针 都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。 ●野指针 “野指针”(wild pointer):是没有被初始化过的指针,所以不确定指针具体指向。因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他 阅读全文
posted @ 2023-07-03 21:23 CodeMagicianT 阅读(129) 评论(0) 推荐(0)
摘要: # 30.externC的用法 为了能够**正确地在C++代码中调用C语言**的代码:在程序中加上extern "C"后,相当于告诉编译器这部分代码是C语言写的,因此要按照C语言进行编译,而不是C++; 哪些情况下使用extern "C": (1)C++代码中调用C语言代码; (2)在C++中的头文 阅读全文
posted @ 2023-07-03 21:23 CodeMagicianT 阅读(84) 评论(0) 推荐(0)
摘要: # 28.拷贝初始化和直接初始化 ●当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数。拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。举例如下 ```C++ strin 阅读全文
posted @ 2023-07-03 21:22 CodeMagicianT 阅读(87) 评论(0) 推荐(0)
摘要: # 29.初始化和赋值的区别 在C++中,初始化和赋值是两个不同的概念。 需要注意的是,对于某些类型的变量,初始化和赋值的效果是一样的。例如,对于基本类型的变量,使用等号进行初始化和赋值的效果是一样的。但是对于一些复杂类型的变量,如类对象,初始化和赋值的效果是不同的。在这种情况下,初始化会调用类的构 阅读全文
posted @ 2023-07-03 21:22 CodeMagicianT 阅读(384) 评论(0) 推荐(0)
摘要: # 27.final和override关键字 在C++中,final是一个关键字,用于修饰类的成员变量和成员函数。 1.final修饰成员变量:当一个类中的成员变量被声明为final时,它就变成了常量,即它的值不能再被修改。final修饰的成员变量必须在类定义中进行初始化,且只能初始化一次。 假设我 阅读全文
posted @ 2023-07-03 21:22 CodeMagicianT 阅读(82) 评论(0) 推荐(0)
摘要: # 26.数组名和指针(这里为指向数组首元素的指针)区别? - 二者均可通过增减偏移量来访问数组中的元素。 - 数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。 - **当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeo 阅读全文
posted @ 2023-07-03 21:21 CodeMagicianT 阅读(45) 评论(0) 推荐(0)
摘要: # 25.C++的顶层const和底层const 任意常量对象为**顶层const**,包括常量指针;指向常量的指针和声明const的引用都为**底层const** 顶层const(top-level const)表示指针本身是个常量int* const ptr=&m; 此时指针不可以发生改变,但是 阅读全文
posted @ 2023-07-03 21:21 CodeMagicianT 阅读(86) 评论(0) 推荐(0)
摘要: # 24.C++中const和static的作用 **static** ●不考虑类的情况 ○隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用 ○默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区 ○静 阅读全文
posted @ 2023-07-03 21:20 CodeMagicianT 阅读(87) 评论(0) 推荐(0)
摘要: # 23.define宏定义和const的区别 **编译阶段** - define是在编译的**预处理**阶段起作用,而const是在编译、运行的时候起作用 **安全性** - define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部的内容,要不然很容易出错 阅读全文
posted @ 2023-07-03 21:20 CodeMagicianT 阅读(46) 评论(0) 推荐(0)
摘要: # 22.C++中struct和class的区别 **相同点** - 两者都拥有成员函数、公有和私有部分 - 任何可以使用class完成的工作,同样可以使用struct完成 **不同点** - C中struct是没有权限的设置的,struct成员权限默认是公有的,且struct中只能是一些变量的集合 阅读全文
posted @ 2023-07-03 21:19 CodeMagicianT 阅读(75) 评论(0) 推荐(0)
摘要: # 21.C++与Java的区别 **语言特性** - Java语言给开发人员提供了更为简洁的语法;完全面向对象,由于JVM(Java虚拟机)可以安装到任何的操作系统上,所以说它的可移植性强 - Java语言中没有指针的概念,引入了真正的数组。不同于C++中利用指针实现的“伪数组”,Java引入了真 阅读全文
posted @ 2023-07-03 21:18 CodeMagicianT 阅读(70) 评论(0) 推荐(0)
摘要: # 20.C++和C语言的区别 - C++中new和delete是对内存分配的运算符,取代了C中的malloc和free。 - 标准C++中的字符串类取代了标准C函数库头文件中的字符数组处理函数(C中没有字符串类型)。 - C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio 阅读全文
posted @ 2023-07-03 21:18 CodeMagicianT 阅读(115) 评论(0) 推荐(0)
摘要: # 19.C++和Python的区别 包括但不限于: - Python是一种脚本语言,是解释执行的,而C++是编译语言,是需要编译后在特定平台运行的。python可以很方便的跨平台,但是效率没有C++高。 - Python使用缩进来区分不同的代码块,C++使用花括号来区分 - C++中需要事先定义变 阅读全文
posted @ 2023-07-03 21:17 CodeMagicianT 阅读(383) 评论(0) 推荐(0)
摘要: # 17.常量指针和指针常量区别? ## 1)常量指针(指向常量的指针) 语法:const 数据类型 *变量名; 不能通过解引用的方法修改内存地址中的值(用原始的变量名是可以修改的)。 注意: ●指向的变量(对象)可以改变(之前是指向变量a的,后来可以改为指向变量b)。 ●一般用于修饰函数的形参,表 阅读全文
posted @ 2023-07-03 21:17 CodeMagicianT 阅读(193) 评论(0) 推荐(0)
摘要: # 18.a和&a有什么区别? 假设数组int a[10]; int (*p)[10] = &a;其中: - a是数组名,是数组首元素地址,+1表示地址值加上一个int类型的大小,如果a的值是0x00000001,加1操作后变为0x00000005。*(a + 1) = a[1]。 - &a是数组的 阅读全文
posted @ 2023-07-03 21:17 CodeMagicianT 阅读(82) 评论(0) 推荐(0)
摘要: # 14.宏定义和typedef区别? - 宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名。 - 宏替换发生在编译阶段之前,属于文本插入替换;typedef是编译的一部分。 - 宏不检查类型;typedef会检查数据类型。 - 宏不是语句,不在在最后加分号;typedef是语 阅读全文
posted @ 2023-07-03 21:16 CodeMagicianT 阅读(302) 评论(0) 推荐(0)
摘要: # 15.变量声明和定义区别? - 声明仅仅是把变量的声明的位置及类型提供给编译器,并不分配内存空间;定义要在定义的地方为其分配存储空间。 - 相同变量可以在多处声明(外部变量extern),但只能在一处定义。 阅读全文
posted @ 2023-07-03 21:16 CodeMagicianT 阅读(39) 评论(0) 推荐(0)
摘要: # 16.strlen和sizeof区别? - sizeof是运算符,并不是函数,结果在编译时得到而非运行中获得;strlen是字符处理的库函数。 - sizeof参数可以是任何数据的类型或者数据(sizeof参数不退化);strlen的参数只能是字符指针且结尾是'\0'的字符串。 - 因为size 阅读全文
posted @ 2023-07-03 21:16 CodeMagicianT 阅读(31) 评论(0) 推荐(0)
摘要: # 11.既然有了malloc-free,C++中为什么还需要new-delete呢?直接用malloc-free不好吗? - malloc/free和new/delete都是用来申请内存和回收内存的。 - 在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函 阅读全文
posted @ 2023-07-03 21:15 CodeMagicianT 阅读(56) 评论(0) 推荐(0)
摘要: # 12.被free回收的内存是立即返还给操作系统吗? 不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝试从这些内存中寻找合适的返回。这样就避免了频繁的系统调用,占用过多的系统资源。同时ptmalloc也会尝试对小块内存进行合并,避免过多的内存 阅读全文
posted @ 2023-07-03 21:15 CodeMagicianT 阅读(62) 评论(0) 推荐(0)
摘要: # 13.宏定义和函数有何区别? - 宏在预处理阶段完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。 - 宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值。 - 宏定义参数没有类型,不进行类型检查;函数参 阅读全文
posted @ 2023-07-03 21:15 CodeMagicianT 阅读(81) 评论(0) 推荐(0)
摘要: # 9.new和delete是如何实现的? - new的实现过程是:首先调用名为**operator new**的标准库函数,分配足够大的原始为类型化的内存,以保存指定类型的一个对象;接下来运行该类型的一个构造函数,用指定初始化构造对象;最后返回指向新分配并构造后的的对象的指针 - delete的实 阅读全文
posted @ 2023-07-03 21:14 CodeMagicianT 阅读(77) 评论(0) 推荐(0)
摘要: # 10.malloc和new的区别? - malloc和free是标准库函数,支持覆盖;new和delete是运算符,支持重载。 - malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功 阅读全文
posted @ 2023-07-03 21:14 CodeMagicianT 阅读(37) 评论(0) 推荐(0)
摘要: # 7.区别以下指针类型? ```C++ int *p[10] int (*p)[10] int *p(int) int (*p)(int) ``` - int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。 - int (*p) 阅读全文
posted @ 2023-07-03 21:13 CodeMagicianT 阅读(46) 评论(0) 推荐(0)
摘要: # 8.new-delete操作与malloc-free的操作异同 **相同点** ●都可用于内存的动态申请和释放 ●new和malloc都可以分配指定大小的内存块,并且分配的内存都在堆上。 ●new和malloc的结果都返回一个指向已分配内存的指针。 ●都允许使用字面量作为参数来分配内存。 **不 阅读全文
posted @ 2023-07-03 21:13 CodeMagicianT 阅读(46) 评论(0) 推荐(0)
摘要: # 5.堆和栈的区别 - 申请方式不同。 - 栈由系统自动分配。 - 堆是自己申请和释放的。 - 申请大小限制不同。 - 栈顶和栈底是之前预设好的,栈是向栈底扩展,大小固定,可以通过ulimit -a查看,由ulimit -s修改。 - 堆向高地址扩展,是不连续的内存区域,大小可以灵活调整。 - 申 阅读全文
posted @ 2023-07-03 21:12 CodeMagicianT 阅读(95) 评论(0) 推荐(0)
摘要: # 6.你觉得栈快一点还是堆快一点? 毫无疑问是栈快一点。 因为操作系统会在底层对栈提供支持,会分配专门的寄存器存放栈的地址,栈的入栈出栈操作也十分简单,并且有专门的指令执行,所以栈的效率比较高也比较快。 而堆的操作是由C/C++函数库提供的,在分配堆内存的时候需要一定的算法寻找合适大小的内存。并且 阅读全文
posted @ 2023-07-03 21:12 CodeMagicianT 阅读(156) 评论(0) 推荐(0)
摘要: # 3.指针和引用的区别 - 指针是一个变量,存储的是一个地址,需要占用存储空间;引用本质上是一个常量指针,引用跟原来的变量实质上是同一个东西,是原变量的别名 - 指针可以有多级,引用只有一级 - 指针可以为空,引用不能为NULL(必须有具体实体) - 指针声明和定义可以分开,可以先只声明指针变量而 阅读全文
posted @ 2023-07-03 21:11 CodeMagicianT 阅读(101) 评论(0) 推荐(0)
摘要: # 4.在传递函数参数时,什么时候该使用指针,什么时候该使用引用呢? ●需要返回函数内局部变量的内存的时候用指针。使用指针传参需要开辟内存,用完要记得释放指针,不然会内存泄漏。而返回局部变量的引用是没有意义的 ``` 如果需要返回函数内局部变量的内存,应该使用指针而不是引用。 原因如下: 1.因为引 阅读全文
posted @ 2023-07-03 21:11 CodeMagicianT 阅读(726) 评论(0) 推荐(0)
摘要: 例子1: ```C++ struct S1 { char c1; int i; char c2; }; ``` ```C #include struct S1 { char c1; int i; char c2; }; int main() { printf("%d\n", sizeof(struc 阅读全文
posted @ 2023-07-03 21:10 CodeMagicianT 阅读(179) 评论(0) 推荐(0)
摘要: # 1.在main执行之前和之后的代码可能是什么? **main函数执⾏之前,主要就是初始化系统相关资源:** ■设置栈指针:所谓设置栈,就是将栈指针指向某块内存 ■初始化静态`static`变量和`global`全局变量,即`.data`段的内容 ■将未初始化部分的全局变量赋初值:数值型`shor 阅读全文
posted @ 2023-07-03 21:07 CodeMagicianT 阅读(260) 评论(0) 推荐(0)