- 博客(464)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【C++图解专栏】手撕数据结构与算法,探寻算法的魅力
在这个专栏,我将带着大家一起用 C++ 手撕基础的数据结构与算法,希望能够带领大家快速入门这个课程。数据结构与算法是大学计算机专业课中最重要的一门,学起来必然不轻松,所以遇到困难是非常正常的一件事。相信我,只要能够坚持下去,自己动手敲一遍一定会有不少的收获!
2022-08-20 22:32:59
8510
42
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【C++题解集合】PAT甲级真题(包含所有类型题解)
📚专栏目标:PAT甲级真题题解集合📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!🎏唠叨唠叨:在这个专栏里我将会整理 PAT 甲级的真题题解,并将他们进行分类,方便大家参考。
2022-08-11 22:27:19
6306
24
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【C++题解】剑指offer第二版,面试必备专栏
📚专栏目标:剑指offer系列题解📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!🎏唠叨唠叨:在这个专栏里,我会整理所有剑指 offer 第二版的题解,这里面的思路也参考了各个大佬。一方面我希望通过这个专栏加深我对于剑指 offer 题目的理解,另一方面也想将所有题目整合在一起方便大家参考。
2022-08-11 21:56:30
1452
9
原创 【C++ 面试 - 面向对象】每日 3 题(十二)
为了避免这些问题,通常建议在析构函数中处理异常或者避免执行会抛出异常的函数,可以在析构函数中使用 try-catch 块来捕获和处理潜在的异常,确保资源得到正确释放和清理保证程序的稳定性和健壮性。在执行语句 1 时,会提示 new 方法已经被删除,如果将 new 设置为私有方法,则会报惨不忍睹的错误,因此使用 delete 关键字可以更加人性化的删除一些默认方法。对象存在,用别的对象给它赋值,这属于重载 "=" 号运算符的范畴,"=" 号两侧的对象都是已存在的。因此会造成内存泄漏。
2024-08-24 11:19:09
649
原创 【C++ 面试 - 面向对象】每日 3 题(十一)
我们用对象 a 初始化对象 b,后对象 a 我们就不再使用了,但是对象 a 的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把 a 对象的内容复制一份到 b 中,那么为什么我们不能直接使用 a 的空间呢?避免的方法就是将第一个指针(比如 a->value)置为 NULL,这样在调用析构函数的时候,由于有判断是否为 NULL 的语句,所以析构 a 的时候并不会回收 a->value 指向的空间;我们都知道,C++ 的赋值操作是会产生临时对象的,临时对象的出现会降低程序的效率。② 成员类对象构造函数。
2024-08-24 11:17:14
587
原创 【C++ 面试 - 面向对象】每日 3 题(十)
C++ 中的构造函数可以分为 4 类:默认构造函数初始化构造函数(有参数)拷贝构造函数移动构造函数(move 和右值引用)委托构造函数转换构造函数举个例子: 默认构造函数和初始化构造函数在定义类的对象,完成对象的初始化工作复制构造函数用于复制本类的对象转换构造函数用于将其他类型的变量,隐式转换为本类对象C++11 引入了委托构造的概念,某个类型的一个构造函数可以委托同类型的另一个构造函数对对象进行初始化。为了描述方便我们称前者为委托构造函数,后者为目标构造函数。委托构造函数会将控制权交给目标构造
2024-08-23 19:08:00
600
原创 【C++ 面试 - 面向对象】每日 3 题(九)
如果功能的接口由团队 A(或者是一个通用的功能提供者)来定义,而团队 B 负责实际的功能实现,那么通常情况下虚函数应该添加到基类中。团队 A 定义基类,其中包含虚函数声明,但不提供实现,或直接提供纯虚函数。团队 B 创建派生类,继承自基类,并重写虚函数以提供特定功能的实现。这种方式允许团队 A 定义接口规范,而团队 B 则根据规范来实现功能。
2024-08-23 19:05:50
617
原创 【C++ 面试 - 面向对象】每日 3 题(八)
同时,virtual function 的实现大多利用了一个 “虚函数表” 的东西,这种实现中一个类的内存布局 (或者说虚函数表的内存布局) 需要在这个类编译完成的时候就被完全确定。虚函数表是针对类的,类的所有对象共享这个类的虚函数表,因为每个对象内部都保存一个指向该类虚函数表的指 针 vptr ,每个对象的 vptr 的存放地址都不同,但都指向同一虚函数表。问题的意思是,为什么在 C++ 里面,一个类的成员函数不能既是 template 又是 virtual 的。
2024-08-22 21:19:51
337
原创 【C++ 面试 - 面向对象】每日 3 题(七)
静态类型:对象在声明时采用的类型,在编译期既已确定;动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;静态绑定(早绑定):绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;动态绑定(晚绑定):绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;
2024-08-22 21:18:00
1184
原创 【C++ 面试 - 面向对象】每日 3 题(六)
虚函数是为了实现动态编联产生的,目的是通过基类类型的指针指向不同对象时,自动调用相应的、和基类同名的函数(使用同一种调用形式,既能调用派生类又能调用基类的同名函数)。,每个含有虚函数的类中都有一个虚函数表,该虚函数表存储着该类的所有的虚函数的地址。既然是虚函数,它的函数指针会被存在虚函数表中,由于纯虚函数并没有具体的函数体,因此它在虚函数表中的值就为 0,而具有函数体的虚函数则是函数的具体地址。,内联函数表示在编译阶段进行函数体的替换操作,而虚函数意味着在运行期间进行类型确定,所以内联函数不能是虚函数。
2024-08-21 20:40:05
1349
原创 【C++ 面试 - 面向对象】每日 3 题(五)
虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不在堆中。关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。,指向对象所属类的虚表。一个类只有虚函数才会存在虚函数表,同属于一个类的对象共享虚函数表,但是有各自的虚函数表指针(当然,这个内容是相同的)。
2024-08-21 20:31:42
1221
原创 【C++ 面试 - 面向对象】每日 3 题(四)
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。
2024-08-20 20:53:22
915
原创 【C++ 面试 - 面向对象】每日 3 题(三)
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~C 语言中不允许有同名函数,因为编译时函数命名是一样的,不像 C++ 会添加参数类型和返回类型作为函数编译后的名称,进而实现重载。如果要用 C 语言显现函数重载,可通过以下方式来实现:使用函数指针来实现,重载的函数不能使用同名称,只是类似的实现了函数重载功能重载函数使用可变参数,方式如打开文件 open 函数gcc 有内置函数,程序使用编译函数可以实现函数重载。
2024-08-20 20:49:46
681
原创 【C++ 面试 - 面向对象】每日 3 题(二)
C++ 是面向对象的(object oriented programming—OOP):强调对象,由对象实施动作。C 是面向过程的(procedure oriented programming—POP):强调执行的过程。总结起来就是:面向对象是首先抽象出各种对象(各种类),把数据和方法都封装在对象中(类),然后各个对象之间发生相互作用。面向过程是将问题分解成若干步骤(动作),每个步骤(动作)用一个函数来实现,在使用的时候,将数据传递给这些函数。public: 可以被该类中的函数、子类的函数、其友元函数访问,
2024-08-19 20:59:35
1036
原创 【C++ 面试 - 面向对象】每日 3 题(一)
三大特性:继承、封装和多态(1)继承让某种类型对象获得另一个类型对象的属性和方法。它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。常见的继承有三种方式:实现继承:指使用基类的属性和方法而无需额外编码的能力接口继承:指仅使用属性和方法的名称、但是子类必须提供实现的能力可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力(C++里好像不怎么用)例如,将人定义为一个抽象类,拥有姓名、性别、年龄等公共属性,吃饭、睡觉、走路等公共方法,在定义一个具体的人时,就可以继承这个抽象
2024-08-19 20:56:06
1142
原创 【C++ 面试 - 基础题】每日 3 题(十八)
在回答这个问题之前,先套用《深度探索 C++ 对象模型》中的一段话,“一个指向字符串的指针是如何地与一个指向整数的指针或一个指向其他自定义类型对象的指针有所不同呢?指向不同类型之各指针间的差异,既不在其指针表示法不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的对象类型不同。如果 type-id 是类指针类型,那么 expression 也必须是一个指针,如果 type-id 是一个引用,那么 expression 也必须是一个引用。可以将指针值转换为一个整型数,但不能用于非指针类型的转换。
2024-08-15 21:00:42
1175
原创 【C++ 面试 - 基础题】每日 3 题(十七)
好的接口很容易被正确使用,不容易被误用,名字上容易辨别。在所有接口设计中都应该秉行这条准则。让接口更容易用对,就要把接口做得一致;易于记忆,逻辑上也要与原始类型和标准类型保持一致。预防接口误用的方法:包括定义新的包装类型、限制运算符操作、限制取值范围、不要让用户负责管理资源。shared_ptr 支持自定义的删除器,实现我们想要的析构机制。此外,它还能防止 DLL 交叉问题,而且也能被用来管理其它资源 (例如 Mutex 锁等)。为了保证平台的通用性,程序中尽量不要使用 long 数据库型。可以使用固定大小
2024-08-14 20:10:34
1038
原创 【C++ 面试 - 基础题】每日 3 题(十六)
总结一下,在网络传输中,通常使用大端字节序 (网络字节序)。从网络字节序到主机字节序的转换函数:ntohs、ntohl。将未初始化部分的赋初值:数值型 short,int,long 等为 0,bool 为 FALSE,指针为 NULL,等等,即 .bss 段的内容。将 main 函数的参数,argc,argv 等传递给 main 函数,然后才真正运行 main 函数。字节序的单位应该是字节,所以 string (char 为组织结构) 是没有大小端之分的。看着是反过来的,数据低位存在内存小位 (低位)。
2024-08-14 20:08:47
306
原创 【C++ 面试 - 基础题】每日 3 题(十五)
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~为了谈应用,先谈谈使命。模板元编程的根在模板。模板的使命很简单:为自动代码生成提供方便。提高程序员生产率的一个非常有效的方法就是 “代码复用”,而面向对象很重要的一个贡献就是通过内部紧耦合和外部松耦合将 “思想” 转化成一个一个容易复用的 “概念”。但是面向对象提供的工具箱里面所包含的继承,组合与多态并不能完全满足实际编程中对于代码复用的全部要求,于是模板就应运而生了。模板是更智能的宏。
2024-08-13 21:20:34
1117
原创 【C++ 面试 - 基础题】每日 3 题(十四)
在编译器编译源代码时,如果遇到了模板的定义,编译器会将其保存在内存中,但是并不会生成对应的代码。当程序中需要使用这个模板时,编译器会根据模板参数的类型和数量,生成具体的代码,这个过程称为模板的实例化。当程序需要调用这个函数时,编译器会根据实际的参数类型,生成对应的代码。总的来说,C++ 模板的底层实现是通过编译器进行的,包括模板的实例化和代码的生成。这个过程是在编译期完成的,可以提高程序的性能。当模板被实例化之后,编译器会根据实例化的代码生成对应的目标代码。这个过程和普通的函数生成过程是类似的。
2024-08-13 21:18:11
359
原创 【C++ 面试 - 基础题】每日 3 题(十二)
声明 static 变量一般是为了在本 cpp 文件中的 static 变量不能被其他的 cpp 文件引用,但是对于头文件,因为 cpp 文件中包含了头文件,故相当于该 static 变量在本 cpp 文件中也可以被见到。这是因为在这种情况下,复制指针并不会对程序产生任何负面影响。时,进行对象拷贝操作时需要使用深拷贝,以确保新的对象与原始对象完全独立,对一个对象的修改不会影响另一个对象,并且防止。创建一个新的对象和数组,将原对象的各项属性的 “值”(数组的所有元素)拷贝过来,是 “值” 而不是 “引用”。
2024-08-12 21:02:07
476
原创 【C++ 面试 - 基础题】每日 3 题(十)
首先明白 C/C++ 中变量的声明和定义是两个不同的概念声明是指告诉编译器某个符号的存在,在程序变量表中记录类型和名字,而定义则是指为该符号分配内存空间或实现其代码逻辑。凡是没有带 extern 的声明同时也都是定义。而对函数而言,带有 {} 是定义,否则是声明。如果想声明一个变量而非定义它,就在变量名前添加关键字 extern ,且不要显式的初始化变量。// 声明// 定义return a+b;
2024-08-11 14:25:02
792
原创 【C++ 面试 - 基础题】每日 3 题(九)
变量的定义为变量分配地址和存储空间, 变量的声明不分配地址。一个变量可以在多个地方声明,但是只在一个 地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。
2024-08-11 14:19:21
925
原创 【C++ 面试 - 基础题】每日 3 题(七)
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~不考虑类的情况隐藏。所有不加 static 的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用。默认初始化为 0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区。静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用。考虑类的情况static 成员变量:只与类关联,不与类的对象关联。
2024-08-08 21:17:42
1001
原创 【C++ 面试 - 基础题】每日 3 题(六)
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~外部链接的符号可以在不同的源文件之间共享,并且在整个程序执行期间可见。全局变量和函数都具有外部链接。内部链接的符号只能在当前源文件内部使用,不能被其他源文件访问。用 static 修饰的全局变量和函数具有内部链接。无链接的符号只能在当前代码块 (函数或代码块) 内部使用,不能被其他函数或代码块访问。用 const 或 constexpr 修饰的常量具有无链接属性 (通常情况下编译器是不会为 const 对象分配内存,也就无法链接)
2024-08-08 21:09:46
609
原创 【C++ 面试 - 基础题】每日 3 题(五)
是在编译时不直接拷贝执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定代码时,在共享执行内存中寻找已经加载的动态库可执行代码,实现运行时链接;通过指针访问对象时,编译器会生成相应的指针操作指令,如加载指针的值、存储指针的值、指针偏移等。引用更安全些,因为能够确保引用指的是分配的一块内存,而指针可能会出现野指针的情况。使用引用访问对象时,编译器会将引用直接转换为对对象的访问,而不会生成额外的指令。
2024-08-07 21:04:24
364
原创 【C++ 面试 - 基础题】每日 3 题(四)
表示指针本身是常量,即指针本身不可修改,但所指向的对象可以修改。悬挂指针:当指针所指向的对象被释放,但是该指针没有任何改变,以至于其仍然指向已经被回收的内存地址,这种情况下该指针被称为悬挂指针;表示指针指向的对象是常量,即指针所指向的值不可修改。底层 const 出现在指针右侧,表示指针指向的对象是常量。由于 const 修饰的是 p,所以 p 不能修改,即指针的值不能修改,即指针的指向不能修改。特点:和指针常量的特点一样,指向的值能改变,指针的指向不能改变。特点:指针的指向和指向的值都不能更改。
2024-08-07 21:02:27
577
原创 【Golang 面试 - 进阶题】每日 3 题(十八)
Go channel 是线程安全的,原因在于 channel 内部实现了同步机制,它可以保证在多个 goroutine 之间的同步和互斥访问。发送和接收。当一个 goroutine 向一个 channel 发送数据时,如果 channel 已满,那么发送操作会被阻塞,直到 channel 中有足够的空间。同样地,当一个 goroutine 从一个 channel 接收数据时,如果 channel 已空,那么接收操作也会被阻塞,直到 channel 中有新的数据可供接收。
2024-08-04 21:11:38
1014
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人