C++
文章平均质量分 73
温习这些年跟侯捷老师学的C++相关知识;做些整理,分享给大家,共同进步。
夏之七
立足小世界,日积跬步;沟通大世界,万川映月。
展开
-
简单易懂!手把手:从安装部署VMWare&Ubuntu,到编写、编译、运行、调试程序
一、安装VMWareVMWare下载网址:https://www.vmware.com/cn/products/workstation-pro.html本文VMware采用的版本是10.0.7 bulid-2844087序列号:1Z0G9-67285-FZG78-ZL3Q2-234JG虚拟机的安装比较简单,按照安装向导依次点击下一步安装就可以了,这里不再做详细介绍。二、安装UbuntuUbuntu镜像下载网址:http://www.ubuntu.com1)打开VMWare,然后点击“..原创 2021-09-30 17:21:56 · 3032 阅读 · 0 评论 -
C++设计模式--Observer观察者模式
1、动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”–一个对象(目标对象)的状态发生变化,所有依赖对象(观察者对象)都将得到通知。如果这样的依赖过于紧密,将使软件不能很好的抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种文档的依赖关系。从而实现软件体系结构中的松耦合。2、模式定义定义对象间的一种一对多(变化 )的依赖关系, 以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。实例源码:红色模块为改良前,蓝色代码为改良后c..原创 2021-07-24 23:50:47 · 159 阅读 · 0 评论 -
C++设计模式--模板方法
1、含义概要定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。2、源码实例原始源码:class Library {public: void Step1() { //..... cout <<"Step1" << endl; } void Step3() { //..... cout <<..原创 2021-07-24 22:39:42 · 172 阅读 · 0 评论 -
C++并发与多线程编程--windows临界区、其他mutex互斥量
1、windows临界区临界区又称关键代码段,指的是一小段代码在代码执行前,它需要独占一些资源。1.1 相关函数(1)初始化程序中通常将多线程同时访问的某个资源作为临界区,需要定义一个CRITICAL_SECTION类型的变量,然后调用InitializeCriticalSection函数对变量进行初始化;函数原型:VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection );参数说明:lpCriticalSect..原创 2021-07-24 22:03:15 · 241 阅读 · 1 评论 -
C++并发与多线程编程--async、future、packaged_task、promise、atomic
1、std::async、std::future创建后台任务并返回std::async是个函数模板,用于启动一个异步任务,启动起来一个异步任务后,返回一个std::future对象,std::future是个类模板。启动异步任务,即自动创建一个线程并开始执行对应的线程入口函数,它可以返回一个std::future对象。std::future对象含有线程入口函数所返回的结果(线程返回的结果),我们可以通过调用future对象的成员函数**get()**获取。提供了一种访问异步操作的机制。int m..原创 2021-07-23 18:08:43 · 338 阅读 · 0 评论 -
C++并发与多线程编程--unique_lock
1、unique_lock概念unique_lock是一个类模板,工作中一般使用lock_guard(推荐使用)。unique_lock比lock_guard灵活,但效率差一些,内存消耗也多一些。一般用法:std::mutex my_mutex;//...............std::unique_lock(std::mutex) sbguard(my_mutex);2、unique_lock参数(1)std::adpot_lock前提:在此之前要先加lock。表示互斥量已经..原创 2021-07-23 17:20:49 · 211 阅读 · 0 评论 -
C++并发与多线程编程--互斥量用法
1、互斥量概念互斥量是个类对象。理解成一把锁,多个线程尝试使用lock()成员函数来加锁,只有一个线程能锁定成功。如果没有锁定成功,那么流程卡在lock()这里不断的尝试去锁住这把锁头。互斥量使用要小心,保护数据不多也不少,少了,没达到保护的效果,多了,影响效率。2、互斥量用法(1)lock(),unlock()lock() 和unlock()要成对使用,有lock(),必然有unlock()。不应该也不允许调用了一次lock(),却调用多次unlock()。std::mutex ..原创 2021-07-23 17:00:30 · 190 阅读 · 0 评论 -
C++并发与多线程编程--陷阱
1、传递临时对象作为线程参数//陷阱1void myprint1(const int &i, char *pmybuf) //解决方案:修改输入参数类型(const int i, const string &pmybuf){ std::cout << i << std::endl; //分析认为,i不是传进来的mvar的引用,实际是值传递。如果主线程detach了,也不影响子线程该参数 std::cout << pmyb..原创 2021-07-23 16:15:39 · 215 阅读 · 0 评论 -
C++并发与多线程编程--启动、结束、join、detach
1、线程的简单使用void myprint(){ cout << "线程开始执行" << endl; //... cout << "线程结束执行"<< endl;}#include <thread>//.....int main(){ thread mytobj1(myprint);//创建了一个线程,线程执行起点(入口)myprint();(2)myprint线程开始执行 mytobj1.join..原创 2021-07-23 15:15:39 · 495 阅读 · 0 评论 -
C++并发与多线程编程--概念简述
1、并发两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务。以往计算机,单核cpu,某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所谓的“任务切换” 并发的假象(不是真正的并发),这种切换(上下文切换)是要有时间开销的, 比如操作系统要保存你切换时的各种状态,执行进度等信息,都需要时间,一会切换回来的时候要复原这些信息。现在计算机有双核、4核、8核…出现了多处理器,能够实现真正的并行执行多个任务(硬件并发)。使用并发的原因:同时可以做多个事情,提到性能。..原创 2021-07-23 14:26:37 · 180 阅读 · 0 评论 -
C++智能指针详解
1、概述我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete。new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针;delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。动态内存管理经常会出现两种问题:(1)一种是忘记释放内存,会造成内存泄漏;(2)一..原创 2021-07-23 12:16:30 · 31212 阅读 · 15 评论 -
C++ 中的.hpp文件
1、*.hpp含义hpp其实质是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该cpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。特点:是Header Plus Plus 的简写。与.h类似,hpp是C++程序头文件 。..原创 2021-07-23 10:36:28 · 5303 阅读 · 0 评论 -
C++内存管理--详谈
1、简述内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。..原创 2021-07-23 00:13:14 · 1945 阅读 · 9 评论 -
C++浅拷贝和深拷贝
1、浅拷贝浅拷贝:又称值拷贝,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的。 举个简单的例子,你的小名叫西西,大名叫冬冬,当别人叫你西西或者冬冬的时候你都会答应,这两个名字虽然不相同,但是都指的是你。假设有一个String类,String s1;String s2(s1);在进行拷贝构造的时候将对象s1里的值全部拷贝到对象s2里。我们现在来简单的实现一下这个类:#include <iostream>#includ..原创 2021-07-22 22:41:04 · 2473 阅读 · 1 评论 -
C++11/14新特性--=default、=delete、tuple
1、概要=default、=delete:显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器不生成函数默认的缺省版本)。C++11中引进这两种新特性的目的是为了增强对“类默认函数的控制”,从而让程序员更加精准地去控制默认版本的函数。2、“=default ”类与默认函数C++中,当我们设计与编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数:(1)构造函数(2)析构函数(3)拷贝构造函数(4)拷贝赋值函数(operator=)(5)移动构造函数以及全局的..原创 2021-07-21 23:01:40 · 590 阅读 · 4 评论 -
C++11/14新特性--内存对齐
1、现象先看一段代码:struct s1{ char s; int i;}; struct s2{ int i; double d;}; cout << "-------basic type" << endl;cout << "sizeof(char) " << sizeof(char) << endl;cout << "sizeof(int) " << sizeo..原创 2021-07-21 20:01:08 · 581 阅读 · 3 评论 -
C++11/14新特性--右值引用、移动语义、完美转发
1、右值引用C++引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。(1)左值和右值C++中所有的是必然属于左值、右值二者之一。左值:指的是表达式结束后依然存在的持久化对象。右值:指的是表达式结束时就不再存在的临时对象。所有的具名变量或对象都是左值,而右值不具名。区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值。右值又分为将亡值和纯右值。纯右值:就是c++98标准中右值的概念,如非引用返回的函数返回的临时变量值;一些运算表达式,如1+2产生的..原创 2021-07-21 12:43:26 · 344 阅读 · 0 评论 -
C++11/14新特性--强类型枚举
1、强枚举类型(1)问题引出在传统C++中,枚举类型并非类型安全,枚举类型会被视作证书,则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给除了检查,但并非所有),甚至枚举类型的枚举名字不能相同,这不是我们希望看到的。(2)解决方案C++11引入了枚举类型(enumaration class),并使用enum class的语法进行声明:enum class new_enum : unsigned int{ value1, value2, value3 = 1..原创 2021-07-15 11:24:47 · 563 阅读 · 0 评论 -
C++11/14新特性--面向对象增强、overide、final
1、委托构造C++11引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的:class Base{public: int value1; int value2; Base(){ value1 = 1; } Base(int value) : Base() { // 委托 Base() 构造函数 value2 = 2; }};int main(){ ..原创 2021-07-15 10:17:05 · 150 阅读 · 4 评论 -
C++11/14新特性--模板增强、variadic templates
一、模版增强1、外部模版1) 传统C++的问题传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要触发模板实例化。2)C++解决方法C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使得能够显式的告诉编译器何时进行模板的实例化。关键字:extern template class std::vect..原创 2021-07-14 20:29:18 · 717 阅读 · 7 评论 -
C++11/14新特性--区间迭代、初始化列表
1、基于范围的for循环1)基于循环的迭代写法int array[] = {1,2,3,4,5};for(auto &x : array){ std::cout << x << std::endl;}2)容器遍历 std::vector<int> arr(5, 100); //arr数组包含5个100的元素 //原来遍历方式 for (std::vector<int>::iterator i = arr.begin..原创 2021-07-14 17:45:24 · 258 阅读 · 0 评论 -
C++11/14新特性--类型推导 auto、decltype
一、概要在传统 C 和 C++中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖慢我们的开发效率,也让代码变得又臭又长。C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。这使得 C++ 也具有了和其他现代编程语言一样,某种意义上提供了无需操心变量类型的使用习惯。二、autoauto 在很早以前就已经进入了 C++,但是它始终作为..原创 2021-07-14 17:07:41 · 427 阅读 · 0 评论 -
C++11/14新特性--lambda、nullptr、constexpr、noexcept
一、lambda1、lambda函数特点lambda表达式是一种匿名函数,即没有函数名的函数;取而代之的多了一对方括号[];lambda函数还采用了追踪返回值类型的方式声明其返回值;匿名函数是由数学中的λ演算而来。在C++11中,lambda函数是inline(内联函数)。2、lambda语法定义[capture] (parameters) mutable ->return-type {statement} 其中:[capture] :捕捉列表。捕捉列表总是作为lambd..原创 2021-07-14 15:11:49 · 806 阅读 · 0 评论