![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++面试及入门
文章平均质量分 74
C++常见面试题
阳光开朗男孩
躺平才是王道
展开
-
对上一段buffer的保存的应用
队列queue固定大小的使用,通过deque来保存上一段buffer。原创 2023-11-30 11:54:34 · 112 阅读 · 0 评论 -
window下系统环境变量修改
【代码】window下系统环境变量修改。原创 2023-11-15 15:50:48 · 439 阅读 · 0 评论 -
std::string与LPCTSTR/LPWSTR互转
【代码】std::string与LPCTSTR/LPWSTR互转。原创 2023-11-15 15:50:20 · 461 阅读 · 0 评论 -
获取当前程序运行路径
【代码】获取当前程序运行路径。原创 2023-11-15 15:48:07 · 196 阅读 · 0 评论 -
C++ map clear内存泄漏问题
STL容器调用clear()方法,通常只是使得容器内部的对象通通析构,但容器本身的内存无法得到释放。即篮子里面东西拿走了,篮子占的空间还在,这样是为了方便下次存放新的对象时,不需要再次申请空间。map自带的clear()函数会清空map里存储的所有内容,但如果map值存储的是指针,则里面的值不会被清空,会造成内存泄漏,所以值为指针的map必须用迭代器清空。若需要多次使用同一个map,其中每次使用后都clear清空,多次之后,可能出现内存泄露,这是因为map的空间便没有释放,所以得使用swap清空。原创 2023-09-06 15:55:26 · 2763 阅读 · 0 评论 -
Win10远程桌面连接黑屏
查找本地计算机 >> 计算机配置 >> 管理模版 >> Windows组件 >> 远程桌面服务 >> 远程桌面会话主机 >> 远程会话环境 >> 为远程桌面连接使用WDDM图形显示驱动程序,并将其值设置为禁用。按键盘Win+R打开运行,输入命令gpedit.msc打开本地组策略编辑器。使用远程桌面连接报下面这个错误时候。重启windows操作系统。原创 2023-09-05 18:06:41 · 1131 阅读 · 0 评论 -
剑指offer-2.2字符串
我们还是以前面的字符串"We are happy."为例,"We are happy."这个字符串的长度是14(包括结尾符号"0’),里面有两个空格,因此替换之后字符串的长度是18。在面试的过程中,我们也可以和前面的分析一样画一两个示意图解释自己的思路,这样既能帮助我们理清思路,也能使我们和面试官的交流变得更加高效。最直观的做法是从头到尾扫描字符串,每一次碰到空格字符的时候做替换。1)输入的字符串中包含空格(空格位于字符串的最前面,空格位于字符串的最后面,空格位于字符串的中间,字符串中有连续多个空格)。原创 2023-08-16 18:44:00 · 69 阅读 · 0 评论 -
剑指offer-2.1数组
当数据的数目超过数组的容量时,我们再重新分配一块更大的空间(STL的 vector每次扩充容量时,新的容量都是前一次的两倍),把之前的数据复制到新的数组中,再把之前的内存释放,这样就能减少内存的浪费。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。2)二维数组中没有查找的数字(查找的数字大于数组中的最大值,查找的数字小于数组中的最小值,查找的数字在数组的最大值和最小值之间但数组中没有这个数字)。原创 2023-08-15 18:31:22 · 126 阅读 · 0 评论 -
剑指offer-1.1C++
空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与类型的实例无关,编译器也不会因为这两个函数而在实例内添加任何额外的信息。和传入的参数是同一个实例时,那么-一旦释放了自身的内存,传入的参数的内存也同时被释放了,因此再也找不到需要赋值的内容了。1)是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即。原创 2023-08-11 10:27:42 · 111 阅读 · 0 评论 -
std::mem_fn
函数模板 std::mem_fn 生成指向成员指针的包装对象,它可以存储、复制及调用指向成员指针。到对象的引用和指针(含智能指针)可在调用 std::mem_fn 时使用。若 pm 为指向成员函数的指针,则为 pm 的返回类型,对指向成员对象的指针不定义。若 pm 是指向接收一个 T1 类型参数的成员函数的指针则为 T1。2)不支持类protected访问权限的成员(函数或数据)若 pm 是指向接收一个参数的成员函数的指针则为 T*3)不支持类private访问权限的成员(函数或数据)原创 2023-08-03 16:33:46 · 212 阅读 · 0 评论 -
std::for_each()
在 C++ 标准库中,std::for_each() 算法函数提供了一种方便的方式来对容器范围内的元素执行指定的操作。使用 std::for_each() 函数时,我们可以选择使用函数对象、函数指针或 Lambda 表达式作为操作函数。无论我们选择哪种方式,std::for_each() 都会自动遍历容器范围内的每个元素,并将每个元素传递给操作函数进行处理。总结一下,std::for_each() 是一个非常方便的算法函数,可用于对容器中的元素执行相同的操作。输出结果为:1 2 3 4 5。原创 2023-08-03 16:13:56 · 243 阅读 · 0 评论 -
std::stox类型
如果成功则返回转换的unsigned long long型数值,如果转换失败,则会抛出invalid_argument异常,如果待转换的字符所代表的数值超出数值类型范围的两倍,则会抛出out_of_range异常。如果成功则返回转换的long long型数值,如果转换失败,则会抛出invalid_argument异常,如果待转换的字符所代表的数值超出数值类型范围的两倍,则会抛出out_of_range异常。将std::string字符串转换为unsigned long long类型。原创 2023-07-19 11:46:16 · 314 阅读 · 0 评论 -
tuple基本用法
C++11 标准新引入了一种类模板,命名为 tuple(中文可直译为元组)。tuple 最大的特点是:实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛,例如当需要存储多个不同类型的元素时,可以使用 tuple;当函数需要返回多个数据时,可以将这些数据存储在 tuple 中,函数只需返回一个 tuple 对象即可。原创 2023-05-22 13:39:00 · 2377 阅读 · 0 评论 -
Lambda表达式
在lambda函数定义中,参数列表和返回值类型都是可省略部分,而捕捉列表和函数体可以为空,但不可省略,因此C++11中最简单的lambda函数为:[]{};因为这是按引用捕获,lambda在访问时也将直接访问这个引用,也就是函数内的&v1,因此即使在lambda被创建之后v1的值有所改变,lambda也依旧是可以直接访问这个引用变量。按引用捕获可以让lambda表达式能够访问引用变量,这种捕获方式在编译期间不会把变量的值复制到lambda的局部作用域,而是直接对这个引用所指的变量进行操作。原创 2023-05-19 19:05:05 · 709 阅读 · 1 评论 -
表白
#include <iostream>#include <windows.h>#include <stdio.h>using namespace std; #define stoptimeshort 40 #define stoptimelong 100 void main() { ////////////////// char ch[10]; int f[9][36]={ 0,1,1,1,原创 2021-06-16 09:42:53 · 105 阅读 · 0 评论 -
C++学习资料
《Thinking In C++》《The C++ Programming Language》《Inside The C++ Object Model》《The Standard C++ Bible》《Effective C++》《More Effective C++》《Exceptional C++》《程序设计实践》《Inside The C++ Object Model》《C++面向对象高效编程(C++ Effective Object-Oriented Software Constr原创 2021-06-16 09:42:30 · 309 阅读 · 0 评论 -
内存
对内的分配32位操作系统支持4GB内存的连续访问,但通常把内存分为两个2GB的空间,每个进程在运行时最大可以使用2GB的私有内存(0x00000000—0x7FFFFFFF)。即理论上支持如下的大数组:char szBuffer[2*1024*1024*1024];当然,由于在实际运行时,程序还有代码段、临时变量段、动态内存申请等,实际上是不可能用到上述那么大的数组的。至于高端的2GB内存地址(0x80000000—0xFFFFFFFF),操作系统一般内部保留使用,即供操作系统内核代码使用。在Wi原创 2021-06-15 09:01:26 · 70 阅读 · 0 评论 -
异常处理
异常处理的基本思想进行异常处理的目标是,使软件具有容错能力,在出现运行环境或者异常操作等问题时,程序能够继续往下运行,必要时弹出提示信息。软件开发中往往每个函数都有自己的分工,很多出现错误的函数都不会处理错误,而是产生一个异常让调用者捕捉和处理。如果调用者也不能处理此异常,则异常就会被继续向上级调用者传递,这个传递过程会一直持续到异常能被处理为止。如果程序最终没能处理这个异常,那么它就会被传递给C++的库函数terminate,然后terminate会调用abort函数终止程序。C++异常处理的语法原创 2021-06-15 09:01:10 · 189 阅读 · 0 评论 -
纯虚函数和抽象类
纯虚函数和抽象类抽象类可以为某个类族提供统一的操作接口。外部可以透明的使用抽象类的统一接口,而不需要知道到底是调用的抽象类的哪个派生类的成员函数。其实这些也可以通过在基类中定义虚函数来实现,但抽象类跟一般类不同的是,它使用纯虚函数,不需要定义纯虚函数的实现,而且抽象类不能实例化,即不能定义抽象类的对象,只能从它继承出非抽象派生类再实例化。抽象类的定义就是,含有纯虚函数的类。纯虚函数跟一般的虚函数有很大不同。我们下面来了解下纯虚函数。纯虚函数即使有的虚函数在基类中不需要做任何工作,我们也要写出一个空原创 2021-06-15 09:00:49 · 456 阅读 · 0 评论 -
虚函数
虚函数的意义在讲赋值兼容规则时给出了一个程序例子,其中包含类Base、Child0和Child1。在程序运行结果中我们看到,main函数中Base类型的指针pBase,分别指向Base、Child0和Child1类的对象时调用的show函数都是基类Base的show函数。因为基类类型的指针指向派生类对象时,通过此指针只能访问从基类继承来的同名成员。但是如果我们希望通过指向派生类对象的基类指针,访问派生类中的同名成员该怎么办呢?这就要用到虚函数了。我们在基类中将某个函数声明为虚函数,就可以通过指向派生类对原创 2021-06-15 09:00:30 · 216 阅读 · 0 评论 -
运算符重载为类的友元函数
运算符重载为类的友元函数友元函数通过类的对象可以访问类的公有、保护和私有成员,也就是类的所有成员友元函数都能访问到。所以运算符重载为类的友元函数以后也可以访问类的所有成员。与运算符重载为成员函数时不同的是,重载的友元函数不属于任何类,运算符的操作数都需要通过函数的形参表传递。操作数在形参表中从左到右出现的顺序就是用运算符写表达式时操作数的顺序。这里也分双目运算符和单目运算符两种情况讨论运算符重载为友元函数的具体方式。双目运算符如果有双目运算符U,它的其中一个操作数是类A的对象a,那么运算符U就可以原创 2021-06-15 08:59:51 · 1868 阅读 · 0 评论 -
运算符重载为类的成员函数
运算符重载运算符重载为类的成员函数后就可以像其他成员函数一样访问本类的数据成员了。在类的外部通过类的对象,可以像原运算符的使用方式那样使用重载的运算符,比如,“+”运算符被重载为类A的成员函数后,A的对象a和其他对象b就可以这样进行加法运算:a+b。重载的运算符可能是双目运算符也可能是单目运算符。如果是双目运算符,比如“+”和“-”,则一个操作数是使用此运算符的对象本身,另一个操作数使用运算符重载函数传递进来的对象。假设有双目运算符U,a为类A的对象,另有某类也可以是A类的对象b,我们想实现a U原创 2021-06-15 08:59:42 · 2812 阅读 · 0 评论 -
运算符重载的概念和规则
运算符重载的概念为什么我们需要运算符重载?因为自定义数据类型有时也需要使用运算符进行某些运算,比如加法运算,但是预定义的运算符的操作数只能是基本数据类型,所以自定义数据类型的运算需要进行运算符重载。例如,有日期类Date声明如下:class Date{public: Date(int nYear, int nMonth, int nDay) { m_nYear=nYear; m_nMonth=nMonth; m_nDay=nDay; } // 构造函数 void show();原创 2021-06-15 08:59:29 · 1964 阅读 · 0 评论 -
多态的概念和类型
消息消息在C++编程中指的是对类的成员函数的调用。多态多态就是指相同的消息被不同类型的对象接收会引起不同的操作,直接点讲,就是在不同的情况下调用同名函数时,可能实际调用的并不是同一个函数。以“+”运算符为例,“+”可以实现整型变量之间、浮点型变量之间的加法运算,也可以实现不同类型变量之间的加法运算,例如整型变量和浮点型变量相加,这时需要先将整型变量转换为浮点变量再进行加法运算。同样是加法运算,参与运算的变量类型不同时,进行加法运算的方式也不同。这就是多态的典型例子。多态的类型多态性有四种类型:原创 2021-06-15 08:59:13 · 2678 阅读 · 0 评论 -
赋值兼容规则
赋值兼容规则派生类如果是从基类公有继承的,则它会包含基类中除构造函数和析构函数外的所有成员,基类的公有成员也成为派生类的公有成员,又因为对象只能访问类的公有成员,所以基类对象具有的功能,派生类对象都有。这样就引出了赋值兼容规则。赋值兼容规则就是指在基类对象可以使用的地方都可以用公有派生类对象来代替。注意必须是公有派生类。赋值兼容规则中的代替有三种方式。鸡啄米通过一个例子分别说明。假设有基类Base,类Child是Base的公有派生类,base为Base类的对象,pBase为Base类指针,child为原创 2021-06-15 08:58:54 · 1861 阅读 · 0 评论 -
虚基类及其派生类的构造函数
虚基类的概念及用法如果派生类的全部或者部分基类有共同的基类,那么派生类的这些直接基类从上一级基类继承的成员都具有相同的名称,定义了派生类的对象后,同名数据成员就会在内存中有多份拷贝,同名函数也会有多个映射。访问这些同名成员时,为了唯一标识它们可以使用上一讲中的作用域分辨符,也可以使用虚基类技术。我们将派生类直接基类的共同基类声明为虚基类后,派生类从不同的直接基类继承来的同名数据成员在内存中就会只有一份拷贝,同名函数也会只有一个映射,这样不仅实现了唯一标识同名成员,而且也节省了内存空间,可见虚基类技术是原创 2021-06-15 08:58:25 · 2933 阅读 · 0 评论 -
作用域分辨符
可见性如果有两个以上具有包含关系的作用域,外层作用域中的标识符在内层作用域中没有同名标识符则它在内层作用域中也是可见的,但是如果在内层作用域中存在同名标识符则外层的标识符被屏蔽,这也叫做同名覆盖。派生类在继承时,基类的成员和派生类的新增成员都有类作用域,但是是两个具有包含关系的作用域,派生类作用域位于内层。如果在派生类中存在一个和基类某数据成员同名的数据成员,或者和基类某成员函数的名称和参数表都相同的成员函数,则派生类中的新成员就覆盖了基类成员,不管是在派生类内还是在派生类外部只能通过成员名访问到派生原创 2021-06-14 00:25:09 · 1074 阅读 · 0 评论 -
派生类的析构函数
派生类的析构函数派生类的析构函数也是在派生类对象释放的时候进行清理工作的。前面说过,派生类无法继承基类的析构函数,所以如果需要的话就要自己定义析构函数。派生类析构函数的定义方式与一般类的析构函数是一样的,也是没有返回类型,没有参数,所以比构造函数需要注意的东西少多了。派生类的析构函数一般只需要在其函数体中清理新增成员就可以了,对于继承的基类成员和派生类内嵌对象成员的清理,则一般由系统自动调用基类和对象成员的析构函数来完成。这个执行过程的顺序正好和派生类构造函数相反:1.执行析构函数语句清理派生类原创 2021-06-14 00:24:49 · 1540 阅读 · 0 评论 -
派生类的构造函数
派生类的构造函数基类的构造函数和析构函数派生类是不能继承的。如果派生类需要对新成员初始化或者进行特定的清理工作,就需要自己定义构造函数和析构函数了。从基类继承的成员的初始化仍可通过基类的构造函数来完成。我们使用派生类的对象以前需要对它的数据成员进行初始化赋值。派生类的数据成员包括从基类继承来的数据成员和派生类新增的数据成员,还可能包括其他类的对象作为其数据成员,包括其他类的对象时实际上还间接包括了这些对象的数据成员。那么我们对派生类初始化时就需要对基类的数据成员、派生类新增数据成员和内嵌的其他类对象的原创 2021-06-14 00:24:31 · 2990 阅读 · 1 评论 -
保护继承与私有继承
保护继承在保护继承方式中,基类的公有成员和保护成员被派生类继承后变成派生类的保护成员,而基类的私有成员在派生类中不能访问。因为基类的公有成员和保护成员在派生类中都成了保护成员,所以派生类的新增成员可以直接访问基类的公有成员和保护成员,而派生类的对象不能访问它们,类的对象也是处于类外的,不能访问类的保护成员。对基类的私有成员,派生类的新增成员函数和派生类对象都不能访问。通过上述保护继承的讲解,相信大家对类的保护成员的访问属性有更加深刻的理解了。假设A类是基类,B类是从A类继承的派生类,A类中有保护成员原创 2021-06-14 00:24:15 · 2656 阅读 · 0 评论 -
派生类对基类成员的访问控制之公有继承
公有继承前面说过,派生类从基类继承时有三个步骤,第一个步骤是吸收基类成员,吸收了基类中除构造函数和析构函数之外的所有数据成员和函数成员,第二个步骤就是修改基类成员,包括修改对基类成员的访问属性和覆盖基类成员,第三个步骤是添加新成员。第二个步骤中修改对基类成员的访问属性可以通过派生类的继承方式控制。类的成员有public(公有)、protected(保护)和private(私有)三种访问属性。类的继承方式也有public(公有继承)、protected(保护继承)和private(私有继承)三种原创 2021-06-14 00:23:56 · 1539 阅读 · 0 评论 -
派生类从基类继承的过程
派生类从基类继承的过程派生类从基类继承的过程可以分为三个步骤:吸收基类成员、修改基类成员和添加新成员。吸收基类成员就是代码复用的过程,修改基类成员和添加新成员实现的是对原有代码的扩展,而代码的复用和扩展是继承与派生的主要目的。基于上一讲中雇员的例子,写一个雇员类和其派生类-销售人员类。这里只给出部分声明,大家先了解下派生过程。class employee // 雇员类{public: employee(); // 构造函数 ~employee();原创 2021-06-14 00:23:36 · 1502 阅读 · 0 评论 -
继承与派生
继承与派生的概念在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。但是面向对象设计中代码的复用性和扩展性还没有体现出来。对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。下图说明了某个公司雇员的派生关系。位于最高层的雇员其抽象程原创 2021-06-14 00:23:15 · 154 阅读 · 0 评论 -
string类
StringC++从C语言继承了用字符数组存放字符串的方式,并且可以使用像strcpy等系统函数来处理字符串,但是这种方式大家应该也感觉不是很方便。数据与处理数据的函数分离开也不符合面向对象的设计思想。为此C++提供了处理字符串的string类,其中封装了字符串的一些属性和操作字符串的函数。string类位于C++标准库中。C++从C语言中继承了一些系统函数,另外又自己定义了一些模板和类,这些模板和类逻辑上分为六种类型:输入/输出类、容器类与ADT(抽象数据类型)、存储管理类、算法、错误处理和运行环境原创 2021-06-14 00:22:51 · 696 阅读 · 0 评论 -
用字符数组存放和处理字符串
字符串字符串是用双引号括起来的字符序列。比如,"China”。字符串常量会在字符序列末尾添加’\0’作为结尾标记。字符串在内存中按照串中字符的排列顺序存放,并在末尾会添加’\0’作为结尾标记。对于ASCII码来说每个字符占一个字节,而对Unicode码来说每个字符占两个字节。本教程只讲ASCII编码的字符和字符串。C++和C一样,基本数据类型的变量中没有字符串变量,那怎样处理字符串的存储和操作呢?C语言中用字符数组存放字符串,操作同一般数组类似。C++语言继承了这种方式。除此之外,标准C++库中还定原创 2021-06-14 00:22:22 · 8910 阅读 · 0 评论 -
动态内存分配和释放
动态内存分配动态内存分配最常见的就是用来分配一个某类型的数组。我们可以使用数组来处理大量的数据,但实际上很多情况下我们并不知道此数组会有多少个元素,所以在定义数组时到底定义多大的数组就要仔细考虑下了。比如,我们要对输入的若干个数进行分析,得出所有的正数存到一个数组里以备他用,这个正数数组应该定义多大呢?如果大了可能会造成内存的浪费,如果小了可能会出现数组越界的情况。这种情况下比较理想的是判断全部数据里有多少个正数就定义多大的数组,既不浪费内存也不会出现数组越界的问题,这就需要用到动态内存分配了。动态原创 2021-06-14 00:21:51 · 1331 阅读 · 0 评论 -
数组的存储与初始化、对象数组、数组作为函数参数
数组的存储数组在内存中是一组连续的内存单元,也就是说数组元素是连续存储的。数组名是数组所占内存的首地址。一维数组是按照下标的顺序存储的,而对多维数组就复杂些,以一定的约定顺序将多维数组存储在连续的内存单元中很重要。因为要对数组赋初值、函数间的数组数据传递等都需要先知道数组元素和存储位置的对应关系。一维数组的元素是按照下标从小到大的顺序存在内存中的,例如,int a[3]在内存中的存储顺序是:a[0] a[1] a[2]。对于二维数组元素,第一个下标叫做行标,第二个下标叫做列标。例如,数组int a[原创 2021-06-13 12:19:06 · 646 阅读 · 0 评论 -
数组的声明和使用
数组数组是一些相同类型的对象的集合,这些对象具有一定的顺序关系,在逻辑上是连续的,在内存中的存储上也是连续的。这些组成数组的对象叫做这个数组的元素。数组元素用数组名加带方括号的下标表示,比如,a[2]。数组元素具有相同的类型,可以是除void之外的任意一种类型。数组的声明数组跟结构体、类等一样也是自定义数据类型,所以使用以前也需要先进行声明。声明数组的时候要明确以下三点:1.确定数组名称;2.确定数组元素的类型;3.确定数组的维数及每维的大小。数组的声明形式为:数据类型 标识符[常量表达式原创 2021-06-13 12:18:41 · 5591 阅读 · 0 评论 -
对象指针
什么是对象指针每个变量都占有一定的内存空间,对象同样也需要占用内存空间。对象有数据成员和函数成员两种成员,但是实际上只有对象的数据成员会占用内存,函数成员则不会。我们可以通过对象名引用对象,也可以通过对象地址访问对象。对象指针就是存储对象地址的变量。声明对象指针的方式与一般的指针类似:类名 *对象指针名;使用对象名可以方便的访问对象的公有成员,同样使用对象指针也可以很容易的访问对象的公有成员。用对象指针访问对象的公有成员的形式为:对象指针名->公有成员名;让大家看一个简单的对象指针的例原创 2021-06-13 12:47:40 · 1765 阅读 · 0 评论 -
指针用作函数参数、指针型函数和函数指针
指针用作函数参数以前我们学过的函数参数要么是基本数据类型的变量,要么是类的对象,又或者是数组名,前几讲学到的指针同样可以用作函数参数。指针作函数形参时,我们调用此函数将实参值传递给形参后,实参和形参指针变量将指向相同的内存地址,那么在被调函数中对形参指针所指向的对象的改变会一样影响主调函数中实参指针指向的对象。指针用作函数参数用什么作用呢?其一,使形参指针和实参指针指向相同的内存地址,在被调函数中可以使用主调函数中的数据并可以改变主调函数中的数据,达到数据双向传递的效果。当然,前面讲过的引用也可以实原创 2021-06-13 12:36:32 · 2111 阅读 · 0 评论