![](https://img-blog.csdnimg.cn/496dc4b77daa4c118161fa87d435789a.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++语法
文章平均质量分 76
本专栏将为大家逐步讲解有关C++的相关语法
就要 宅在家
New git new get
展开
-
C++ Primer笔记——lambda表达式与bind函数
lambda是C++11所规定的一种新方法。一般用于泛型算法传递自定义函数。[ 捕捉列表 ] ( 参数列表 ) ->返回值类型 { 函数体 }lambda表达式会返回一个函数对象。};f(a, b);等价于下列函数{}//按降序排序});使用lambda表达式时,1.捕捉列表可以为空2.尾置返回类型和参数列表可以忽略,即[]{};3.捕捉列表和函数体不能忽略。原创 2022-12-20 09:00:00 · 1151 阅读 · 4 评论 -
C++语法——详解智能指针的概念、实现原理、缺陷
最初的智能指针是C++98提出来的auto_ptr,不过因为使用时缺陷很大,Beman G.Dawes(C++委员会成员之一)所成立的boost社区(专门面向C++程序员,提供许多免费好用的自制库)贡献了scoped_ptr、shared_ptr、weak_ptr被C++11采纳,修改为官方的unique_ptr、shared_ptr、weak_ptr。,即只能有一个指针指向申请的资源空间,不存在两个指针同时指向一个空间,可以说这个就是C++11中对auto_ptr的改进,将它作为智能指针的一种形式。原创 2022-12-09 08:30:00 · 1965 阅读 · 4 评论 -
C++语法——map与set的封装原理
list迭代器是用类封装,迭代器内部定义一个指针指向节点,对迭代器的操作底层是对迭代器内部指针的操作。迭代器的begin和end只能在rb_tree中实现,对于begin而言,返回红黑树最左节点的迭代器,end返回root的父节点迭代器(空节点迭代器)。其原理就是如果是父节点的左子节点,那么说明父节点在自己之后,如果是右子节点那么说明在父节点之后。对比3号和5号节点,都是叶子节点,但是3号节点++后是1号节点,5号++后是6号节点。对比节点3和节点5,节点3--之后是节点2,节点5--之后是节点4。原创 2022-12-01 05:30:00 · 901 阅读 · 9 评论 -
C++语法——右值引用、移动构造和赋值、万能引用和转发、move和forward底层实现
是的,因为to_string内部会生成一个string对象,而该对象是局部变量,出了函数作用域就销毁,因此只能调用拷贝构造to_string内部的对象。因为右值作为“暂时存在的数据”,把数据交给目标对象,目标对象把“舍弃”的数据交给右值,正好可以“延续”目标数据且消除原本数据。通过remove_reference源码可以看到,不管传入的是左值引用还是右值引用,它都只会返回这个值去掉引用后的类型。即当模板的参数是右值引用的形式,如果实参是左值就是左值引用,右值就是右值引用。原创 2022-11-21 17:00:00 · 1746 阅读 · 10 评论 -
C++语法——make_heap、push_heap、pop_heap、sort_heap使用介绍
这个函数用于建立堆。前两个参数为迭代器类型,最后一个为仿函数,用于确定建堆方式。默认使用大堆排序。可以调用官方仿函数greater,构建小堆排序,也可以自定义仿函数给参数comp。使用方式如下:这个用于将堆底数据加入堆结构中。因为nake_heap只能建堆,如果当前堆数据发生改变,就需要使用push_heap重回大堆/小堆。值得注意:first-last之间的元素必须满足堆结构。它仅仅是将last之后元素插入堆中。意思就是,如果一次性插入多个元素,它只会把最后一个元素(堆底)加入堆结构中原创 2022-11-15 10:30:00 · 3161 阅读 · 7 评论 -
C++语法——详细剖析多态与虚函数
所谓虚函数就是当通过指针或引用调用该函数时,编译器不会在编译时确定该函数地址,而是在运行时通过指针或引用的具体对象类型进行。正因为虚函数的这种特性,可以说它“天生”就是为多态准备的。多态是OOP的核心思想,含义是“多种形式”。当我们通过父类的指针或引用调用父类定义的虚函数时,并不会在编译时就清楚它的地址,只有当运行时确定了具体的对象类型,才会根据该对象类型调用该类型重写的该函数。换一种说法,假设人是一种父类,其中皮肤是虚函数,派生出了黑人、白人、黄种人三个子类,各自重写了皮肤函数为黑色、白色、黄色。原创 2022-10-30 11:15:00 · 455 阅读 · 4 评论 -
C++语法——详解虚继承
一.什么是虚继承所谓虚继承(virtual)就是子类中只有一份间接父类的数据。该技术用于解决多继承中的父类为非虚基类时出现的数据冗余问题,即菱形继承问题。,那么,当我们用D实例化对象调用a时,编译会报错,因为发生了混淆。除非指定类域B或C。当然指定A也可以,因为默认会从第一个父类中找。此时,D的实例化对象内部结构如下:而当我们使用虚继承时,结构是下图这样,D中只有一份父类A,当我们调用A中数据时,并不会发生冗余。原创 2022-10-23 16:15:00 · 22313 阅读 · 22 评论 -
C++语法——详细剖析类成员函数在内存中存储形式(包括静态)
先说结论,不管对于静态还是非静态成员,其都是。我们发现,。而地址空间中,代码区就在常量区下方(低地址处)。因为上述发现,更加佐证了类成员函数存放在代码区。当我们通过同一个类实例化出多个对象时,为了最大化的节省空间资源,。原创 2022-10-21 17:00:00 · 2134 阅读 · 6 评论 -
C++语法——超详细模拟实现list源代码
这篇小编将以SGI版的list为例进行模拟实现。这里小编做了一张图,它足以表明list的大致框架:对于节点node而言,我们可以按照c语言中的双向链表节点结构进行创建。首先node设为一种类由于list属于泛型编程,我们不知道链表数据类型,因此使用template将node变成泛型类。内部参数分别是node* next,node* prev,T value。通过代码我们可以发现,在结构上list_node与c语言的结构体链表节点基本无异。但是C++特性赋予了链表节点泛型编程的强大功能。当原创 2022-10-18 15:00:00 · 1568 阅读 · 11 评论 -
STL中list如何实现普通迭代器隐式类型转换成const迭代器
不要以为int可以隐式转化成const int,list所使用的是template泛型编程,当我们定义一种泛型时,更加需要确保其与模板匹配。要不然会更加乱套了。因此,编译器才会报错说iterator无法转化为iterator所以这里原因很清楚了,当我们定义一个const_iterator时,其默认拷贝构造的参数也是const_iterator。这时就会非常困惑,我们明明没有对权限进行放大,为什么编译器还会报错呢?原创 2022-10-14 08:00:00 · 747 阅读 · 7 评论 -
为什么STL中List的实现其迭代器iterator是类模板?
试想一下,你是使用者,创建的iterator一定想当然的认为是代指自己的list参数。再清晰一些,for(auto)时,本质使用的是迭代器,你的auto对象是不是代指节点的参数?由此,我们需要创建一个类模板来作为迭代器,其要包含整个节点,让++/--能够重载,发挥node = node->next/prev的作用。因此,当我们进行++操作时,是对list_node里的参数进行++,这显然不是我们要的下一个参数值。因此我们就会发现,单纯的T* iterator已经满足不了我们的需求了——我们无法重载++。原创 2022-09-19 17:44:22 · 411 阅读 · 9 评论 -
C++语法——详解运算符重载
运算符重载是C++的一个重要特性。有了运算符重载,在代码编写时能更好的实现封装。一.运算符重载介绍运算符重载,就是让原本已经存在的运算符有了新的用法和意义。比如我们熟知的减号(-),原本是用来进行数字的相减处理。但经过运算符重载后,它可以用来进行其他类型的相减,像时间相减、日期相减、字符相减等等。只要是你能想到的,通过运算符重载基本都能够实现。对于C++而言,运算符重载一般是作为类的成员函数出现。因为当我们需要运算符重载时,往往是类中一种特殊的类型需要处理或者类本身需要处理。就像我们可能会把.原创 2022-07-28 10:33:42 · 36257 阅读 · 20 评论 -
详解析构函数、拷贝构造函数
在销毁对象时,编译器会自动调用析构函数。因此析构函数不写参数。①析构函数不是销毁对象,而是清理对象内定义的空间。比如malloc、new空间的释放之类②定义多个对象时,先定义的后调用析构函数,后定义的先调用析构函数。这符合栈先入后出的原则。当然在静态区存放的对象是在局部变量后析构的,例如static和全局变量。③析构函数一般不必自定义,编译器有默认生成。但如果有malloc、new之类自定义类型,需要手动写。④析构函数的意义就是便于对象空间的释放,当有多个对象时,不必再每个都free/delet...原创 2022-07-26 12:35:02 · 2173 阅读 · 8 评论 -
C++ 详解构造函数
就比如我们创建的这个类a里还包含了另一个类b,假如被包含的那个类b有构造函数,那么在我们创建的这个类a被定义时,里面的类b会调用自己的构造函数进行初始化。原创 2022-07-20 11:58:30 · 398 阅读 · 9 评论 -
C++ this指针
今天,我们一起来了解关于this指针的使用。在C++中,类可以分成变量和函数,它们各自占有一块区域,而所有实例化对象在另一块区域。假如我们定义了同类的多个对象,那么当一个对象去调用该函数时,程序怎么判断此时函数是被哪个对象调用的呢?这时,程序是用this指针来判断的。...原创 2022-07-18 16:24:22 · 683 阅读 · 6 评论 -
C++函数重载
在C++里,相同的函数名可以对应不同的函数。需要注意的是,C++规定,函数重载形参的数量、类型可以不同,但返回值必须相同。这是因为代码的处理是从右往左的,如果返回值不同,但又不知道左边用类型来接收函数,那么就无法确定使用哪个函数了。使用示例如下:为什么C++支持函数重载而C不支持呢。这是由于它们两个不同的函数名修饰规则决定的,这发生在编译的阶段。在C语言里,连接时,函数名会改成_函数名,例如function->_function而C++里,函数名会带上参数类型,得以区分函数。具体来讲:比如funtion会被原创 2022-07-13 12:42:04 · 662 阅读 · 6 评论 -
C++缺省参数
C++为函数定义了一种新的参数形式。即函数参数值可以初始化,这叫做缺省参数。一.使用缺省参数是在函数调用时,如果未给参数赋值,那么自动调用参数自带的缺省值。缺省参数分为全缺省和半缺省。顾名思义,全缺省就是所有参数都有缺省值,半缺省就是部分参数有缺省值。例如:缺省参数实例: 二.规则1.缺省参数的赋值只能在函数定义或声明中选一个进行,不能同时进行赋值。即void function(int a = 10); void function(int a = 20) { std::cout ...原创 2022-07-12 19:45:56 · 1356 阅读 · 4 评论 -
C++引用知识归纳
目录一. 特性二. 使用方法 三. 优点四. 与指针的关系(区别和共性)引用有三个主要特性:必须初始化、对象不可修改、函数形参不必进行拷贝(语法上)。在使用引用时必须进行初始化,即给它赋一个对象。在使用引用时,不可改变引用对象。即引用的初始化对象即是它永远的对象。举个例子: 这里我们就可以看到 b = c的操作,不是说把b的引用对象改成c,而是说把c的值传递给b所引用的对象a。第三点我们在优点这一部分进行解释。引用大体可分为传参引用和返回引用。传参时,可作为函数的参数使用。使用方式如下:作为函数返回值时,特原创 2022-07-09 19:45:10 · 596 阅读 · 5 评论 -
namespace基础介绍
在与他人的合作编程中,可能会发生命名冲突的情况。而且项目越大,命名冲突所引发的麻烦就越大。那么有没有什么办法能让我们即便使用相同的名称也不会发生使用冲突呢,这里就要介绍C++语法里的namespace命名空间了。目录一。基础用法二。标准库namespace命名空间可以存储变量,结构体,函数等等。在使用时我们需要在定义的namespace中进行声明。例如我们想要定义两个函数car,又需要在同一个主函数中进行调用,那就可以定义两个namespace来分别存储这两个函数。在主函数中直接调用namespace即可原创 2022-07-06 18:10:03 · 864 阅读 · 9 评论 -
getline函数介绍
今天,小编将为大家讲解有关getline函数的相关知识。目录一.cin.getline(char* s, streamsize n, char delim)二.getline(istream& is, string& str, char delim)提到getline那就不得不提cin。相比于cin,getline的优点就是在输入字符串的时候能够输入空格。而cin则会在输入空格时自动结束输入。这一点与c语言中的scanf和gets函数很像。一.cin.getlin原创 2022-04-24 15:17:22 · 24022 阅读 · 9 评论