C++
文章平均质量分 84
是星星鸭
希望对你有所帮助。
展开
-
C++11基于范围的for循环&vector容器扩容详解&迭代器失效
首先vector容器原来的大小capacity()=1,1是无法满足两个元素的("www","eee"),所以需要扩充,但是。没有拷贝构造,因为我们使用的是vector容器中的对象本身,不会发生拷贝,既然没拷贝就不会有拷贝构造的日志,a也不会析构它;然后因为我们是将"www"的对象拷贝给a,那么a使用完这个对象肯定要析构啊,所以调用了析构函数,1、申请一个新的地址,这个地址可以存放下"www",和"eee"的对象,这一步没有日志;v中都是什么内容呢?"www"、"eee"、"rrr"的对象,一共三个对象;原创 2023-01-07 12:03:26 · 2556 阅读 · 2 评论 -
C++ 函数模板、具体化模板的分文件书写
1、具体化函数模板的声明要放到普通函数模板的下方2、函数模板只是函数的描述符,没有实体,应该把整个函数模板放到头文件中;具体化函数模板有实体,编译过程和普通函数一样,所以应该把声明放到头文件中,实现放到源文件中原创 2022-12-28 18:57:22 · 680 阅读 · 0 评论 -
C++ 当基类为抽象类时如何析构派生类
举个栗子:假设基类A有成员a和b,派生类B新增了成员c,那么基类的指针范围指向的就是8个字节的地址,但是成员c的地址是8-12字节;但是我们学过多态,我们知道,如果将函数前面加上virtual关键字,那么他的地址就会被写入虚表,基类指针可以通过指向子类对象来调用子类虚表中的重写函数;因为派生类的对象析构了之后会调用基类的析构,但是你基类的析构函数没写实现他怎么调用?:即动态绑定,在运行时才去确定对象类型和正确选择需要调用的函数,一般用于解决基类指针或引用派生类对象调用类中重写的方法(函数)时出现的问题。原创 2022-12-27 18:37:15 · 492 阅读 · 0 评论 -
C++ 函数重载的细节
1、使用重载函数时,如果数据类型不匹配,C++尝试使用类型转换与形参进行匹配,如果转换后有多个函数能匹配上,编译器将报错;2、引用可以作为函数重载的条件,但是,调用重载函数的时候,如果实参是变量,编译器将形参类型的本身和类型引用视为同意特征;3、如果重载函数有默认参数,调用函数时,可能导致匹配失败;4、const不能作为函数重载的特征;5、返回值类型不同不能作为函数重载的特征;原创 2022-12-08 17:22:51 · 442 阅读 · 0 评论 -
C++ 各种形参的使用场景
如果实参是内置数据类型,则使用指针。如果实参是类,则使用const引用,传递类的标准方式是引用传递(类设计的语义经常要求使用引用);如果实参是数组,则使用const指针,因为这是唯一的选择(没有数组建立引用的说法);注意如果需要在函数中修改实参的话都是不能加const约束的,所以上面四点不能加;如果实参是较大的结构,则使用const指针或const引用;或小型结构体,则按值传递,因为也不用担心拷贝花费太多时间;如果实参是结构体,则使用指针和引用;如果实参是数组,则只能使用指针;如果是惨是类,则使用引用;原创 2022-12-08 15:25:13 · 229 阅读 · 0 评论 -
C++对const引用的特殊处理、为什么函数形参的引用建议加上const?只是为了防止值被修改吗?
我们知道普通变量、指针、函数形参,加上const修饰表示不可改变,但是引用前面加上const就有特别之处了const形参不能被修改内容;这也是const引用的用途之一:防止实参被修改但是,const引用还有一个很特别的用途,下面为大家介绍原创 2022-12-07 23:55:52 · 2434 阅读 · 1 评论 -
str(n)cpy的注意事项以及memset的简单使用
目录strcpystrncpymemset我们先看strcpy函数:注意使用strcpy需要在第一行加上#define _CRT_SECURE_NO_WARNINGS一定要是第一行,其他地方不行;然后输出一下字符串: 没有问题,我们单个输出name数组的每个成员的ascii码值试一下:运行: 我们可以看到,因为我们并没有初始化,所以strcpy函数是帮我们把hello后的第六个元素置为0了,因为有\0才是字符串嘛; 如果我们的name只有五个元素,但是我们依旧赋值给他hello,那么还会不会补充\0原创 2022-12-06 16:21:35 · 725 阅读 · 0 评论 -
qsort()数组排序函数的回调函数怎么写?
C语言提供了给一维数组排序的库函数qsort(),他的声明如下:第一个参数:待排序的数组首地址第二个参数:数组元素个数第三个参数:数组单个元素占用字节数第四个参数:回调函数的函数指针,需要用户自己实现回调函数看完声明,我们先来看看如何使用这个函数,我们先定义一个数组:因为qsort函数的第四个参数是回调函数的函数指针,所以这里我们需要写一个回调函数,当然qsort对回调函数也是有要求的:1、如果函数的返回值原创 2022-12-05 22:07:31 · 276 阅读 · 0 评论 -
C++ std::nothrow
我们知道,当我们写程序时,栈区的内存是非常小的,如果是写那种大型的项目,不够用是很正常的,所以我们需要在堆区申请内存;但是如果在堆区申请了大量的内存,导致没有空间了,那么程序就会崩溃,很烦人;我们做程序,想要的并不是崩溃,因为程序一旦崩溃就代表什么都做不了;我们需要的是如果内存不足,程序不要崩溃掉,返回一个错误或者空地址就行了,我们根据返回值在来进行不同的操作;这就要用到std::nothrow了以我自己的电脑为例,先在栈区分配内存:先在栈区申请10 0000*4字节的内存,运行一下,程序正常,并没有崩溃加原创 2022-12-05 18:22:38 · 2929 阅读 · 2 评论 -
C++11新特性-原始字面量
当我们书写文件路径的时候,会发现,文件路径无法正确输出,如下:这是因为反斜杠本身就是转义的意思,如果想要输出反斜杠则需要两个反斜杠,如下: 当然这只是其中一种解决方法,还有一种就是使用C++11的原始字面量,如下: 输出了我们想要的结果;原始字面量的写法就是:R"(str)";当然原始字面量不止这一个用途,还有就是用于换行书写举个栗子: 在做项目开发的时候我们经常会遇到很长很长的字符串,就比如xml格式的字符串,里面存放着重要的信息,一般情况下这个字符串会很长,当然比我写的这个长的多;这个时候写在一行会显得原创 2022-12-03 21:57:52 · 889 阅读 · 0 评论 -
C++ bool类型变量cin输入true,输出结果却是false?是因为cin输入的true会被当成字符串,所以bool变量原值不变吗?
首先,大家可能看过其他文章,他们给出的观点是这样的:在C++中bool类型的变量初始值为false,所以如果你不初始化,那么对变量使用cin>>赋值true和false的时候,编译器会把true和false当成是字符串,因此bool变量的值不会变,还是原来的false,所以输出结果为0;但是呢,在这里我想说的是,上面这个观点只说对了一半C++中bool的全局变量如果不初始化,那么默认为false没毛病;编译器会把true和false当成字符串,也没毛病;但是bool变量如果赋值true和原创 2022-11-30 15:42:46 · 2830 阅读 · 3 评论 -
C++对象拷贝
首先看下面这张图:假设我们现在有一个对象数组,里边有三个对象,O1、O2和O3;但是随着业务逻辑的提升,这三个对象已经无法满足我们的使用了;那么我们肯定要再添加几个对象进去,但是我们又不想重新创建O1、O2、O3;那么怎么办呢?首先在C语言中,我们肯定是用一些拷贝函数之类的,通过赋值拷贝将一个对象的内容拷贝给另一个对象进行使用;这个过程就叫对象拷贝;当然C++中也有类似拷贝对象内容的方式,并且C++的编译器支持我们用更简单的方式进行内存复制,接下来就让我们看看C++中如何实现对象拷贝;原创 2022-11-18 22:13:14 · 2735 阅读 · 0 评论 -
【C++】模板template
1、我们使用模板的目的就是为了提高代码的复用性,减少重复代码的编写; 2、函数模板的底层并不是只有一个函数完成的,它是根据你传入参数的类型,给你分配一个适用你传入类型的函数;如果你连续传入n个类型,他就会给你分配n个函数;原创 2022-11-15 22:43:36 · 1974 阅读 · 1 评论 -
【C++】运算符重载
谁说++就一定要加了?谁说++就一定要加1?这也就是为什么计算机中1+1不一定等于2,因为这个操作符是别人自己按照他的思维来重载的,我们当然也可以按照自己的思维来写,++我们写个减1,但是没必要,一般情况下我们还是遵守计算机的算法来写,不要乱写,没什么好处;原创 2022-11-15 18:42:42 · 1459 阅读 · 0 评论 -
【汇编 C++】多态底层---虚表、__vfptr指针
我们可以确认了,如果类中具有virtual修饰的虚函数,无论有多少个虚函数,类的对象在底层中只有一个虚表,因为我们传入的是虚表的首地址,只占用四个字节,并且这个虚表首地址是类对象的第一个成员!原创 2022-11-14 21:46:34 · 860 阅读 · 0 评论 -
C++多态_virtual
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。我们知道,面向对象编程思想就是为了节省代码的重复编写,那么我会围绕节省代码编写的例子去讲多态,可能例子会有些莫名其妙,但是知道这个道理就行了。class Person{ // 基类Person:成员有a、bpublic:int a;int b;}void print() // 基类添加一个打印成员的函数,会继承到派生类。原创 2022-11-11 21:58:46 · 1171 阅读 · 0 评论 -
【Linux Socket C++】为什么IO复用需要用到非阻塞IO?EAGAIN的简单介绍与应用
因为我们死循环只是为了接收缓冲区中的连接,一旦accept在缓冲区找不到可用的连接了,那么accept会将errno设置为EAGAIN,这个时候我们只需要判断errno==EAGAIN就说明了,accept已经将缓冲区中的连接读取完,所以可以直接break了。达到缓冲区的数据有可能被别人抢走,比如多个进程accept同一个socket时引发的惊群现象,只有一个客户端连接到来,但是所有的监听程序都会被唤醒,最终只能有一个进程可以accept到这个请求,如果采用阻塞的IO,其他进程的accept就会产生阻塞。原创 2022-11-10 23:36:04 · 1152 阅读 · 0 评论 -
C++继承时常见问题
目录前言子类默认调用父类无参构造 观点一 观点二子类调用父类有参构造子类与父类的构造顺序总结结语 关于C++继承的基础,请看:《C++继承浅谈》或自行百度 如果父类不写构造函数,那么子类构造对象的时候不传参/传参调用的都是子类自己的无参/有参构造。 验证代码如下: 运行查看结果: 断点、编译、调试、ALT+8转到反汇编: F10步过,不会进入函数内部,F11跟进这两个函数的内部:原创 2022-10-18 11:50:13 · 762 阅读 · 0 评论 -
【汇编 C++】C++引用详解、引用与指针的区别
引用是C++的一种新类型,引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。那么怎么证明ref是a的别名呢?我们知道,别名和本体指的是同一个东西,所以操作ref应该就是操作a,如下:运行,如果ref和a的值一直都是一样的,就代表ref是a的别名,和a是同一个东西如下:观点证明成功!先来对比基础变量的定义对比,引用和指针的区别。原创 2022-10-16 01:51:59 · 1533 阅读 · 0 评论 -
【汇编 C++】在堆中创建对象
栈区也就是之前汇编调用函数时提升堆栈的'堆栈',只有在函数调用时才会有堆栈,函数调用结束后该堆栈虽然在,但已经被使用并且不属于这个函数。所以说栈(堆栈)中的数据只有函数调用时存在,函数调用完成后将不存在。原创 2022-10-11 01:10:38 · 2299 阅读 · 0 评论 -
【汇编 C++】C++继承浅谈
继承就是数据的复制struct Master // 父类(基类){int a;int b;};struct Slave:Master // 子类(派生类){int c;int d;};int main(){// 此处下断点查看x的大小(子类的大小)return 0;原创 2022-10-10 20:47:33 · 507 阅读 · 0 评论 -
【汇编 C++】类的构造与析构
本文章将会可能会涉及到汇编的知识,不过没有关系,我会讲的尽量通俗易懂;另外本篇文章开始前,建议了解下什么是函数重载,这个概念很简单的--有相同的函数名,但参数列表不相同的函数,就是函数重载;和类具有相同名称,并且没有返回值类型的函数,就是类的构造函数{Test() // 和类具有相同的名、并且没有返回值{}};}类的构造函数名前加上'~'这个符号,就是类的析构函数{Test(){printf("你调用了一次类的构造函数\n");}原创 2022-10-09 21:32:52 · 1658 阅读 · 0 评论 -
【汇编 C++】C++this指针、this指针长什么样?
this指针是“C++封装后的结构体或类中成员函数”的一个默认参数,用于存放当前结构体变量(类的对象)的首地址,它是一个隐藏的参数。概念听起来很模糊,不急,代码测试之后就能明白。{int a;int b;int c;};// 结构体的外部定义函数{}int main(){// 此处下断点,观察反汇编return 0;}我们先把函数定义在结构体的外部,现在的结构体就是个简单的结构体,没有进行封装,函数也是个简单的函数,没有this指针。原创 2022-10-08 16:39:28 · 792 阅读 · 0 评论 -
【汇编 C】循环语句goto、while、dowhile、for
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。例子:(这里就拿汇编举例吧)首先401210位置的jmp会跳到401230的位置,然后将1,2,3,4分别放到对应的寄存器中之后再一次使用jmp跳到401210的位置。原创 2022-09-28 00:13:38 · 3226 阅读 · 2 评论 -
【Linux C++】条件变量wait函数
该函数有三个动作: 1、把互斥锁解锁 2、阻塞、等待条件信号(被唤醒) 3、条件被触发+给互斥锁加锁(这两个操作是原子性的)原创 2022-09-18 16:06:00 · 3164 阅读 · 2 评论 -
【Linux C++】一篇文章搞懂线程同步的五种方式(锁、条件变量、信号量)
即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多。听完上面的叙述,是不是很匹配互斥类型锁的特色。原创 2022-09-16 16:36:16 · 1255 阅读 · 2 评论 -
【Linux C++】线程安全-原子性、可见性、有序性
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。原创 2022-09-10 21:57:49 · 1937 阅读 · 6 评论 -
Win11_vs2010镜像安装方法
由于我个人使用使用的是win11系统,没办法使用vc++6,所以就有了本章的vs2010安装教程,非常简单。原创 2022-09-08 21:09:11 · 5041 阅读 · 6 评论