C++
文章平均质量分 79
_浮生_
More important things ahead, calm down and press forward with speed and urgency
展开
-
左值、右值、左值引用和右值引用
从图中可以看出,C++11之后,任何一个值,它肯定是LValue,XValue和PRValue中的一种。根据文档中的解释,如果一个表达式是一个指向类型T的引用,那么这个表达式的类型将会调整为类型T。C++11引入了右值引用,从而可以去读写在内存上临时的右值(C++11之前可以使用const左值引用去指向右值来读右值的内容,但是无法修改所指向的右值内容)。这个单词,其实也很好理解,当我们使用一个右值引用想要move一个临时对象的值时,这个临时对象的生命周期也就即将结束。的值类型,左值引用就是指向左值的引用。原创 2023-10-08 18:09:31 · 176 阅读 · 0 评论 -
右值引用、引用折叠、std::move和std::forward
前面两个调用很好理解,i是左值,所以调用参数是左值引用的函数,5是右值,所以调用参数是右值引用的函数。编译器把右值引用看作是左值,这也不难理解,右值引用是指向内存上临时变量的别名,我们可以读取它也可以通过它来修改临时变量的值,因此右值引用在使用上和左值没有区别。跟左值引用一样,右值引用可以作为函数的参数,从而避免拷贝操作。看起来右值引用和左值引用似乎一样,都是通过提供一个别名指向内存上变量的位置来节省拷贝操作,唯一的区别就是右值引用指向的是内存上没有名字的临时变量,而左值引用指向的是内存上有名字的变量。原创 2023-10-07 17:17:50 · 243 阅读 · 0 评论 -
C++ - 深入理解new
C++中new有三种形式:new operator、operator new和placement new。1. new operatornew operator就是我们平时使用的new表达式,来为特定类型分配内存,并在新分配的内存中构造该类型的一个对象。e.g.Employee* sp = new Employee("001");它实际上发生了三个步骤:该表达式调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象;运行该类型的一个构造函数,原创 2020-09-06 17:15:20 · 1454 阅读 · 0 评论 -
智能指针循环引用
C++11引入了智能指针unique_ptr,shared_ptr,及weak_ptr来帮助用户管理动态分配的内存,其本质是基于RAII原理,即当程序运行超过某个作用域("{ }"包含的区域)时,在该作用域内声明定义的对象会自动调用自己的析构函数析构。当智能指针对象析构的时,会将它所指向的对象的资源释放掉,从而不用用户自己手动的调用delete释放。对于shared_ptr,它内部有一个引用计数变量,每当它被拷贝一次,这个变量就加1。同样地,每当它被析构,变量就减1。当引用计数变量变为0时,就将它所指向的原创 2020-09-05 16:26:47 · 2060 阅读 · 2 评论 -
C++ - STL迭代器失效
迭代器失效就是说,对容器进行了一些操作后,先前的迭代器无法进行解引用操作去访问容器的元素。迭代器失效可能会造成程序崩溃,如下图各类迭代器失效总括1.原创 2020-08-28 17:35:40 · 1233 阅读 · 0 评论 -
移除string的最后一个字符几种方法
1.C++11 - pop_back推荐使用C++11引入的pop_back#include <iostream>#include <string>int main(){ std::string s = "C,C++,Java,"; if (!s.empty()) { s.pop_back(); } std::cout << s; return 0;}2.resize()#include <iostream>原创 2020-07-06 21:42:22 · 7886 阅读 · 0 评论 -
[C++] - 创建对象时 () 和 {} 的区别
C++11以后,对象的初始化可以有多种选择,总的来说,初始值可以通过三种方式给出:(), = 和 {}int x(0); //initializer is in parenthesesint y = 0; //initializer follows "="int z{ 0 }; //initializer is in braces使用{}的初始化方式称为uniform initialization,或者又称为braced initialization. Braced initializa原创 2020-07-04 21:26:15 · 1762 阅读 · 0 评论 -
[C++] - auto的使用、优点和缺点
Table of Contents1.auto的优点1>避免未初始化变量2>避免冗长的变量声明3>具有直接持有闭包(closure)的能力4>type shortcuts 类型捷径2.auto的缺点1>不适用invisible proxy class2>Braced Initializer 类型推断1.auto的优点1>避免未初始化变量auto变量从它们的初始化式中推断它们的类型,所以它们必须被初始化。这意味着你可以免受很原创 2020-06-28 17:41:09 · 9918 阅读 · 0 评论 -
[C++] - 闭包(closure)
转自:https://www.cnblogs.com/Aion/p/3449756.html闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。更直接一些,不就是个类吗?换了个名字而已。一个函数, 带上了一个状态, 就变成了闭包了. 什么叫 "带上状态" 呢? 意思是这个闭包有属于自己的变量, 这些个变量的值是创建闭包的时候设置的, 并在调用闭包的时候, 可以访问这些变量.函数是代码, 状态是一组变量 ,将代码和一组变量捆绑 (bind) , 就形成了闭包 ,内.转载 2020-06-28 14:47:29 · 1287 阅读 · 0 评论 -
[C++] - dynamic_cast介绍及工作原理、typeid、type_info
Table of Contents1.dynamic_cast工作原理:2.dynamic_cast介绍:3.static_cast与dynamic_cast:4.typeid:1.dynamic_cast工作原理《深度探索C++对象模型》中有个例子:class Point{public: Point(float xval); virtual ~Point(); float x() const; static int PointCount();prote.原创 2020-05-20 22:34:00 · 10626 阅读 · 5 评论 -
[C++] - C++11 多线程 - Future
C++11 标准中与异步任务系相关的类型主要是以下四种std::promise,std::packaged_task(std::promise,std::packaged_task也称为异步任务的提供者 Provider,此外std::async也可以作为异步任务的提供者,不过std::async并不是类,而是函数),std::future,std::shared_future。另外...转载 2020-04-19 11:34:03 · 1099 阅读 · 0 评论 -
[C++] - C++11 多线程 - Condition Variable
整理转自:https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/tree/master/zh/chapter5-Condition-VariableTable of Contents1.头文件摘要1.1 condition_variable 类摘要1.2 condition_variable_any 类摘要...转载 2020-03-08 23:00:26 · 248 阅读 · 0 评论 -
[C++] - C++11 多线程 - Mutex
C++11 中定义了如下与互斥量和锁相关的类: Mutex 系列类(四种),C++11 标准中规定的与互斥量相关的类包括: std::mutex,最基本的 Mutex 类,该类提供了最基本的上锁和解锁操作。同时,基本的互斥量不允许某个线程在已获得互斥量的情况下重复对该互斥量进行上锁操作,所以重复上锁将会导致死锁(结果通常未定义的)。 std::recursive_mutex,递归 M...转载 2020-03-03 21:36:39 · 1066 阅读 · 0 评论 -
[C++] - 纯虚函数 & 抽象基类 & 接口类
翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-interface-classes/1.纯虚函数和抽象基类C++允许我们创建一种特别的虚函数:纯虚函数(pure virtual function)(或者叫抽象函数abstract functio...翻译 2020-03-01 15:33:39 · 536 阅读 · 0 评论 -
[C++] - C++11 多线程 - Thread
1.与 C++11 多线程相关的头文件C++11 新标准中引入了五个头文件来支持多线程编程,它们分别是<atomic>, <thread>, <mutex>, <condition_variable>和<future>。 <atomic>:该头文主要声明了两个类,std::atomic和std::atom...转载 2020-03-01 11:01:39 · 408 阅读 · 0 评论 -
[C++] - 中的复制初始化(copy initialization)
过去在学习C++中类对象创建时,对constructor关注的很多,天真地认为了解了constructor,copy constructor,copy assignment就对类对象的创建理解了,今天遇到的一个看似不起眼的问题让我认识了还有copy initialization这么个东东,通过网上查阅揭开了copy initialization写神秘面纱,下面讲一下自己的一点理解。首先看一下问...原创 2017-05-10 20:15:35 · 1360 阅读 · 0 评论 -
[C++] - 类的构造函数constructor
构造函数的名字和类的名字相同,没有返回类型,在类的public域定义或声明。使用构造函数的三类方式:1)显示调用:e.g. Stock food = Stock("World Cabbage", 250, 1.25);2)隐式调用:e.g. Stock garment("Furry Mason", 50, 2.5);3)new:e.g. Stock *pstock = new St...原创 2017-04-25 23:00:33 · 364 阅读 · 0 评论 -
[C++] - 单例模式 释放资源 析构函数的应用
面试的时候被问到单例模式怎么释放资源,当时答的不太好。在网上查了下,找到一篇讲解很精彩的博客,转载一下。本文转自:http://blog.csdn.net/realxie/article/details/7090493单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程 序模块共享。有很多地方需要这...转载 2017-10-25 22:34:33 · 1756 阅读 · 0 评论 -
[C++] - 模板
We usetemplateswhen we need functions/classes that apply the same algorithm to a several types. So we can use the same function/class regardless of the types of the argument or result.In other wor...转载 2019-06-16 19:34:14 · 676 阅读 · 0 评论 -
[C++] - Returning by const value
A similar truth holds for the return value. If you say that a function’s return value isconst:const int g();you are promising that the original variable (inside the function frame) will not be m...转载 2019-06-16 22:43:23 · 532 阅读 · 0 评论 -
[C++] - lambda capture的成员函数 异步调用
关于lambda capture:If the capture-default is&, subsequent simple captures must not begin with&.struct S2 { void f(int i); };void S2::f(int i){ [&]{}; // OK: by-referenc...原创 2019-08-26 21:03:37 · 2293 阅读 · 0 评论 -
[C++] - private static成员函数
我们知道static成员函数不需要类创建具体的实例就可以调用,它有点类似于namespace将类和方法联系在一起。那么什么情况下会考虑将一个private的成员函数设置成static呢?主要考虑两点:1.这个方法只能被这个类使用;2.这个方法独立于这个类的内部状态。在C++中,一个常用的case就是如果一个private方法是具有工具属性的方法,那就可以考虑设为static。在...原创 2019-08-26 22:53:01 · 3929 阅读 · 0 评论 -
string对象中去掉标点符号
C++ Primer 4th Edition,P78,习题3.10题目要求:编写一个程序,从string对象中去掉标点符号。要求输入到程序的字符串必须必须包含标点符号,输出结果则是去掉标点符号后的string对象。int main(){string str;string new_str;int pos=0,new_pos=0;cout cin >>原创 2015-10-14 15:55:39 · 4922 阅读 · 1 评论