C++11
文章平均质量分 67
云飞扬_Dylan
这个作者很懒,什么都没留下…
展开
-
C++11模板隐式实例化、显式实例化声明、定义(简单易懂)
1. 隐式实例化在代码中实际使用模板类构造对象或者调用模板函数时,编译器会根据调用者传给模板的实参进行模板类型推导然后对模板进行实例化,此过程中的实例化即是隐式实例化。template<typename T>T add(T t1, T2){ return t1 + t2;}template<typename T>class Dylan{public: T m_data;};int main(){ int ret = add(3原创 2022-04-23 14:01:31 · 6976 阅读 · 0 评论 -
C++中的explicit关键字
C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。类构造函数默认情况下声明为隐式的即implicit。 隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。 explicit关键字只能用于类内部的构造函数声明上,...转载 2021-11-11 08:44:46 · 431 阅读 · 0 评论 -
C++11新特性之std::mem_fn函数
函数模板std :: mem_fn生成指向成员的指针的包装对象,该对象可以存储,复制和调用指向成员的指针。 调用std :: mem_fn时,可以使用对象的引用和指针(包括智能指针)。例子:原创 2021-06-11 15:16:56 · 1317 阅读 · 0 评论 -
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 · 2222 阅读 · 1 评论 -
C++ STL map 中关于自定义Key的约束
通常情况下,我们这样定义并且使用mapstd::map<int, int> map;map.insert({1,2});但当我们用自己定义的类类型作为key时,我们就会收到error的提醒#include <iostream>#include <map>class Dylan{public: Dylan() { name = ""; addr = ""; } Dylan(std::string na, std::string a原创 2020-08-13 15:12:01 · 1549 阅读 · 1 评论 -
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 · 64519 阅读 · 4 评论 -
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 · 2524 阅读 · 0 评论 -
C++中,using指示与using声明的区别 简单明了
1 using 声明using 声明的作用域等同于本条using声明语句所在的作用域从效果上看就好像using声明语句为命名空间的成员在当前作用域中创建了一个别名一样” ——《C++ primer》5thint i = 1; namespace NS{ int i = 2;} void f(){ cout << i << endl; //输出1,指的是全局作用域中定义的i using N::i; //原创 2020-07-02 14:37:56 · 1735 阅读 · 1 评论 -
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 · 6257 阅读 · 0 评论 -
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 · 659 阅读 · 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 · 2242 阅读 · 1 评论 -
C++11新特性之内联的命名空间(inline namespace)
C++11标准中,可以在父命名空间中定义内联的子命名空间,内联的子命名空间可以把其包含的名字导入到父命名空间中,从而在父命名空间中可以直接访问子命名空间中定义的名字,而不用通过域限定符Child::name的形式来访问。例如下面的代码:namespace Parent{ namespace Child1 { struct child1_data{int a;} ...原创 2018-06-10 15:44:41 · 6012 阅读 · 2 评论 -
C++11新特性之非受限联合体
1. 取消枚举对数据成员类型的限制联合体是C/C++语言中的一种数据结构。在这种数据结构中我们可以定义多种不同类型的数据,但这些数据却共享相同的一段内存空间。在C++98中,针对联合体中的数据类型有一些限制,即联合体中不能有非POD类型,静态类型以及引用类型。比如在C++98标准下,下面的代码将不会通过编译:class Person{public: Person(bool gender...原创 2018-06-10 13:48:44 · 1271 阅读 · 0 评论 -
C++11新特性之常量表达式 constexpr
1 常量表达式在C++11中引入了一个新的关键字“constexpr”,用来修饰一个函数或者变量使其变成一个常量表达式或值。比如下面的代码将函数GetConstValue变成一个常量表达式,并用这个常量表达式声明一个数组:constexpr int GetConstValue() {return 10;};int a[GetConstValue()];有了constexpr关键字,编译器就可以在...原创 2018-06-24 12:19:19 · 2814 阅读 · 0 评论 -
C++11新特性之强类型枚举及对原有类型的扩展
C++11标准以前的枚举类型有如下缺点:1. 非强类型,即在枚举中定义的成员会自动输出到父作用域,在枚举的父空间作用域中我们可以直接访问枚举中的某个成员而不需使用域限制符。2.可隐式转换为int类型。3. 占用存储空间,编译器会根据数据类型的不同对枚举类型分配不同的长度,例如在g++中,普通的枚举占用了4个字节,但如果数据长度大于四个字节,g++会将枚举类型扩展为8字节。例如下面的代码,Dbig的...原创 2018-06-23 15:06:26 · 1180 阅读 · 0 评论 -
C++11智能指针之weak_ptr
weak_ptr是一种弱智能指针,它具有类似shared_ptr的行为,但是却不会影响的它所指向的资源的引用计数。Weak_ptr不能被解引用,也不能被测试是否为null。weak_ptr之所以具备这些特点,是因为weak_ptr不是一个独立的指针,而是shared_ptr的一个附加物。Weak_ptr是通过shared_ptr创建出来的,正像如下代码:原创 2017-06-04 15:40:36 · 3201 阅读 · 1 评论 -
C++11智能指针之优先使用std::make_unique和std::make_shared而不是直接使用new
在初始化一个unique_ptr或者shared_ptr时,我们最好优先使用std::make_unique和std::make_shared。原因有一下几点:异常安全性假设有如下函数声明: intcomputePriority();void processInvestment(std::shared_ptr原创 2017-06-04 16:41:43 · 8300 阅读 · 0 评论 -
理解特殊成员函数的生成
在C++98中,有四种特殊成员函数,分别为:1默认构造函数2默认析构函数3默认拷贝构造函数4默认拷贝赋值函数 上面这4个特殊成员函数有如下特点:1只在你没有在类的定义中显式声明他们的时候,C++才会去创建他们。2他们默认是inline类型的3他们是non-virtual的,除非这个成员函数是析构函数,并且这个类的父类的原创 2017-06-10 11:03:07 · 413 阅读 · 0 评论 -
Effective Mordern C++ Item 25: 理解 std::move 和 std::forward
在这一章节的一开头,作者说 std::move() 没有move 任何东西,同样的, std::forword 也没有forword 任何东西。为什么这样说呢? 首先我们来看一下std::move的一个近似实现: 从上图代码中,我们可以看到move函数接受一个综合引用类型的参数param, 返回值为一个右值引用类型。根据模板针对综合引用的类型推导规则可知,传入到move函数中的参数原创 2018-02-02 16:52:55 · 589 阅读 · 0 评论 -
C++的特殊成员函数(special member functions)及其生成规则
特殊成员函数(Special member functions)是指那些编译器可以为类自动产生的函数。C++ 中有五种特殊成员函数(special member functions):1. 默认构造函数(Default constructor):只有当类中没有用户显式自定义的构造函数时,编译器才会自动为该类生成。2. 析构函数(Destructor):只有当类中没有用户自定义的析构函数时,编译器自...原创 2018-03-10 15:49:59 · 2232 阅读 · 0 评论 -
区分综合引用(Universal reference)和右值引用
在C++中区分综合引用和右值引用可遵循以下原则1. 变量或者参数的形式必须严格符合“T&&”的形式,并且T需要经过类型推导,是综合引用。符合T&&的形式,且需要经过类型推导来判断T的类型,所以是综合引用。理由同上,所以是个综合引用Args的类型依赖于vector的T,每一次调用emplace_back时都需要根据T的类型来推导Args的类型,所以这是一个综合引用。2...原创 2018-03-10 16:23:37 · 2157 阅读 · 0 评论 -
C++11新特性之类构造函数
1.继承构造函数当子类中只有方法而没有新增自己的数据成员的时候,对于子类的初始化也就相当于对基类的初始化,为了对基类进行初始化,子类必须也要定义和基类相同的构造函数,这就增加了代码量,尤其在基类构造函数很多的情况下问题更加突出。C++11标准允许用using关键字在子类中继承父类的构造函数,如下所示:class A{A(int i){}A(double d, in...原创 2018-05-31 13:38:04 · 2811 阅读 · 1 评论 -
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 · 499 阅读 · 0 评论 -
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 · 5754 阅读 · 7 评论 -
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 · 1032 阅读 · 2 评论 -
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 · 437 阅读 · 0 评论 -
C++11之default和delete
简介: 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数。对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量。对于 deleted 函数, 编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性。本文将通过代码示例详细阐述 defaulte转载 2017-06-07 13:15:09 · 609 阅读 · 0 评论