![](https://img-blog.csdnimg.cn/ec3464f692684b9bb1a4d868e7c7864f.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++学习记录
文章平均质量分 74
C++
Klein&Macmillan
博主很懒,什么都不想告诉你
展开
-
C++每日面经
C++中的多态是面向对象编程的核心概念之一,它允许程序在运行时根据对象的实际类型来调用不同的函数实现,从而实现动态绑定。在C++中,多态性通过虚函数来实现。虚函数是在基类中声明的函数,在派生类中可以被重写。在使用虚函数的情况下,通过基类指针或引用调用函数时,将根据实际对象的类型来调用正确的函数实现,即在运行时动态绑定函数调用。例如,假设我们有一个基类Animal和两个派生类Dog和Cat,它们都实现了一个名为speak的虚函数。原创 2023-10-20 09:29:33 · 133 阅读 · 0 评论 -
Linux 线程同步、互斥锁、避免死锁、条件变量
对互斥锁加锁后,任何其他试图再次对其加锁的线程都会被阻塞,直到当前线程释放该互斥锁,解锁时所有阻塞线程都会变成可运行状态,但究竟哪个先运行,这一点是不确定的。进行销毁,尤其是对于动态分配的互斥锁,在释放内存前,调用pthread_mutex_destroy是必须的。函数等待条件满足,使用步骤如下,传递给函数的互斥锁对条件进行保护,在条件满足之前,调用线程将一直阻塞。进行销毁,同样的,如果是动态分配的条件变量,在释放内存前,该操作也是必须的。,如果互斥锁已经上锁,调用线程将阻塞到该互斥锁被释放。原创 2023-09-21 16:45:34 · 249 阅读 · 1 评论 -
面试:C++ 11 智能指针
std::weak_ptr 用来表达临时所有权的概念:当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用 std::weak_ptr 来跟踪该对象。需要获得临时所有权时,则将其转换为 std::shared_ptr,此时如果原来的 std::shared_ptr 被销毁,则该对象的生命期将被延长至这个临时的 std::shared_ptr 同样被销毁为止。所以,当shared_ptr离开作用域时,其内的资源释放了,这时候指向该shared_ptr的weak_ptr发生了什么?原创 2023-09-21 16:43:56 · 367 阅读 · 0 评论 -
为什么说学C++是浪费生命?【转载】
记住这个优先级顺序,99%的情况下我不会把生命浪费在解决performance的问题上,我宁愿去做appearance level的优化,我觉得更valuable,因为我的价值观是正常的,有些人的价值观已经被机器驯服了,他们是机器的Slave,我是机器的Master。在这种“性能病患”眼里,一切削弱性能的东西都是不好的东西,这种人把性能当作一切,好像只要优化一下性能,在10M频率下也能跑出1GHz的性能。编译器的目的是降低人的工作量,保障程序的安全性,保持程序的简单性。这就是所有未来语言的发展元素。翻译 2023-09-20 17:04:22 · 93 阅读 · 0 评论 -
【C++多线程】Lambda表达式
Lambda 表达式可以说是c++11引用的最重要的特性之一,虽然跟多线程关系不大,但是它在多线程的场景下使用很频繁,所以在多线程这个主题下介绍它更合适。Lambda 来源于函数式编程的概念,也是现代编程语言的一个特点。C++11 这次终于把 Lambda 加进来了,令人非常兴奋,因为Lambda表达式能够大大简化代码复杂度(语法糖:利于理解具体的功能),避免实现调用对象。声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护性。原创 2023-09-20 16:53:22 · 277 阅读 · 0 评论 -
实现高并发内存池(C++)
所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好,这样使用时就会变得非常快捷,大大提高程序运行效率。在计算机中,有很多使用“池”这种技术的地方,除了内存池,还有连接池、线程池、对象池等。以服务器上的线程池为例,它的主要思想是:先启动若干数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态。原创 2023-09-20 16:51:32 · 528 阅读 · 0 评论 -
如何正确地实现移动构造函数?
自己实现一个pair,名为my_pair,分别写了两个构造函数(原为复制/移动构造函数,错)。通过两个变量,调用的是move版本的构造函数,但是变量是左值,不应该是const引用版本的构造函数吗?翻译 2023-09-15 09:18:20 · 41 阅读 · 0 评论 -
拷贝构造函数vs移动构造函数
首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=100;int b=a;而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。原创 2023-09-15 09:05:41 · 67 阅读 · 0 评论 -
C++的移动构造和移动赋值运算符
右值通常是编译器生成的用于表达式计算的临时变量或常量。目前来说,我们还不能安全地使用引用变量来绑定右值。从编译原理上讲,右值是只存在于表达式计算时的未命名值。x+(y*z);对于上面的表达式,C++编译器会生成一个临时变量(右值)来存储y*z的结果,然后将其加上x。理论上,这个生成的临时变量(右值)会在整个表达式处理完成后被抛弃。现在有了新的名字,叫做左值引用。现在,右值引用在C++中无处不在,并深刻影响着变量的生命周期。想要理解这一影响,就需要了解C++的移动语义(move semantics)原创 2023-09-15 09:03:26 · 159 阅读 · 0 评论 -
谈谈程序链接及分段那些事
可以将符号看作是链接中的粘合剂,整个链接过程基于符号才可以正确完成,符号有很多类型,主要有局部符号和外部符号,局部符号只在编译单元内部可见,对于链接过程没有作用,在目标文件中引用的全局符号,却没有在本目标文件中被定义的叫做外部符号,以及定义在本目标文件中的可以被其它目标文件引用的全局符号,在链接过程中发挥重要作用。.bss段占据的大小存放在ELF文件格式中的段表(Section Table)中,段表存放了各个段的各种信息,比如段的名字、段的类型、段在elf文件中的偏移、段的大小等信息。翻译 2023-09-13 09:40:50 · 136 阅读 · 0 评论 -
C++零碎记录(十四)
① 在多态中,通常父类中虚函数的实现时毫无意义的,主要都是调用子类重写的内容。① 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码。⑦ 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象。② 解决方式:将父类中的析构函数改为虚析构或者纯虚析构。⑧ 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构。③ 当类中有了纯虚函数,这个类也称为抽象类。原创 2023-09-13 09:33:33 · 249 阅读 · 0 评论 -
C++零碎记录(十三)
① 多态是C++面向对象三大特性之一。1. 静态多态:函数重载和运算符重载属于静态多态,复用函数名。2. 动态多态:派生类和虚函数实现运行时多态。1. 静态多态的函数地址早绑定,编译阶段确定函数地址。2. 动态多态的函数地址晚绑定,运行阶段确定函数地址。1. 有继承关系2. 子类重写父类中的虚函数1. 父类指针或引用指向子类对象⑤ 重写:函数返回值类型、函数名、参数列表都完全一致称为重写。原创 2023-09-13 09:31:00 · 258 阅读 · 0 评论 -
理解类和对象
(这个概念确实不知可以百度下,很easy),比如我们想加工一个齿轮,这个模具是标准件,直接和工厂的师傅说一声就可以加工,但对于我们特殊的工件,如果想成批生产的时候,最好是开模做一个这个特殊工件的模具,然后用这个模具就可以成批的加工一个个的工件。对于初学C++的朋友一看到类class的时候,可能都会想:这玩意儿和C的结构体有什么区别么?于是C++弥补了这个缺憾,并起了个名字叫做类,而用类定义的“变量”也不叫做变量了,而叫做对象。回到C++这个问题里,类就好比这个模具,而对象就好比一个个的工件。翻译 2023-09-12 08:45:01 · 33 阅读 · 0 评论 -
C++零碎记录(十二)
1. 两个派生类继承同一个基类2. 又有某个类同时继承两个派生类3. 这种继承被称为菱形继承② 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据是,就会产生二义性。③ 草泥马继承自动物的数据继承了两份,其实我们应当清楚,这份数据我们只需要一份就可以。④ 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义。⑤ 利用虚继承可以解决菱形继承问题。原创 2023-09-12 08:43:42 · 136 阅读 · 0 评论 -
C++零碎记录(十一)
链接:https://www.zhihu.com/question/437657370/answer/1692846096。② 语法:class 子类:继承方式 父类1,继承方式 父类2,.....② 加上static关键字后,成员发生变化,成员变成静态成员。③ 多继承可能会引发父类中有同名成员出现,需要加作用域区分。④ C++实际开发中不建议用多继承。① C++运行一个类继承多个类。原创 2023-09-12 08:41:26 · 111 阅读 · 0 评论 -
拷贝构造函数
如果没有 const 限制,就不能将 const 对象传递给形参,因为 const 类型不能转换为非 const 类型,这就意味着,不能使用 const 对象来初始化当前对象了。对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。如果拷贝构造函数的参数不是当前类的引用,而是当前类的对象,那么在调用拷贝构造函数时,会将另外一个对象直接传递给形参,这本身就是一次拷贝,会再次调用拷贝构造函数,然后又将一个对象直接传递给了形参,将继续调用拷贝构造函数……翻译 2023-09-11 09:14:58 · 27 阅读 · 0 评论 -
C++零碎记录(十)
④ 输入:cl(空格)/d1 reportSingleClassLayout查看的类名 "文件名",可以查看类所占内存空间大小。③ 当子类与父类拥有同名的成员函数,子类会隐藏父类中所有同名成员函数(有参、无参),加作用域才可以访问到父类中同名函数。① 继承中,先调用父类构造函数,再调用子类构造函数,析构顺序与构造顺序相反,先调用子类析构函数,再调用父类析构函数。③ "输入跳转盘符,例如,C:"->"输入项目所在地的地址"->"输入dir(查询项目中文件信息)"① 子类对象可以直接访问到子类中同名成员。原创 2023-09-11 09:13:12 · 671 阅读 · 0 评论 -
C++零碎记录(九)
链接:https://www.zhihu.com/question/437657370/answer/1692846096。② 定义类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候,就可以考虑利用继承技术,减少重复代码。③ 不同的继承方式,父类中的变量被继承后,权限相应的得到了改变,如下图所示。① 继承的语法:class 子类:继承方式 父类。① 继承是面向对象的三大特性之一。原创 2023-09-11 09:12:07 · 105 阅读 · 0 评论 -
C++零碎记录(八)
① 运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。② 对于内置的数据类型的表达式的运算符是不可能改变的。原创 2023-09-07 11:00:16 · 111 阅读 · 0 评论 -
C++零碎记录(七)
① 生活中你的家有客厅(Public),有你的卧室(Private),客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的好闺蜜进去。② 在程序里,有些私有属性,也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。③ 友元的目的就是让一个函数或者类访问另一个类中私有成员。④ 友元的关键字为 friend。1. 全局函数做友元。2. 类做友元。3. 成员函数做友元。//建筑物类。原创 2023-09-07 10:58:38 · 138 阅读 · 0 评论 -
C++ 后端开发规划学习路线
按照上面推荐的内容来学习的话,要学习得深入一点的话1年的时间肯定需要的,甚至2年也不足为其。当然对于非科班的学生来说,大部分都没有充足的时间的,这时候建议尽量把C++基础、计算机网络、操作系统、网络编程、数据结构与算法这五个部分的内容学得很扎实,大概6个月的时间。翻译 2023-09-06 08:41:08 · 84 阅读 · 2 评论 -
C++零碎记录(六)
① 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会公用一块代码。② C++通过提供特殊的对象指针,this指针指向被调用的成员函数所属的对象。① C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。③ this指针是隐含每一个非静态成员函数内的一种指针。② 如果用到this指针,需要加以判断保证代码的健壮性。④ this指针不需要定义,直接使用即可。原创 2023-09-06 08:35:50 · 125 阅读 · 0 评论 -
C++零碎记录(五)
链接:https://www.zhihu.com/question/437657370/answer/1692846096。① 在C++中,类内对的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。① 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。原创 2023-09-06 08:34:24 · 762 阅读 · 0 评论 -
C++拷贝构造函数(复制构造函数)详解篇
对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。如果拷贝构造函数的参数不是当前类的引用,而是当前类的对象,那么在调用拷贝构造函数时,会将另外一个对象直接传递给形参,这本身就是一次拷贝,会再次调用拷贝构造函数,然后又将一个对象直接传递给了形参,将继续调用拷贝构造函数……从本质上讲,对象也是一份数据,因为它会占用内存。拷贝构造函数的目的是用其它对象的数据来初始化当前对象,并没有期望更改其它对象的数据,添加 const 限制后,这个含义更加明确了。翻译 2023-09-04 13:41:51 · 148 阅读 · 0 评论 -
C++零碎记录(四)
链接:https://www.zhihu.com/question/437657370/answer/1692846096。④ 深拷贝,如下图所示,在堆区自己创建一份内存,可以避免堆区的内存重复释放。② 语法:构造函数(): 属性1(值1),属性2(值2),...,()② C++类中的成员可以是另一个类的对象,称该成员为对象成员。③ 浅拷贝,如下图所示,带来的问题就是堆区的内存重复释放。② 深拷贝:在堆区重新申请空间,进行拷贝操作。① C++类中的属性、方法称为成员。① 浅拷贝:简单的赋值拷贝操作。原创 2023-09-04 13:37:48 · 139 阅读 · 0 评论 -
C++零碎记录(三)
作者:小王同学在积累链接:https://www.zhihu.com/question/437657370/answer/1692846096来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。原创 2023-09-04 13:36:23 · 120 阅读 · 0 评论 -
C++类和对象
这个模具是标准件,直接和工厂的师傅说一声就可以加工,但对于我们特殊的工件,如果想成批生产的时候,最好是开模做一个这个特殊工件的模具,然后用这个模具就可以成批的加工一个个的工件。对于初学C++的朋友一看到类class的时候,可能都会想:这玩意儿和C的结构体有什么区别么?这个问题问的好啊,我就来回答下这个问题进而推动题主的理解。于是C++弥补了这个缺憾,并起了个名字叫做类,而用类定义的“变量”也不叫做变量了,而叫做对象。回到C++这个问题里,类就好比这个模具,而对象就好比一个个的工件。翻译 2023-09-03 13:24:15 · 35 阅读 · 0 评论 -
C++零碎记录(二)
⑤ 对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。链接:https://www.zhihu.com/question/437657370/answer/1692846096。④ C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。③ 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。① 对象的初始化和清理是两个非常重要的安全问题。作者:小王同学在积累。原创 2023-09-03 13:21:42 · 855 阅读 · 0 评论 -
C++零碎记录(一)
链接:https://www.zhihu.com/question/437657370/answer/1692846096。① 在C++中struct和class唯一的区别就在于默认的访问权限不同。① 类在设计时,可以把属性和行为放在不同的权限下,加以控制。① 优点1:将所有成员属性设置为私有,可以自己控制读写权限。② C++认为万事万物皆为对象,对象上有其属性和行为。① C++面向对象的三大特性为:封装、继承、多态。② 优点2:可以通过写权限,检测数据的有效性。作者:小王同学在积累。原创 2023-09-03 13:20:20 · 101 阅读 · 0 评论 -
C++内存管理详解
class Testpublic:Test() //构造函数:_a(0)cout翻译 2023-08-28 19:19:35 · 40 阅读 · 0 评论 -
关于C++内存管理记录
否则在之后的开发者会误以为是个正常的指针,就有可能再通过指针去访问一些操作,但是在这时该指针已经无用,指向的内存也不知此时被如何使用,这时若出现意外将会造成无法预估的后果,甚至导致系统崩溃,在 malloc 的使用中更需要需要。释放后使用,产生悬空指针。在函数中首先使用 val 值接收 freep 的值,将 val 乘 2,之后释放 free,重新赋值给 val,最后使用 val 再次乘 2,此时造成的结果出现了极大的改变,而且最恐怖的是该错误很难发现,隐蔽性很强,但是造成的后顾难以承受。原创 2023-08-28 19:08:48 · 31 阅读 · 0 评论 -
详解深入 C++ 内存管理记录
这个问题的本质是,我们在有限的空间内存储了一些快速查询的结构,但是我们无法存储所有的数据,所以当查询未命中时,就需要花更大的代价,而所谓置换,也就是我们的快速查询结构是在不断更新的,会随着我们的操作,使得一部分数据被装在到快速查询结构中,又有另一部分数据被卸载,相当于完成了数据的置换。一般而言,栈的空间小于堆的空间。ue4的内存管理主要是通过FMalloc类型的GMalloc这一结构来完成特定的需求,这是一个虚基类,它定义了malloc,realloc,free等一系列常用的内存管理操作。原创 2023-08-28 19:05:09 · 476 阅读 · 1 评论 -
记录C++内存管理(malloc和free中的cookie)
在调用new来分配数组时(new Deno[n]),如果类的析构函数是重要的,则会多申请4个字节或者8个字节来存储申请对象的数量,以供编译器知悉在调用delete[] p的时候需要调用几次析构函数之后再释放内存,避免内存泄漏,并且此时必须调用delete [],否则会出错。如果类的析构函数是不重要的,则不会申请额外的内存存储申请对象的数量,此时调用几次析构函数并不会有什么影响,因此此时也可以调用delete直接释放内存,不会出错。翻译 2023-08-24 15:41:58 · 107 阅读 · 0 评论 -
C++中new / delete ,malloc / free 区别记录
所以 new 是 new ⼀个类型,⽽ malloc 则是malloc ⼀个字节⻓度的空间。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。,不能够把执⾏的构造函数和析构函数的任务强加于 malloc/free,所以有了 new/delete 操作符。对象在创建的同时需要⾃动执⾏构造函数,对象在消亡以前要⾃动执⾏析构函数。以上也可以看出 new 和 malloc 的区别,new 得到的是经过。,delete ⼀个类型,free ⼀个字节⻓度的空间。翻译 2023-08-24 15:02:27 · 37 阅读 · 0 评论 -
C++的循环结构练习题记录
【代码】C++的循环结构练习题记录。翻译 2023-08-21 17:24:30 · 512 阅读 · 0 评论 -
C++的分支结构练习题记录【代码】
【代码】C++的分支结构练习题记录【代码】原创 2023-08-21 17:19:34 · 175 阅读 · 0 评论 -
C++的顺序结构练习题记录【代码】
【代码】C++的顺序结构练习题记录。原创 2023-08-21 17:06:06 · 161 阅读 · 0 评论 -
C++的可变参数模板
可变参数模板是 C++ 中非常有用的语言特性,它支持在编译时处理任意数量和类型的参数,从而实现更加通用和灵活的编程方式,增加了模板的灵活性和扩展性,但是可读性差、编译时间长,需要开发者根据具体情况进行权衡和选择。原创 2023-08-20 13:18:28 · 105 阅读 · 1 评论 -
C++的多态记录
总之,多态是面向对象编程的一个重要特性,通过多态可以增强代码的灵活性和可扩展性、提高代码的可复用性、简化代码的设计和维护以及改善代码的可读性和可理解性,包括静态多态和动态多态,两者互有优劣,适用于不同场景。静态多态动态多态编译时确定是否运行时开销较小,不需要虚函数的开销较大,需要查找虚函数表并调用虚函数的开销扩展性不易扩展,需要编译时确定函数实现代码易于扩展,可以在运行时动态添加新的类及其成员函数实现安全性更容易确保类型安全,编译时会检查参数类型是否匹配。原创 2023-08-20 13:16:43 · 33 阅读 · 2 评论 -
C++的类型擦除记录
C++ 类型擦除是指通过一些技术手段去掉(或“擦除”)C++ 中的类型信息,使得一个数据结构或算法能够处理不同类型的对象。类型擦除可以使得泛型编程变得更加灵活和通用,可以将相同的算法应用于不同类型的数据上,而无需对算法进行修改。在C++中,有两种主要的类型擦除方法,分别是基于模板类的类型擦除和基于虚函数的类型擦除。基于模板类的类型擦除:这种类型擦除方法主要是通过定义通用的模板类来实现。标准模板库中的容器类(如vector、list等)就是基于模板类的类型擦除实现的。原创 2023-08-18 13:05:08 · 67 阅读 · 1 评论