![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++高级特性
文章平均质量分 83
C++11之后的新高级特性
Splaying
Studying
展开
-
C++高级特性:异常概念与处理机制(十四)
异常被抛出后,从进入try块起到异常抛出前(throw),这期间在栈上创建的所有对象都会被自动析构。这种情况就可以考虑使用多态的特性了,定义基类异常,所有可能的异常都继承基类异常,而捕获时只需要捕获基类异常即可。异常:是指在程序运行的过程中发生的一些异常事件(如:除数为0,数组下标越界,栈溢出,访问非法内存等)推荐使用抛出引用类型的异常处理,不会进行拷贝和手动分配堆区空间的问题,不会造成内存泄漏和性能负担。runtime_error子类。logic_error子类。原创 2024-04-24 10:28:16 · 807 阅读 · 0 评论 -
C++高级特性:虚函数与多态的实现原理(十三)
如果一个类存在virtual关键字函数或者继承的基类中存在virtual关键字的函数,那么该类的就会存在vptr和一个vtable。空类的大小为1字节,而存在虚函数(虚析构函数或其他虚函数)那么就会为该类生成一个vptr虚函数表指针和一个vtable虚函数表。其次调用本类的构造函数进行构造,如果本类存在vtable那么将本类的vtable地址赋值给vptr。时,a指针通过构造函数进行初始化,此时a内部的vptr指针会指向A的虚函数表vtable。如果没有构造函数,编译器会生成默认的空构造函数。原创 2024-04-22 16:08:42 · 619 阅读 · 0 评论 -
C++高级特性:malloc、free和new、delete的区别(十二)
malloc、free都是用于动态分配内存空间的操作,malloc是C语言中的库函数,new是C++中的操作符。delete需要对象类型的指针,它通过调用析构函数进行释放当对指针类型进行擦除或者强制转换后会导致出现异常。free传入void *类型的指针即可,但是free有个很重要的问题,它怎么知道需要释放多大的空间?new是在free store上分配内存的,free store的意思就是可以自由分配。new返回的是对象类型的指针,malloc返回的是void *之后进行类型转换。原创 2024-04-22 10:40:26 · 547 阅读 · 0 评论 -
C++高级特性:C/C++内存结构模型(十一)
代码段可制度数据段通常在程序加载时有操作系统加载到内存,一旦加载就不能被修改在函数调用时,函数的机器码也存储在代码段中,每个函数有其独特的代码段地址字符串常量等只读数据段中的数据是不可修改的,任何企图修改这些数据的尝试都会导致运行时错误作为一个专业的C++使用者来说,清楚的知道自己的代码变量存储的区域会有非常大的好处,补单能够写出高性能代码,而且有助于减少一些深层次的BUG。使用C++内存的一些注意事项内存泄漏:确保在动态分配内存后找个合适的时机释放掉,避免出现内存泄漏。原创 2024-04-21 17:48:24 · 1425 阅读 · 2 评论 -
C++高级特性:nullptr和NULL的区别(十)
可以看到nullptr被定义为nullptr_t类型同时nullptr_t的类型长度与void *长度相同>=201103L#endif而nullptr_t也可以定义一个其他指针的空指针对象并且与nullptr有相同的能力,而且被创建的对象是一个左值//报错,右值没有地址。原创 2024-04-19 11:07:50 · 444 阅读 · 0 评论 -
C++高级特性:四种类型转换(九)
C++标准规定,试图修改一个被声明为。原创 2024-04-18 21:14:58 · 812 阅读 · 0 评论 -
C++高级特性:可变长模板参数和折叠表达式(八)
&表示万能引用,需要注意的是如果不使用万能引用,传入参数的类型需要注意是左值还是右值,要与模板的参数类型匹配。可变长参数是C++类模板编程中非常重要的一个东西,也是C++11引入的新特性,通过使用…来表示参数长度不固定。可以通过sizeof…(args)获取传入参数的个数数量。C++11之后写这种模板函数的递归需要写一个空参函数和。参数,而在C++17之后可以折叠表达式展开。原创 2024-04-18 21:13:23 · 182 阅读 · 0 评论 -
C++高级特性:万能引用、引用折叠与完美转发(七)
由于出现了万能引用,现在传入参数就会变得很复杂,一会传入左值一会传入右值,通过模版参数接手的时候,实际上编译器呢会进行引用折叠的一个操作。那现在的结果就跟我们的需求背道而驰了啊,希望func(std::move(s))调用右值引用的func_push。万能引用:无论传入什么值还是引用都能够接收,并且确定其一个准确的类型,通过引用折叠的方式。一个左值引用的func_push、一个右值引用的func_push函数,二者是重载的关系。完美转发:我按照小明给我的方式(拷贝or移动)使用,这就叫完美转发!原创 2024-04-13 15:30:41 · 883 阅读 · 0 评论 -
C++高级特性:柯里化过程与std::bind(六)
其实上面的链式编程或者函数式编程就是一个柯里化的过程,其实这种操作在lambda表达式也有体现的,lambda表达式中继续lambda表达式。通过分析可以看到add(1)应该返回一个类似函数的东西func,然后这个东西还可以继续func(2)…现在需要完成这样一个需求:有一个函数每次调用返回的结果不一样。可以给一个全局的变量(静态变量),每次调用对这个全局变量进行值的修改然后返回,这样每次返回都不一样。如果需要用类来完成,那么可以使用operator()仿函数来做,仿函数其实是一个特殊的函数。原创 2024-04-12 20:55:04 · 500 阅读 · 0 评论 -
C++高级特性:右值引用与转移语义(五)
所有权的转移取决于实现。移动语义并没有太多神奇的事情去做,std::move只是用来匹配到移动构造(移动赋值)所有权与移动语义密不可分,可以说移动语义的诞生就是为了区分这个到底是转移所有权还是进行拷贝复制。原创 2024-04-12 14:15:37 · 354 阅读 · 0 评论 -
C++高级特性:重新理解左值、右值、左值引用与右值引用详解(四)
另外还有引用初始化的问题,引用只能在定义的时候初始化(定义的时候必须指定一个类型)。定义完毕无法初始化和修改指向,虽然无法修改指向但是可以修改值。b = y:实际上是将y的右值给了b当右值,不是把y的左值给了b当右值。int&b = x;b = y;/* 输出*/左值引用不是引用不了一个临时变量值吗,那右值引用来引用临时变量(东厂管不了的西厂管)右值引用却无法引用一个存在地址的左值(有实际地址)// 报错int t = 10;int& a = t;// 报错。原创 2024-04-11 23:48:00 · 1543 阅读 · 0 评论 -
C++高级特性:共享指针shared_ptr和弱指针weak_ptr(三)
一个函数返回一个unique_ptr的智能指针有一个很强的兼容性,可以用unique_ptr接受也可以用shared_ptr接受。很明显这里会发现university和teacher相互依赖,导致shared_ptr的计数引用无法降为0形成了死锁。unique_ptr可以转化为shared_ptr,shared_ptr无法转化为unique_ptr。解决方案:只需要将其中一个的shared_ptr弱化成weak_ptr指针即可。在释放对象时二者都不肯先一步析构,最后无法析构导致内存泄漏。原创 2024-04-11 15:12:53 · 331 阅读 · 0 评论 -
C++高级特性:独享智能指针unique_ptr(二)
C++11中通过引入智能指针的概念,使得C++程序员不需要手动释放内存。先准备一个Cat.h和一个Cat.cpp,如下。原创 2024-04-11 15:11:25 · 1126 阅读 · 0 评论 -
C++高级特性:Lambda表达式(一)
f1和f2是同一个函数都是用于求a + b的和其中函数f1和f2的类型可以具体指定通过std::function模板类来指定,也可以通过auto自动类型推导对于lambda表达式,不光可以函数类型自动推导,函数的传入参数、返回类型都可以自动推导…f3的lambda表达式相当于auto f3(auto a, auto b)这样一个函数f3(auto a, auto b)很好理解,可以当做一个函数模板来看,结果人家在函数模板的基础在返回类型继续auto…(C++14新特性)原创 2024-04-10 22:35:16 · 614 阅读 · 0 评论