
C++
文章平均质量分 72
云飞扬_Dylan
这个作者很懒,什么都没留下…
展开
-
C++中的explicit关键字
C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。类构造函数默认情况下声明为隐式的即implicit。 隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。 explicit关键字只能用于类内部的构造函数声明上,...转载 2021-11-11 08:44:46 · 454 阅读 · 0 评论 -
C++ 位域及其内存分布
本文中的代码,插图来自:https://docs.microsoft.com/en-us/cpp/cpp/cpp-bit-fields?redirectedfrom=MSDN&view=msvc-160在C++的结构体或者类中,我们可以通过位域运算符来进一步限定成员变量占几个bit,比如// bit_fields1.cpp// compile with: /LDstruct Date { unsigned short nWeekDay : 3; // 0..7 (原创 2021-09-02 14:23:15 · 1081 阅读 · 0 评论 -
C++中的字节对齐
一、字节对齐的定义计算机在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。二、对齐的作用和原因:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这原创 2021-02-07 14:14:14 · 1541 阅读 · 0 评论 -
C++ 继承中的访问控制
继承类型 基类成员访问说明符 派生类成员访问说明符 public public public protected private private inaccessiable protected public protected protected protected private inaccessiable private public private protected private pr原创 2020-12-17 16:56:50 · 300 阅读 · 0 评论 -
树状数组介绍(简单易懂的原理讲解)
树状数组又称为Binary Indexed Tree(BIT)或者FenWick Tree树状数组可以解决什么样的问题:这里通过一个简单的题目展开介绍,先输入一个长度为n的数组,然后我们有如下两种操作:输入一个数m,输出数组中下标1~m的前缀和 对某个指定下标的数进行值的修改多次执行上述两种操作寻常方法对于一个的数组,如果需要求1~m的前缀和我们可以将其从下标1开始对m个数进行求和,对于n次操作,时间复杂度是O(n^2),对于值的修改,我们可以直接通过下标找到要修改的数,n次操作时间复转载 2020-08-25 10:27:11 · 2108 阅读 · 1 评论 -
C++ STL unordered_map中关于自定义key的一些约束
当我们在使用自定义类型作为unordered_map的key的时候,要求我们的自定义类型满足一下两点:1. 需要提供hash函数,这是由于unordered_map的底层数据结构是hash table,所以需要一个hash函数来key序列化然后返回哈希值class Dylan{public: Dylan() { name = ""; addr = ""; } Dylan(std::string na, std::string ad) : name(na), addr(ad) {原创 2020-08-13 15:36:11 · 2394 阅读 · 1 评论 -
c++中new的三种用法详解 清晰明了
一、概述new有三种使用方式:plain new,nothrow new和placement new。(1)plain new就是我们平常使用的普通的new运算符。void* operator new(std::size_t) throw(std::bad_alloc)void operator delete(void *) throw();提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL程序用例:#include "stda原创 2020-07-17 21:14:25 · 4826 阅读 · 0 评论 -
C++11中的std::bind 简单易懂
概述std::bind的头文件是 <functional>,它是一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。函数原型std::bind函数有两种函数原型,定义如下:template< class F, class... Args >/*unspecified*/ bind( F&& f, Args&&... args );template< clas.原创 2020-07-16 14:34:49 · 70162 阅读 · 5 评论 -
C++11中的std::function 简单易懂
在C++11中引入了std::function, 那么function有什么好处呢。简而言之, std::function是对C++中各种可调用实体的封装,形成一个新的可调用的std::function对象。可调用实体是什么呢?C++中都有哪些可调用实体呢?在C++中,可调用实体包括如下四类: 1、是一个函数指针。(函数必须和C函数一样可在编译期之内唯一确定的函数指针) 2、函数对象(也叫仿函数),即具有一个重载operator()成员函数的类对象。 3、是一个可被转换为函数指针的原创 2020-07-16 14:02:36 · 2571 阅读 · 0 评论 -
C++11 自定义Move构造函数(Move Constructor)和Move赋值运算符(Move Assignment Operators)
在C++11的标准当中,引入了右值的概念以及跟右值密切相关的Move语义,由此C++的类定义中也多了2个成员函数:Move构造函数和Move赋值运算符。这篇文章将讨论如何为我们自己的类编写Move 构造函数和Move赋值运算符。class IntArray 是一个Int 类型的数组,它的类定义如下:#pragma once#include <iostream>#inclu...原创 2020-03-07 16:27:16 · 6472 阅读 · 0 评论 -
C++ reinterpret_cast
reinterpret_cast <new_type> (expression)reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast...转载 2020-03-06 20:16:46 · 1740 阅读 · 0 评论 -
C++11新特性之用户字面量操作符
如下代码定义了一个RGB三元组以及一个以RGB为参数的blend函数:class RGB{public: RGB(uint8 R, uint8 G, uint8 B):m_r(R),m_g(G),m_b(B){}private: uint8 m_r ; uint8 m_g ; uint8 m_b ;};void blend(RGB && ...原创 2018-06-10 16:18:35 · 2305 阅读 · 1 评论 -
C++11新特性之内联的命名空间(inline namespace)
C++11标准中,可以在父命名空间中定义内联的子命名空间,内联的子命名空间可以把其包含的名字导入到父命名空间中,从而在父命名空间中可以直接访问子命名空间中定义的名字,而不用通过域限定符Child::name的形式来访问。例如下面的代码:namespace Parent{ namespace Child1 { struct child1_data{int a;} ...原创 2018-06-10 15:44:41 · 6057 阅读 · 2 评论 -
C++11新特性之非受限联合体
1. 取消枚举对数据成员类型的限制联合体是C/C++语言中的一种数据结构。在这种数据结构中我们可以定义多种不同类型的数据,但这些数据却共享相同的一段内存空间。在C++98中,针对联合体中的数据类型有一些限制,即联合体中不能有非POD类型,静态类型以及引用类型。比如在C++98标准下,下面的代码将不会通过编译:class Person{public: Person(bool gender...原创 2018-06-10 13:48:44 · 1308 阅读 · 0 评论 -
C++11新特性之强类型枚举及对原有类型的扩展
C++11标准以前的枚举类型有如下缺点:1. 非强类型,即在枚举中定义的成员会自动输出到父作用域,在枚举的父空间作用域中我们可以直接访问枚举中的某个成员而不需使用域限制符。2.可隐式转换为int类型。3. 占用存储空间,编译器会根据数据类型的不同对枚举类型分配不同的长度,例如在g++中,普通的枚举占用了4个字节,但如果数据长度大于四个字节,g++会将枚举类型扩展为8字节。例如下面的代码,Dbig的...原创 2018-06-23 15:06:26 · 1250 阅读 · 0 评论 -
C++11新特性之基于范围的for循环
C++11中引入了基于范围的for循环,当我们需要遍历一个范围可定的数组时,就可以使用这种方式:int a[5] = {1,2,3,4,5};for(int i: a){ cout<<e<<endl ;}注意:使用这种方式数组必须时范围可定的,对于一个类来说,此类必须定义了begin()和end()函数,且必须定义++ 和==等操作符。下面的例子中,数组的范围...原创 2018-06-23 13:47:55 · 460 阅读 · 0 评论 -
C++11新特性之追踪返回类型函数
追踪返回类型函数是指把函数的返回类型后置,这在模板类型推导过程中非常有用处,比如下面的代码:template<typename T1, typename T2>decltype(t1+t2) Sum(T1&t1, T2& t2){ return t1+t2;}在上面这个函数定义中,decltype无法推导出t1+t2的类型,因为编译器是从左向右处理的,当处...原创 2018-06-23 13:33:42 · 1063 阅读 · 2 评论 -
Perf -- Linux下的系统性能调优工具,第 1 部分
Perf -- Linux下的系统性能调优工具,第 1 部分应用程序调优的使用和示例本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.htmlPerf 简介Perf 是用来进行软件性能分析的工具。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可...转载 2019-03-19 10:49:34 · 948 阅读 · 1 评论 -
C++11新特性之POD类型
POD(Plain Old Data)是C++中非常重要的一个概念,用来描述一个类型的属性其中Plain表示这个类型是个平凡的类型,Old表示其与C的兼容性。C++11中将POD划分为两个基本概念:平凡的(trival)和标准布局(standardlayout)。1.平凡性(trivial)什么是平凡性呢?通常一个平凡的类或者结构体具有以4点下特征:1.具有平凡...原创 2018-05-31 15:12:06 · 6163 阅读 · 7 评论 -
C++11新特性之定义类型别名
在C++98中,我们通常用typedef关键字为类型第一别名:typedef unsigend char u_int8;在C++11中,为类型定义别名已不再时typedef的专属任务,using关键字也具有这一功能:using u_int8 = unsigned char;...原创 2018-06-10 16:31:28 · 701 阅读 · 0 评论 -
UML中的关系介绍(依赖,关联,聚合,组合,泛化,实现)
本文转自:https://blog.youkuaiyun.com/backzero/article/details/7488535关于设计模式的总结没有落实到代码上,而且设计模式自己确实动手实现的非常少。所以在这一周里,除了看网站开发的视频,着手开始对设计模式进行实现以下。设计模式非常经典,每次看都有不同的收获,写一下自己的收获吧,请大家指正。 在实现设计模式之前,首先来复习以下UML中的五种关系图...转载 2018-10-29 15:02:49 · 1483 阅读 · 0 评论 -
C++类的前置声明
前置声明的使用 有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:// A.h #include "B.h" class A { B b; public: A(void); virtual ~A(void); }...转载 2018-11-03 16:38:12 · 1604 阅读 · 0 评论 -
C++类的前置声明(二)
看完《Effective C++》条款31有感。。假设有一个Date类//Date.hclass Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法其一//Task1.hclass Date; class Task1 { public: Da...转载 2018-11-03 16:42:27 · 252 阅读 · 0 评论 -
怎样使用C++类的前置声明代替包括头文件
这篇文章很大程度是受到Exceptional C++ (Hurb99)书中第四章 Compiler Firewalls and the Pimpl Idiom (编译器防火墙和Pimpl惯用法) 的启发,这一章讲述了减少编译时依赖的意义和一些惯用法,其实最为常用又无任何副作用的是使用前置声明来取代包括头文件。Item 26 的Guideline - "Never #include a he...转载 2018-11-03 16:55:55 · 1037 阅读 · 0 评论 -
Perf -- Linux下的系统性能调优工具,第 2 部分
Perf -- Linux下的系统性能调优工具,第 2 部分特殊用法以及内核调优示例本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/本文内容简介之前介绍了 perf 最常见的一些用法,关注于 Linux 系统上应用程序的调优。现在让我们把目光转移到内核以及其他 perf 命令上面来。在内核方面,人们的兴趣五...转载 2019-03-19 13:09:58 · 1002 阅读 · 0 评论 -
C++中static_cast和dynamic_cast强制类型转换
本文转自:https://www.cnblogs.com/wft1990/p/7126812.html在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast。一、static_cast关键字(编译时类型检查)用法:static_cast < type-id > ( expression ),该运算符把expression转换为t...转载 2019-09-18 16:07:27 · 688 阅读 · 0 评论 -
const_cast and reinterpret_cast
const_cast函数原型:const_cast < type-id > ( expression ) 去掉const属性:const_cast<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。 加上const属性:const int* k = const_cast<const in...转载 2019-09-18 16:34:54 · 409 阅读 · 0 评论 -
VS(visual studio)中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径的解释
说明$(RemoteMachine)设置为“调试”属性页上“远程计算机”属性的值。有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置。$(References)以分号分隔的引用列表被添加到项目中。$(ConfigurationName)当前项目配置的名称(例如“Debug”)。$(PlatformName)当前项目平台的名称转载 2017-03-12 17:00:58 · 958 阅读 · 0 评论 -
C++11新特性之初始化列表
C++11支持对非内置类型如vector进行初始化列表方式的初始化:#include<vector>using namespace std;int a[] = {1,2,3};int b[] {3,4,5};vector<int, float> d={{1, 1.2},{2, 3.3},{3.3.8}};C++11丰富了自动变量和全局变量的初始化方式:int a ...原创 2018-05-31 14:06:58 · 515 阅读 · 0 评论 -
C++11新特性之类构造函数
1.继承构造函数当子类中只有方法而没有新增自己的数据成员的时候,对于子类的初始化也就相当于对基类的初始化,为了对基类进行初始化,子类必须也要定义和基类相同的构造函数,这就增加了代码量,尤其在基类构造函数很多的情况下问题更加突出。C++11标准允许用using关键字在子类中继承父类的构造函数,如下所示:class A{A(int i){}A(double d, in...原创 2018-05-31 13:38:04 · 2849 阅读 · 1 评论 -
C++11之右值引用、完美转换(Perfect Forwarding)、std::move
新特性的目的右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。能够更简洁明确地定义泛型函数。转载 2017-03-14 17:54:01 · 1363 阅读 · 2 评论 -
Effective Modern C++之Item 2 理解auto的类型推导
前文总结过对于模板的类型推导过程,详情参考:Effective Modern C++之Item1。今天再总结一下Effective Modern C++ Item 2 理解auto的类型推导。auto类型推导过程和模板类型推导几乎遵循同样的推导规则。所以为了便于理解auto类型推导过程,我们可以建立auto和模板函数之间的映射关系。在对Item 1(模板函数类型推导)的总结中,我们的函数模板原创 2017-03-30 15:31:02 · 560 阅读 · 0 评论 -
windows下静态链接库的创建与使用
Windows下创建与使用静态库创建静态库(.lib)如果是使用VS命令行生成静态库,也是分两个步骤来生成程序:l 首先,通过使用带编译器选项 /c 的 Cl.exe 编译代码 (cl /c StaticMath.cpp),创建名为“StaticMath.obj”的目标文件。l 然后,使用库管理器 Lib.exe 链接代码 (lib StaticMath.o转载 2017-03-12 17:07:51 · 1576 阅读 · 0 评论 -
关于DECLARE_DYNCRATE 与 DECLARE_DYNAMIC的讨论
DECLARE_DYNAMIC 表示可以运行时识别该类DECLARE_DYNCREATE 包含了DECLARE_DYNAMIC的功能,并且可以在运行过程中动态创建对象。如果需要动态创建类对象,需要使用这个宏定义。 DECLARE_DYNCREAT定义如下:#define DECLARE_DYNCREATE(class_name) \ DECLARE转载 2017-03-12 17:11:29 · 849 阅读 · 0 评论 -
windows下创建与使用动态链接库
Windows下创建与使用动态库创建动态库(.dll)与Linux相比,在Windows系统下创建动态库要稍微麻烦一些。首先,需要一个DllMain函数做出初始化的入口(创建win32控制台程序时,勾选DLL类型会自动生成这个文件):dllmain.cpp入口文件// dllmain.cpp : Defines the ent转载 2017-03-12 17:06:55 · 684 阅读 · 0 评论 -
对于同步、异步、阻塞、非阻塞的几点理解
一、同步与异步同步/异步, 它们是消息的通知机制1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数翻译 2017-03-12 16:58:02 · 550 阅读 · 0 评论 -
Linux零碎知识点
1、查看gcc或g++默认的include路径,即当程序中以“#include”方式包含文件件事,gcc或g++编译器的默认搜索路径`gcc -print-prog-name=cc1plus` -v`g++ -print-prog-name=cc1plus` -v2、设置gcc或g++默认的include路径在用户家目录下或root用户/root目录下:原创 2017-03-12 16:52:25 · 496 阅读 · 0 评论 -
Linux之动态链接库
Linux下创建与使用动态库 linux动态库的命名规则动态链接库的名字形式为 libxxx.so,前缀是lib,后缀名为“.so”。l 针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。l 在文件系统中,soname仅是一个链接到实际动态库的链接。对于动态库而言,每个库实际上都转载 2017-03-12 16:50:11 · 563 阅读 · 0 评论 -
Linux之静态库
Linux静态库命名规则Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a。创建静态库(.a)通过上面的流程可以知道,Linux创建静态库过程如下:l 首先,将代码文件编译成目标文件.o(StaticMath.o)g++ -c StaticMath.cpp转载 2017-03-12 16:47:53 · 411 阅读 · 0 评论 -
vs中输出详细错误信息的设置
在vs编译的时候,会出现error MSB6006: "cmd.exe" exited with code 1.的错误,为了找到错误的根本原因,可以设置vs使其输出更为详细的错误信息,步骤如下:TOOLS->Options->Projects and Solutions->Build and Run->MSBuild Project build output verbosity,在下拉框中选择原创 2016-12-27 15:25:01 · 12931 阅读 · 0 评论