首页 > 编程语言 >c++11(3): 类型推导与智能指针

c++11(3): 类型推导与智能指针

时间:2024-07-24 21:40:29浏览次数:18  
标签:11 decltype 推导 auto c++ MyEnum 类型 ptr

41.两个右尖括号>在模板中不再被判定为右移, 需要右移需要加圆括号()

42.auto类型推导, 编译时推导

int a = 1;
auto b = a;    //b的类型为int

1): auto不能作函数形参类型
2): auto不能对结构体中的肥静态成员进行推导
3): auto不能声明数组
4): auto不能在实例化模板时作为模板参数

43.decltype类型推导, 编译时推导

int a = 1;
decltype(a) b;                         //b的类型为Int
uding size_t = decltype(sizeof(0));    //与using/typydef合用

1): decltype不能推导重载的函数
2): decltype将亡值推导为右值引用
3): decltype将左值推导为引用, 如 三元运算符, 带圆括号的左值, ++i, arr[0], *ptr
4): 以上都不是,则推导为本类型

44.追踪返回类型, 编译时推导

template<typename T1, typename T@>
auto Func(const T1& a, const T@& b) -> decltype(a + b){
   return a + b;
}

45.基于范围的for循环

vector<int> MyVector= {1, 2, 3, 4};
for(auto p : MyVector)
{
   cout << p << endl;    //p是解引用后的对象, 无需再*p解引用
}

条件: 迭代对象要实现++==等操作符,普通已知长度的数组(未知长度的不行), 类要有begin函数和end函数

51.强类型枚举

enum class MyEnum: char{ e1, e2, e3};    //定义一个以char为底层实现的强类型枚举
MyEnum a = e1;             //错误
MyEnum b = MyEnum::e1;     //通过
MyEnum c = 2;              //错误

Myenum d = MyEnum::e2;
if(d > 1){}                //错误
if((char)d > 1){}          //通过

52.智能指针

unique_ptr<int> up1(new int(11));       //无法被复制
unique_ptr<int> up2 = up1;              //编译错误, 指针唯一
unique_ptr<int> up3 = move(up1);        //up1的控制权转移给up3
up3.reset();                            //显式释放
up1.reset();                            //不会出错

unique_ptr只允许唯一指针指向内存
shared_ptr则允许共享同一块内存,它在实现上采用了引用计数,只有在计数归零时才真正释放内存
weak_ptr不拥有控制权,其成员函数lock()返回其指向内存的一个shared_ptr对象,若其内存无效则返回nullptr


参考资料: <<深入理解C++11: C++11新特性解析与应用>>

标签:11,decltype,推导,auto,c++,MyEnum,类型,ptr
From: https://www.cnblogs.com/redraincontrol/p/18321776

相关文章

  • C++ 插入排序
    【预告】        这几次将讲讲排序(从简单开始),废话不多说,直接切入正题【关于插入排序】【定义】    定义:插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入【时间复杂度】 ......
  • c++(4) pangolin可视化多线程
     CMakeLists.txtcmake_minimum_required(VERSION2.8)project(3DTo3D)set(CMAKE_CXX_STANDARD11)set(CMAKE_BUILD_TYPERelease)find_package(PangolinREQUIRED)#可视化工具库include_directories(${Pangolin_INCLUDE_DIRS})#OpenCV#find_package(OpenCV......
  • 在C++里如何释放内存的时候不调用对象的析构函数?
    今天,看到一个有趣的面试题,问题是:在C++里如何释放内存的时候不调用对象的析构函数?之所以有趣,是因为这个问题违反了C++中资源管理的RAII(资源获取即初始化),它要求资源的释放应当和对象的生命周期紧密相关。在正常情况下,当对象离开其作用域时,它的析构函数被调用,以释放它所管理的......
  • C++this指针--指针的介绍用法以及相关注意事项
    什么是this指针this指针是在C++中用来指向当前对象的特殊指针。它是每个非静态成员函数的隐式参数,指向调用该函数的对象。在C++类的成员函数中,除了静态成员函数外,每个成员函数都有一个隐含的this指针,它指向调用该函数的对象。这个指针可以让成员函数访问调用它的对象......
  • 为什么C++模板只能在头文件中实现
    为什么C++模板只能在头文件中实现答案:模板的实现并非必须在头文件中。bug再现:当我尝试将模板的定义和实现分别保存在头文件(Foo.h)和实现文件(Foo.cpp)中时,程序在链接时报错:错误 LNK2019 无法解析的外部符号"public:void__cdeclFoo<int>::doSomething(int)"(?doSome......
  • Python ctypes OSError:[WinError 1114]动态链接库(DLL)初始化例程失败
    我试图使用Python中的ctypes库调用C++函数:test.pyfromctypesimport*fromrandomimportrandinttester=cdll.LoadLibrary('./test.dll')print(tester.test(randint(1,100)))test.cpp#include<vector>intcppTest(intnum){std:......
  • C++ opencv putText
    C++opencv putText  #include<opencv2/opencv.hpp>intmain(){//创建一个空白图像cv::Matimg(400,400,CV_8UC3,cv::Scalar(255,255,255));//设置文本内容std::stringtext="Hello,OpenCV!";//设置文本起始坐标(左下角坐标)......
  • [CEOI2011] Matching 题解
    前言题目链接:洛谷。在上一题之后,模拟赛又放了一道KMP重定义相等的问题,但是寄了,故再记之。题意简述现在给出\(1\simn\)的排列\(p\)和序列\(h_1,h_2,\cdots,h_m\)​​,请你求出哪些\(h\)的子串符合排列\(p\)。串\(a_i\)符合一个排列被定义为其从小到大排序后得......
  • c++ 《小技巧》
    使用swap回收多余空间#include<vector>#include<iostream>usingnamespacestd;intmain(){vector<int>v;for(inti=0;i<100000;++i){v.push_back(i);}cout<<v.size()<<endl;//100000cout<......
  • C/C++ 建议编译选项
    本文介绍一些OI选手可能用到的编译选项。警告选项在程序设计中,我们可能不小心写出一些不合常理的代码语句。大部分情况下,这会使程序行为脱离我们的本意。使编译器发出警告可以在一定程度下规避这种情况。-Wall启动常见的警告选项,包括但不限于:未使用的变量、函数或标签未......