C++学习
文章平均质量分 89
C++学习笔记
lge101058
这个作者很懒,什么都没留下…
展开
-
【C++】学习笔记——C++的类型转换
C语言的强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,我们应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。相当于C语言的隐式类型转换。在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,原创 2024-08-02 15:57:53 · 557 阅读 · 0 评论 -
【C++】学习笔记——特殊类的设计
由于饿汉模式在程序进入主函数前就需要把对象创建出来,如果单例模式太多,或者这个对象太大,则会拖慢程序的启动,对性能要求较高。C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。我们需要判断是否是第一次使用实例,如果是第一次使用实例才创建对象,否则返回原本就存在的对象。原创 2024-08-01 22:27:32 · 611 阅读 · 0 评论 -
【C++】学习笔记——智能指针
来释放的,与 delete 匹配的是 new,如果不是new出来的对象如何通过智能指针管理呢?并不是全部替换,节点本身都还是shread_ptr,但是节点的前驱指针和后继指针改成了weak_ptr。unique_ptr虽然解决了auto_ptr的问题,但是限制太大了,如果非要多个指针指向同一块资源的话就没办法,于是C++又提供了新的智能指针——shared_ptr。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。如内存泄漏检测工具。原创 2024-08-01 22:27:09 · 848 阅读 · 0 评论 -
【C++】学习笔记——异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。原创 2024-07-31 20:26:09 · 625 阅读 · 0 评论 -
【C++】学习笔记——C++11_4
C++中可调用的对象有很多种,比如函数,函数指针,仿函数,类的静态成员函数,类的非静态成员函数以及lambda表达式等。人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。原创 2024-07-31 10:17:47 · 722 阅读 · 0 评论 -
【C++】学习笔记——C++11_3
默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝(浅拷贝),自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。push系列函数在对于深拷贝的对象进行插入时,会调用一次构造+一次移动构造,但是emplace系列仅仅只会调用一个构造函数,它是将参数一个一个传入对象的,省去了移动构造的消耗。模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值。这种情况该怎么办呢?原创 2024-07-31 10:17:21 · 953 阅读 · 0 评论 -
【C++】学习笔记——C++11_2
当我们往list中插入时,由于每插入一个数据,list就需要构造一个节点,数据赋值的时候就要产生拷贝,但是我们要是写一个右值引用+移动语义的构造函数,就可以将资源直接与右值交换,避免了拷贝。右值引用也只是解决了深拷贝的问题,深拷贝对象传引用返回只需要移动资源即可。浅拷贝的问题并没有解决,但是浅拷贝的代价比较小,也不需要解决。这里没有调用深拷贝的拷贝构造,而是调用了移动构造,移动构造中没有新开空间,拷贝数据,所以效率提高了。(如出了函数作用域,返回的对象还在,就可以使用左值引用减少拷贝)。原创 2024-07-30 13:48:03 · 237 阅读 · 0 评论 -
【C++】学习笔记——C++11_1
一般在模板情况下,我们不知道接下来要定义的变量是什么类型,我们就可以借助这个关键字,他会推导类型,然后根据这个类型来定义变量。在C++11中,扩大了用大括号括起的初始化列表的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号。传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做。语法上:引用都是别名,不开空间,左值引用就是给左值取别名,右值引用就是给右值取别名。左值引用就是给左值的引用,给左值取别名。原创 2024-07-30 13:47:38 · 1051 阅读 · 0 评论 -
【C++】学习笔记——哈希_2
/ 哈希表, Hash是仿函数(哈希函数)public:// 构造函数_n = 0;// 析构函数// 遍历每个桶i++)// 遍历每个桶的每个数据节点delete cur;cur = next;private:// 哈希表每个位置都是一个链表(桶)// 数据个数size_t _n;原创 2024-07-23 17:24:01 · 286 阅读 · 0 评论 -
【C++】学习笔记——哈希_1
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。unordered容器底层实现采用的是哈希表的存储结构,并不会对数据排序。例如:数据集合{1,7,6,4,5,9};原创 2024-07-23 13:09:33 · 1100 阅读 · 0 评论 -
【C++】学习笔记——红黑树
红黑树节点的定义与AVL树及其相似,唯二的区别就是,红黑树没有平衡因子,红黑树有颜色值。// 枚举颜色enum ColorRED,BLACK// 颜色Color _col;,_kv(kv),_col(RED){}为什么我们构造函数将颜色值默认设置成红色?因为我们创建的节点有两个孩子,两个孩子都是空节点,都是黑色的,如果创建的节点不把原本的这个位置的黑色空节点给替换掉,那么这条路径就会比其他路径多出一个黑色,违反了红黑树的性质。因此,新创建的节点一定是红色的。原创 2024-07-21 15:32:40 · 775 阅读 · 0 评论 -
【C++】学习笔记——AVL树
/ AVLTree 节点// 指向左孩子的指针// 指向右孩子的指针// 指向父节点的指针// 平衡因子int _bf;// 存储的Key-Value结构数据// 节点的构造函数,_bf(0),_kv(kv){}原创 2024-07-19 13:44:28 · 797 阅读 · 0 评论 -
【C++】学习笔记——map和set
set文档map文档map底层其实是pair。而pair其实是一个类模板。成员变量有两个,一个first,一个second,在map里,first一般存的是key,second存的是value。原创 2024-05-23 22:08:21 · 813 阅读 · 0 评论 -
【C++】学习笔记——二叉搜索树
中序遍历需要借助当前节点,所以需要一个形参,但是根节点又是属于类的私有成员变量,在外部无法访问,所以我们需要嵌套一层函数来访问。二叉搜索树,树是一种结构,需要用类来定义,节点也是一种结构,需要另一个类来定义。插入也是比较简单的,当插入的关键字已存在时,现阶段没有多大用处,我们就插入已有的关键字,当关键字不存在时,也是一种查找,当。唯一需要注意的是,需要使用一个指针指向插入位置的父节点,否则无法进行节点之间的连接。这种情况最为复杂,也最难。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。原创 2024-05-20 19:02:27 · 901 阅读 · 0 评论 -
【C++】学习笔记——多态_2
普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。我们应该这样看,我们将Derive的对象分成三份,Base1部分、Base2部分和自己的部分。动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态。我们知道虚函数表的地址,但是不知道结束条件,无法遍历指针数组。从上面的结果来看,很明显,虚函数表存在于常量区。原创 2024-05-17 21:34:34 · 670 阅读 · 0 评论 -
【C++】学习笔记——多态_1
public:cout << "买票-全价" << endl;public:cout << "买票-半价" << endl;// 多态int main()Person ps;Student st;Func(ps);// 子类可以赋值给父类---切片Func(st);return 0;在继承中想要构成多态是有条件的。1. 必须通过父类的指针或者引用调用虚函数。2. 被调用的函数必须是 虚函数 ,且子类必须对父类的虚函数进行重写。原创 2024-05-15 22:29:40 · 997 阅读 · 0 评论 -
【C++】学习笔记——继承_2
这个方法可以统计整个体系一共产生了多少个对象。原创 2024-05-14 21:01:03 · 339 阅读 · 0 评论 -
【C++】学习笔记——继承_1
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或叫做子类),被拓展的类叫基类(或叫做父类)。比如说:我们想设计一个学生管理系统,涉及到的对象有学生和老师,分别封装成两个类,但是老师和学生都含有姓名、年龄、性别等等的信息,要是将这些变量都分别放到各个类里,就会有些冗余。而继承机制就是,设计一个类,这个类里有共有的成员变量或成员函数,派生出的子类继承这个父类,就能拥有父类的这些成员变量和成员函数,减少了冗余。原创 2024-05-13 20:53:06 · 907 阅读 · 0 评论 -
【C++】学习笔记——模板进阶
当声明和定义分离时,声明处有调用,所以知道模板实例化的类型,但是没有实现功能,定义处没有调用,可以实现功能但是不知道实例化的类型,所以定义处在编译时,并不会生成地址,导致链接时找不到地址从而产生链接错误。解决方法有两种:①模板定义的位置显式实例化。(这种方法不实用,不推荐使用)②。原创 2024-05-11 21:45:32 · 1180 阅读 · 0 评论 -
【C++】学习笔记——优先级队列
优先级队列其实也不属于队列,它跟stack和queue一样,都是容器适配器。优先级队列的默认适配容器是vector。要使用优先级队列的话,需要包含queue头文件。// 包含 queue 头文件int main()pq.push(3);pq.push(1);pq.push(4);pq.push(2);while (!pq.pop();return 0;我们插入的数据是3 1 4 2,打印出来的数据却是4 3 2 1。原创 2024-05-10 23:06:47 · 1132 阅读 · 0 评论 -
【C++】学习笔记——stack和queue
stack就是我们常说的栈,而queue就是队列。栈就是后进先出的数据结构,队列就是先进先出的数据结构。从严格意义上来讲,这里的栈和队列已经不属于容器了,而是属于容器适配器。什么是容器适配器呢,我们待会再说。原创 2024-05-09 20:25:07 · 1014 阅读 · 0 评论 -
【C++】学习笔记——list
是的,list就是带头双向循环链表。原创 2024-05-06 21:52:54 · 883 阅读 · 0 评论 -
【C++】学习笔记——vector_3
时,将内容也给析构了,所以后面生命周期结束时的析构就出现了多重析构的问题。但是,大家有没有想过,这里的迭代器传入的是临时变量,临时变量更新了后,实参并不会修改,所以在外面这个迭代器的值已经。就更不行了,不能修改的迭代器算什么迭代器?中第一次遇到了迭代器失效的问题,但是我们通过更新地址的问题解决了迭代器失效的问题。迭代器表示的位置,将会导致循环终止不了,所以引发了一系列问题。函数删除后会将后面的数据前往移动,删除后迭代器的位置是一个新的数据,然后。是的,类模板里面又加了一个函数模板,这样的作用是什么呢?原创 2024-05-05 18:58:51 · 1856 阅读 · 0 评论 -
【C++】学习笔记——vector_2
内置类型的默认值:int就是0,double就是0.0,指针类型就是nullptr 这样。这么看来,上面的第二个参数就能理解了吧。使用的是模板,不能锁死任意一个类型,所以不能冒然的 等于0 啊之类的,万一是个类不久出大问题了吗?,看是看懂了,但是,这不本末倒置了吗?祖师爷就是为了解决这种问题,他将内置类型给升级成了,有点厉害啊。没错,就是用 auto,自动匹配类型,创建出一个 vector< T >。上节我们以二维数组结束,这一节我们以二维数组开始。保持一致,需要理解。的值,当发生扩容时,原创 2024-05-04 18:03:50 · 711 阅读 · 0 评论 -
【C++】学习笔记——vector_1
学了string类后,学习其他容器就非常简单了。vector是表示可变大小数组的序列容器。就是高配版数组。用法就是。原创 2024-05-03 22:14:09 · 568 阅读 · 0 评论 -
【C++】学习笔记——string_5
我们知道,拷贝构造不能是浅拷贝,假如是浅拷贝,那么会导致两个指针指向同一块空间,一个修改另一个也会发生变化,多次析构的问题。我们发现,库里的swap整整调用了3次拷贝和1次析构,虽然能用,但是它非常搓,所以我们要实现一个对我们来说更加好用的。这里赋值重载的新式写法还能优化(行数),既然在函数内部要调用拷贝构造,为什么不在传参的时候直接调用拷贝构造呢?这样做其实就是赌有的对象不去修改内容,只要有这样的对象,那么就算是一种优化。,那么应该是 12 啊(32位下,64位是 24),为什么库里的。原创 2024-05-03 20:59:56 · 1205 阅读 · 0 评论 -
【C++】学习笔记——string_4
指向同一块空间,这就是浅拷贝导致的,这样的情况会使:操作其中一个,另一个也会改变,同一块空间会被析构两次,产生报错。有人可能会说哈,拷贝构造函数是默认成员函数,不写编译器也会自动生成,我们不需要写,但是真的不需要写吗?但是,我们要知道,下标访问支持可读可写,但是const对象不支持,所以刚刚那个函数不支持const对象,于是我们得重载一个针对于const对象的下标访问函数。对,我们应该是得到一个空串,空串末尾是携带。由于我们还没有实现流插入和流提取函数,所以我们无法直接输出我们的字符串,但是我们可以实现。原创 2024-05-01 21:43:46 · 1763 阅读 · 0 评论 -
【C++】学习笔记——string_3
构造函数不一定非要使用初始化列表,我们在有参构造函数里面若是使用初始化列表,由于三个对象都需要调用。就是拷贝,缺点是必须先创建好一个字符数组,字符数组还是形参,返回拷贝的个数,被下面的。当然,有其他类型转换成字符串类型,就有字符串类型转换成其他类型。很多,我们要返回最后一个后缀,该怎么办?接下来我们来实现构造函数,分为无参构造函数,和有参构造函数。上面的函数中,有些是不常用的,咱们只挑几个重要的进行讲解。类的时候,我们需要将其封装一下,包含在自己的命名空间下。再假设一个情景,有一个网址,将其。原创 2024-05-01 19:07:26 · 1035 阅读 · 0 评论 -
【C++】学习笔记——string_2
需要挪动数据,复杂度大,能不用就不用。这里函数太多,就不一一介绍了,多看看文档就会用了。函数不常用,返回这个容器能够存储的最大长度,跟编译器有关,输出结果不唯一。函数的作用就是手动分配空间,但是不一定刚刚好分派到你想要的大小。函数就是清理的意思,它会将容易里的数据都清除。小时,字符串后面会默认插入 ‘\0’,或者给定的值。一般来说,迭代器都是正向的遍历容器,虽然可以通过从。,我们来看一看VS环境下的C++扩容机制吧。函数返回容器的当前容量,即分配的空间,反向迭代器**,可以做到反向遍历容器。原创 2024-04-30 21:11:00 · 1153 阅读 · 0 评论 -
【C++】学习笔记——string_1
是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。原创 2024-04-29 21:13:48 · 774 阅读 · 0 评论 -
【C++】学习笔记——模板
new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请,在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。原创 2024-04-29 16:42:03 · 1097 阅读 · 0 评论 -
【C++】学习笔记——内存管理
我们在实现日期类的时候也实现了重载 operator> ,但是由于 this指针 位于形参的第一个位置,我们不得不将这个重载函数设成全局函数,但是全局函数又不能访问类的私有成员变量。我们是怎么解决这个问题的呢?是的,我们将这个函数的声明放在类内,然后在前面加上 friend 关键字,使其成为友元函数,友元函数就能够在类外访问类的私有成员变量了。友元函数突破了封装,提供了便利,但这一定是好的吗?类的封装是非常重要的,友元函数能不使用就不使用。友元不仅有友元函数,还有友元类。在上原创 2024-04-28 17:45:55 · 873 阅读 · 0 评论 -
【C++】学习笔记——类和对象_5
上一篇我们已经大致将日期类的重要功能都给实现了,这节将会对日期类进行完善,使其更加便捷好用。在C++中,内置类型是可以使用流插入( > ),我们能不能将流插入和流提取也给重载了呢?使我们的日期类也能使用流插入和流提取?当然可以啦,其实,流插入和流提取是 iostream 库里面的两个函数,类型分别是 ostream 和 istream。我们可以这样实现:嗯,看起来没有问题,跑一下试试。欸?怎么报错了?一看报错原因,哦,原来运算符重载原本是这样的 d1.operator原创 2024-04-27 22:19:13 · 1141 阅读 · 0 评论 -
【C++】学习笔记——类和对象_4
由于也是浅拷贝,所以涉及到堆上的空间开辟时,不能使用编译器自动生成的赋值运算符重载函数。原创 2024-04-22 22:23:35 · 681 阅读 · 0 评论 -
【C++】学习笔记——C++入门_1
我先说一种情景,比如说在某个文件下,非常频繁的使用某个命名空间域内的变量或者函数或者其他等等,我们每次访问和调用都需要加上命名空间名和作用域限定符,这也太麻烦了吧,于是乎,==using namespace == 这种方式就是展开命名空间,意思就是把访问权限打开,访问的时候就不需要指定作用域,直接访问就可以访问到。,这个关键字的意思就是命名空间,用法有一点点向结构体,但他定义的不是结构体名称,而是命名空间的名称。展开命名空间还是有弊端的,所以在日常练习中可以随意展开,在做项目的时候不建议展开。原创 2024-03-18 16:05:52 · 1060 阅读 · 0 评论 -
【C++】学习笔记——C++入门_3
由于形参只是实参的一份临时拷贝,改变形参并不能改变实参的值,所以我们一般通过传实参的地址,通过指针的方法来改变实参。在返回类型中加上引用后,我们返回的是a的别名 ,但是a已经销毁了,所以a空间内的内容以及不确定了,返回的a的别名导致非法访问,结果未知。当然,引用可以套用,我可以给a取别名为b,也可以给b取别名为c,此时a,b,c三者为同一变量。在一般的函数中,我们都是类似上面的代码那样返回的。,这样,新称号就是原名字的别名,两个名称都表示同一个变量。,编译器不会为引用变量开辟内存空间,它和它引用的变量。原创 2024-03-25 13:18:19 · 603 阅读 · 0 评论 -
【C++】学习笔记——C++入门_2
我们知道,C语言是不支持出现同名函数的,也就是说不支持函数重载的,那C++为啥就支持函数重载,他是在哪个地方进行了改动,才使得C++能够支持函数重载?哦豁,报错了,看来不能同时给,那在哪给呢,在声明给,还是在定义给,还是都可以?C++和C语言的融会贯通的,当不知道C++怎么控制精度时,可以去上网查查文档,也可以使用C语言的输出嘛,有什么方法就用什么方法。来的,声明处没有缺省,在主函数那调用的函数不给实参肯定是有问题的,所以说,过程中, 调用函数需要找到函数的地址才能够调用函数,而在C语言当中,是。原创 2024-03-20 23:56:01 · 897 阅读 · 1 评论 -
【C++】学习笔记——类和对象_2
内置类型不做处理其实属于缺陷,如果也能处理则会更加方便,于是在C++11版本,C++委员会对这个语法打了补丁,原创 2024-04-20 14:54:39 · 928 阅读 · 0 评论 -
【C++】学习笔记——类和对象_3
咦?自定义类型最终也是属于内置类型,所以说,拷贝构造函数是不是不用写,编译器自动生成就很完美了呢?当然不是,这涉及到了浅拷贝和深拷贝的问题了。原创 2024-04-21 16:36:31 · 1118 阅读 · 0 评论 -
【C++】学习笔记——类和对象_1
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。class Datepublic:// 这里是不是看的非常迷?day = day;int month;int day;return 0;原创 2024-04-18 22:18:48 · 1044 阅读 · 0 评论