首页 > 编程语言 >C++11(2): 通用

C++11(2): 通用

时间:2024-07-21 22:29:16浏览次数:17  
标签:11 1234 通用 int C++ char func my ptr

31.继承构造函数

struct B: A{
   using A::A;
};

32.委派构造函数

class A{
public:
	A()	    : A(1234){}     //先调用A(int)
	A(int n1)   : A(n1, 'C'){}  //先调用A(int, char)
	A(char c1)  : A(2, c1){}    //先调用A(int, char)
private:
	A(int n2, char c2)  : my_int(n2), my_char(c2){}
	int my_int;
	char my_char;
}

应用于模版

class A{
public:
	A(vector<int> &v)  : A(v.begin(), v.end());
	A(deque<short> &d) : A(d.begin(), d.end());
private:
	template<class T> A(A n1, T n2)	: my_list(n1, n2) {}
	list(int) my_list;
}

捕捉异常

class A{
public:
	A()
	try : A(1234) {init();}
	catch(...)    {error();}
	A(int n)      {throw 0;}
	//构造时执行error(), 而不执行init()
}

33.右值引用

  • 331.指针成员拷贝构造
class A{
public:
	A()        : my_ptr(new int(1234)) {}
	A(A &copy) : my_ptr(new int(*copy.my_ptr)) {}//新申请一块内存,避免重复析构同一块内存
	~A() {delete my_ptr;}
	int *my_ptr;
}
  • 332.移动语义
class A{
public:
	A()	          : my_ptr(new int(1234)) {}
	A(const A& copy)  : my_ptr(*copy.my_ptr) {}
	A(A&& move)       : my_ptr(move.my_ptr) {move.my_ptr = nullptr;}
	~A() {delete my_ptr;}

	int* my_ptr;
}
A GetTmp() {
	A tmp;
	return tmp;
}
int main(){
	A one = GetTmp();
}

1.执行GetTmp(),创建A1并初始化后返回,
2.创建并初始化A2,即A2(A1), 执行的是move而不是copy,它将A1的指针赋值给A2,并将A1的指针清掉,
3.析构A1,由于指针清掉了,所以初始化时的内存没有被释放
4.创建并初始化one,即one(A2),重复第2步,第3步
5.析构one,此时内存才真正被释放,它是A1初始化时申请的

  • 333.有名字的是左值, 没名字的是右值, 左值*p=1234, 右值p=1234
  • 334.在<utility>中提供了std::move函数,它将左值强制转化为右值引用
  • 335.swap(T a, T b)函数使用移动语义进行交换,
    移动构造函数不应该写抛出异常,
    编译选项-fno-elide-constructors关闭优化以使用移动/拷贝语义,否则变量直接替换成右值进行编译

36.完美转发
引用折叠规则:

typedef int T;
typedef T& TR;//or typedef T&& TR
TR a;//or TR& a , TR&& a

TR定义为T&时,a的类型都是A&
TR定义为T&&时,TR/TR&&的类型为A&&,TR&的类型为A&

template <typename T, typename U>
void PF(T&& t, U& func){
	func(std::forward<T>(t));
}

forward()move()功能相同,完美转发能够把引用类型准确传给调用函数

35.显示转换操作符explicit

class A{}
class B(){
public:
   explicit operator A() const {return A();}
}
void func(A a){}
void main(){
   B b;
   A a1(b);//通过
   A a2 = b;//错误
   A a3 = static_cast<A>(b);//显式转换,通过
   func(b);//错误
}

351.列表初始化, 头文件<initializer_list>,声明一个以initialize_list<T>模版类为参数的构造函数,就能够使自定义类使用列表初始化

void func(initializer_list<int> numbers){}

int main(){
   func({1, 2, 3});
   func({});
}

352.使用花括号初始化可以防止类型收窄

const int x = 1234;
char a = x;//通过
char b = {x};//错误
char* c = new char(1234);//通过
char* d = new char{1234};//错误

36.POD类型
37.联合体
38.用户自定义字面量

39.内联名字空间

inline namespace space1{
class A{};
}

namespace space2{
A a;//A in space1
class A{};
A b;//A in space2;
}

310.模版的别名

template<typename T> using NewName = std::map<T, char*>;
NewName<int> a;//等同于std::map<int, char*> a;

311.SFINAE规则:特殊场景使用特殊模板版本,另外则是通用模板版本

struct A{ typedef int my_int;
};

template <typename T>
void func(typename T::my_int) {}//#1

template <typename T>
void func(T) {}        //#2

int main(){
   func<A>(1234);//调用#1,因为存在A::my_int
   func<int>(1234);//调用#2,因为不存在int::my_int
}

标签:11,1234,通用,int,C++,char,func,my,ptr
From: https://www.cnblogs.com/redraincontrol/p/18315000

相关文章

  • c++ 引用和指针
      c++引用和指针在C++中,引用和指针是两个非常重要的概念,它们有一些相似之处也有一些不同之处。相似之处:引用和指针都可以指向一个对象。引用一旦被初始化指向一个对象后,就不能再指向其他对象,而指针可以在任何时候指向其他对象。不同之处:引用在......
  • 快速完成VsCode C/C++开发环境配置
    前言本人在配置VsCodeC++开发环境时,查看了很多的博客,内容参差不齐,尤其是关于json文件的配置,绕的人头很晕,最终还是通过阅读官方文档,结合部分博客的指引,完成了环境的配置,在此记录本人的配置过程,希望能帮助到大家。事先声明,本文的内容大量引自VsCode官方的文章:https://code.visual......
  • OpenCV 遍历Mat,像素操作,使用TrackBar 调整图像的亮度和对比度 C++实现
    文章目录1.使用C++遍历Mat,完成颜色反转1.1常规遍历方式1.2迭代器遍历方式1.3指针访问方式遍历(最快)1.4不同遍历方式的时间对比2.图像像素操作,提高图像的亮度3.TrackBar进度条操作3.1使用TrackBar调整图像的亮度3.2使用TrackBar调整图像的对比度1.使用C++遍历M......
  • C++吃豆人~
    #include<cstdio>#include<iostream>#include<ctime>#include<conio.h>#include<windows.h>#include<cstdlib>#include<cstring>usingnamespacestd;constintn=809;structPoint{intx,y;};intdali;intfx[......
  • C++小游戏
    #include<iostream>usingnamespacestd;doubleshengmingli=2000;//定义主角初始生命力intgongjili=150;//定义主角初始攻击力intfangyuli=200;//定义主角初始防御力intmoney=20;//定义主角初始金钱数量boolguoguan;//定义是否通关判定voidwuqidian();//定义武器......
  • c++的一些科技
    pd_ds需要#include<bits/extc++.h>usingnamespace__gnu_pbds;usingnamespace__gnu_cxx__gnu_pbds::priority_queue注意可能会与std::priority_queue冲突。定义方法:__gnu_pbds::priority_queue<T,Compare,Tag,Allocator>T:类型名Compare:严格弱化的比较类型......
  • 移动硬盘在苹果电脑上使用后在windows中无法读取 Win和Mac的硬盘怎么通用
    在日益普及的跨平台工作环境中,苹果电脑与WindowsPC之间的数据交换成为日常需求。然而,用户常面临一个困扰:为何苹果电脑的硬盘能在macOS下流畅运行,却在Windows系统中变得“水土不服”?这一问题核心在于硬盘格式的不兼容性,尤其是苹果采用的HFS+与Windows主流的NTFS之间的屏障。一......
  • 【嵌入式DIY实例-ESP8266篇】-LCD ST7789显示DHT11传感器数据
    LCDST7789显示DHT11传感器数据文章目录LCDST7789显示DHT11传感器数据1、硬件准备与接线2、代码实现本文介绍如何将ESP8266NodeMCU板(ESP-12E)与DHT11(RHT01)数字湿度和温度传感器连接。NodeMCU从DHT11传感器读取温度和湿度值,并在ST7789TFT......
  • 时间序列分析方法汇总对比及优缺点和适用情况(下)-- 11. 卡尔曼滤波 12. 广义自回归条件
    目录11.卡尔曼滤波(KalmanFilter)12.广义自回归条件异方差模型(GARCH)13.贝叶斯结构时间序列模型(BayesianStructuralTimeSeries,BSTS)14.动态因子模型(DynamicFactorModel,DFM)15.隐马尔科夫模型(HiddenMarkovModel,HMM)16.分段线性回归(PiecewiseLinearRegress......
  • C++合作开发项目:美术馆1.0
    快乐星空MakerZINCFFO合作入口:CM工作室效果图:代码:(还有几个音乐!)main.cpp#include<bits/stdc++.h>#include<windows.h>#include<conio.h>#include<time.h>#include"music.h"usingnamespacestd;structCITYBLOCK{ stringi......