
C++11
Aced96
这个作者很懒,什么都没留下…
展开
-
19、C++11 shared_ptr智能指针
C++98/03 标准中,支持使用 auto_ptr 智能指针来实现堆内存的自动回收;C++11 新标准在废弃 auto_ptr 的同时,增添了 unique_ptr、shared_ptr 以及 weak_ptr 这 3 个智能指针来实现堆内存的自动回收。shared_ptr智能指针每种智能指针都以类模板的方式实现。shared_ptr<T>的定义位于<memory>头文件,并位于std命名空间中。// 每次使用加这两行代码#include<memory>.原创 2021-08-31 11:27:20 · 210 阅读 · 0 评论 -
18、C++11完美转发及实现方法
什么是完美转发?它指的是函数模板可以将自己的参数“完美”地转发给内部调用的其它函数。完美,表示能保证被转发参数的左、右值属性不变。“不完美“函数举例:template<typename T>void function(T t) // 非引用,形参会对实参进行拷贝。{ // 对于函数内部来说,t有自己的名称,也可以获取它的存储地址,因此它永远都是左值。 otherdef(t);}传递给 otherdef() 函数的参数 t 永远都是原创 2021-08-31 11:25:07 · 1059 阅读 · 0 评论 -
17、C++11 move()函数:将左值强制转换为右值
移动构造函数的调用时机是:用同类的右值对象初始化新对象。当前类的左值对象(有名称,能获取其存储地址的实例对象)初始化同类对象时,使用move() 函数可以调用移动构造函数。move( )功能:将某个左值强制转化为右值。//函数会返回 arg 对象的右值形式move(arg) //arg 表示指定的左值对象#include <iostream>using namespace std;class movedemo{public: movedemo():num(new in原创 2021-08-31 11:24:11 · 325 阅读 · 0 评论 -
16、C++11移动构造函数
本节主要讲解移动语义的含义以及实现它的方式。C++ 98/03 标准中,想用其他对象初始化一个同类的新对象,只能借助拷贝构造函数。(原理是为新对象复制一份和其他对象一模一样的数据)#include<iostream>using namespace std;class Demo{public: Demo():num(new int(10)) { cout<<"construct"<<endl; } //拷贝构造函数原创 2021-08-31 11:23:03 · 443 阅读 · 0 评论 -
15、C++11右值引用
右值引用只不过是一种新的 C++ 语法,真正理解起来有难度的是基于右值引用引申出的 2 种 C++ 编程技巧,分别为移动语义和完美转发。本节先讲什么是右值引用,以及它的基本用法。C++左值和右值左值(lvalue):“loactor value”,可意为存储在内存中、有明确存储地址(可寻址)的数据。右值(rvalue):”read value“,指的是那些可以提供数据值的数据(不一定可以寻址,例如存储于寄存器中的数据)。判断某个表达式是左值还是右值,最常用的有以下 2 种方法(只使用于大部分场原创 2021-08-31 11:21:57 · 151 阅读 · 0 评论 -
13、C++11 constexpr:验证是否为常量表达式
所谓常量表达式,指的就是由多个(≥1)常量 组成的表达式。如果表达式中的成员都是常量,那么该表达式就是一个常量表达式。常量表达式一旦确定,其值将无法修改。// 1)int url[10];//正确// 2)int url[6 + 4];//正确// 3)int length = 6;int url[length];//错误,length是变量非常量表达式只能在程序**运行阶段**计算出结果;而常量表达式的计算往往发生在程序的**编译阶段**。 常量表达式的计算往往发生在程原创 2021-08-31 11:20:34 · 286 阅读 · 0 评论 -
12、C++11 for循环使用注意事项
当使用 for 循环遍历某个序列时,无论该序列是普通数组、容器还是用{ }大括号包裹的初始化列表,遍历序列的变量都表示的是当前序列中的各个元素。并不是迭代器。基于范围的 for 循环可以遍历普通数组、string字符串、容器以及初始化列表。除此之外,for 循环冒号后还可以放置返回 string 字符串以及容器对象的函数。但是不能遍历用指针表示的数组。当基于范围的 for 循环遍历的是某函数返回的 string 对象或者容器时,整个遍历过程中,函数只会执行一次。- ```c++.原创 2021-08-31 11:16:46 · 819 阅读 · 0 评论 -
C++11:(十)C++11非受限联合体(union)
在 C/C++ 中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的 C++ 为了和C语言保持兼容,对联合体的 数据成员的类型 进行了很大程度的限制,联合体成员必须是POD类型,因此 C++11 取消了这些限制。1、C++11 允许非 POD 类型POD 类型一般具有以下几种特征(包括 class、union 和 struct等):没有用户自定义的构造函数、析构函数、拷贝构造函数和移动构造函数。不能原创 2021-06-18 10:44:25 · 692 阅读 · 0 评论 -
C++11:(九)C++11 lambda匿名函数
lambda是匿名函数,简单地理解就是没有名称的函数。lambda匿名函数的定义定义一个 lambda 匿名函数很简单,可以套用如下的语法格式:[外部变量访问方式说明符] (参数) mutablle noexcept/throw() -> 返回值类型{ 函数体;}其中各部分的含义分别为:① [外部变量方位方式说明符][]方括号用于向编译器表明当前是一个 lambda 表达式,其不能被省略。在方括号内部,可以注明当前 lambda 函数的函数体中可以使用哪些==“外原创 2021-06-18 10:42:51 · 234 阅读 · 0 评论 -
C++11:(八)C++11列表初始化(统一了初始化方式)
int i_arr[3] { 1, 2, 3 }; //普通数组int i_arr[3]={ 1, 2, 3 }; // {}前面的等于号对初始化行为没有影响。(算直接初始化,不算拷贝初始化)//new操作也可以用int *a = new int{1,2,3};//函数返回值也可以用return {1,2,3};...原创 2021-06-18 10:39:57 · 178 阅读 · 0 评论 -
C++11:(七)C++11支持函数模板的默认模板参数
C++98/03:类模板可以有默认的模板参数template<typename T,typename U = int, U N = 0>struct Foo{ //... };但不支持函数的默认模板参数:template <typename T = int> // error in C++98/03: default template argumentsvoid func(){ // ...}C++11:上面的func函数可以编译通过。原创 2021-06-18 10:38:55 · 308 阅读 · 0 评论 -
C++11:(六)C++11使用using定义别名(替代typedef)
C++98/03:在 C++ 中可以通过 typedef 重定义一个类型:typedef unsigned int uint_t;但是无法重定义一个模板。所以不得不这么写:template<typename Val>struct str_map{ typedef map<string, Val> type;}//使用str_map<int>::type map1; //必须加个str_map<int>外敷类C++11:using原创 2021-06-18 10:37:13 · 368 阅读 · 0 评论 -
C++11:(五)C++11对模板实例化中连续右尖括号>>的改进
C++98/03:以前模板实例化的连续两个右尖括号(>>)会被编译器解释成 右移操作符,而不是 模板参数表的结束。template<typename T>struct Foo{ typedef T type;};template <typename T>class A{ // ...};int main(){ Foo<A<int>>::type xx; //编译出错,要写成 Foo<原创 2021-06-18 10:36:19 · 583 阅读 · 0 评论 -
C++11:(四)C++返回值类型后置
C++98/03:在泛型编程中,可能需要通过参数的运算来得到返回值的类型。template<typename R, typename T, typename U>R add(T t, U u){ return t+u;}int a = 1;float b = 2.0;auto c = add<decltype(a+b)>(a,b); //我们想获得返回值类型,得通过decltype显式推导出返回值类型,比较麻烦。C++的返回值是前置语法,在返回值定义原创 2021-06-18 10:34:51 · 566 阅读 · 0 评论 -
C++11:(三)C++ auto和decltype的区别
语法格式不同:auto varname = value; //auto的语法格式decltype(exp) varname [= value]; //decltype的语法格式对cv限定符的处理:const 关键字用来表示数据是只读的,也就是不能被修改;volatile 和 const 是相反的,它用来表示数据是可变的、易变的,目的是不让 CPU 将数据缓存到寄存器,而是从原始的内存中读取。推导变量类型时,decltype 会 保留 cv 限定符,而 auto 有 可能会去掉原创 2021-06-18 10:33:30 · 166 阅读 · 0 评论 -
C++11:(二)decltype类型推导
decltype的功能和auto相同,都用来在编译时期进行自动类型推导。两者区别如下:auto varname = value;decltype(exp) varname = value;auto根据=右边的初始值value推导出变量的类型。decltype根据exp表达式推导出变量类型,跟=右边的初始值value没有关系。举例:decltype(10.8) x = 5.5; //x 被推导成了 doubledecltype(x+100) y; //y 被推导成了 double原创 2021-06-18 10:32:34 · 187 阅读 · 0 评论 -
C++11:(一)auto类型推导
C++11顺应大趋势,让编译器支持自动类型推导。C++11 使用 auto 关键字来支持自动类型推导。auto name = value;auto 仅仅是一个占位符,在编译器期间它会被真正的类型所替代。使用 auto 类型推导的变量必须初始化。auto的高级用法:auto 除了可以独立使用,还可以和某些具体类型混合使用,这样 auto 表示的就是“半个”类型,而不是完整的类型。int x = 0;auto *p1 = &x; //p1 为 int *,auto 推导为 in原创 2021-06-18 10:31:27 · 336 阅读 · 0 评论