#include <QCoreApplication>
#include <QDebug>
using namespace std;
/************************************
*1.auto的应用:
*描述:自动推导变量类型(只能用于类的静态成员)
*************************************/
class A
{
public:
static int getVal()
{
return 10;
}
};
class B
{
public:
static const char* getVal()
{
return "hello";
}
};
template <typename T>
auto func()
{
auto val = T::getVal();
return val;
}
void useAuto()
{
/*1.1 在迭代器中使用*/
QVector<int> v = {2, 4, 6, 8};
//不使用auto
for(QVector<int>::iterator it = v.begin(); it != v.end(); it++)
{
v.push_back(*it);
}
qDebug() << "not use auto v[1]:" << v[1];
//使用auto
for(auto it = v.begin(); it != v.end(); it++)
{
v.push_back(*it);
}
qDebug() << "use auto v[1]:" << v[1];
/*1.2 在泛型编程中使用*/
qDebug() << "A Val: " << func<A>();
qDebug() << "B Val: " << func<B>();
}
/************************************
*2.decltype的应用:
* 描述:自动推导变量类型(能用于类的非静态成员)
*************************************/
template <typename T>
class C
{
public:
void setVal(T& container)
{
m_it = container.begin();
}
decltype(T().begin()) getVal()
{
return m_it;
}
private:
decltype(T().begin()) m_it; //使用typename T::iterator m_it,并不能包括所有的迭代器类型,当 T 是一个 const 容器时,会报错
};
void useDecltype()
{
/*2.1在泛型编程中使用*/
QVector<int> v = {2, 4, 6, 8};
C<QVector<int>> obj;
obj.setVal(v);
qDebug() << "decltype val:" << *(obj.getVal());
}
/************************************
*3.返回值后置运用于泛型编程:
* 描述:将 decltype 和 auto 结合起来完成返回值类型的推导
*************************************/
#include <iostream>
using namespace std;
double foo(int a)
{
return (double)a + 0.1;
}
int foo(double b)
{
return (int)b;
}
template <class T>
auto Forward(T t) -> decltype(foo(t))
{
return foo(t);
}
void useForward()
{
qDebug() << "Forward(2):" << Forward(2);
qDebug() << "Forward(0.5):" << Forward(0.5);
}
/************************************
*4.using的应用:
* 描述:typedef无法重定义一个模板,using 的别名语法覆盖了typedef的全部功能
*************************************/
//定义变量类型
using uint_t = unsigned int;
//定义模板
template <typename Val>
using str_map_t = std::map<std::string, Val>;
template <typename T>
using func_t = void (*)(T, T);
func_t<int> xx_2;
/************************************
*5.类模板可以有默认的模板参数:
* 描述:typedef无法重定义一个模板,using 的别名语法覆盖了typedef的全部功能
*************************************/
template <typename R = int, typename U>
R func(U val)
{
return val;
}
void useClassWithDefaultPara()
{
func(97); // R=int, U=int 编译器可以根据实参 97 自行推导出模板参数 U 的类型为 int,并且根据返回值 val=97 推导出 R 的类型也为 int
func<char>(97); // R=char, U=int 手动指定了模板参数 R 的类型为 char(默认模板参数将无效),并通过实参 97 推导出了 U = int
func<double, int>(97); // R=double, U=int 手动指定的 R 和 U 的类型值,因此无需编译器自行推导
}
/************************************
*6.tuple元组的应用:
* 描述:实例化的对象可以存储任意数量、任意类型的数据
*************************************/
#include <tuple>
using std::tuple;
//给自定义结构体、类实现比较操作符时,
//下述代码会优先按照第一个字段n进行比较,相等的话进而判断第二个字段,最后到第三个字段,直到能够获得比较的结果为止。
struct S {
int n;
std::string s;
float d;
bool operator<(const S& rhs) const {
return std::tie(n, s, d) < std::tie(rhs.n, rhs.s, rhs.d);
}
};
void useTuple()
{
//创建一个 tuple 对象存储 10 和 'x'
std::tuple<int, char> mytuple(10, 'x');
//计算 mytuple 存储元素的个数
int size = std::tuple_size<decltype(mytuple)>::value;
//输出 mytuple 中存储的元素
qDebug() << "size:" << size << std::get<0>(mytuple) << " " << std::get<1>(mytuple);
auto bar = std::make_tuple("test", 3.1, 14);
//拆解 bar 对象,分别赋值给 mystr、mydou、myint
const char* mystr = nullptr;
double mydou;
int myint;
//使用 tie() 时,如果不想接受某个元素的值,实参可以用 std::ignore 代替
std::tie(mystr, mydou, myint) = bar;
}
/************************************
*7.统一了初始化方式:
* 描述:实例化的对象可以存储任意数量、任意类型的数据
*************************************/
class Foo
{
public:
Foo(int) {}
private:
Foo(const Foo &);
};
void useInitList()
{
Foo a3 = { 123 }; //列表初始化方式,使用了等于号,但私有的拷贝构造并不会影响到它
Foo a4 { 123 };// C++11特有
}
/************************************
*8.lambda匿名函数的应用:
* 描述:所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式
* [] 空方括号表示当前 lambda 匿名函数中不导入任何外部变量
* [=] 只有一个 = 等号,表示以值传递的方式导入所有外部变量
* [&] 只有一个 & 符号,表示以引用传递的方式导入所有外部变量
* [val1,val2,...] 表示以值传递的方式导入 val1、val2 等指定的外部变量,同时多个变量之间没有先后次序
* [&val1,&val2,...] 表示以引用传递的方式导入 val1、val2等指定的外部变量,多个变量之间没有前后次序
* [val,&val2,...] 以上 2 种方式还可以混合使用,变量之间没有前后次序
* [=,&val1,...] 表示除 val1 以引用传递的方式导入外,其它外部变量都以值传递的方式导入
* [this] 表示以值传递的方式导入当前的 this 指针
*************************************/
int all_num = 0;
void useLambda()
{
/*对a 数组中的元素进行排序*/
int num[4] = {4, 2, 3, 1};
sort(num, num+4, [=](int x, int y) -> bool{ return x < y; });
for(int n : num){
qDebug() << "useLambda:" << n << " ";
}
//值传递
int num_1 = 1;
int num_2 = 2;
int num_3 = 3;
qDebug() << "lambda1:\n";
auto lambda1 = [=]{
//全局变量可以访问甚至修改
all_num = 10;
//函数体内只能使用外部变量,而无法对它们进行修改
qDebug() << num_1 << " "
<< num_2 << " "
<< num_3;
};
lambda1();
//借助 mutable 关键字, 可以在lambda2 匿名函数的基础上修改外部变量的值
auto lambda2 = [=]() mutable{
num_1 = 10;
num_2 = 20;
num_3 = 30;
//函数体内只能使用外部变量,而无法对它们进行修改
qDebug() << num_1 << " "
<< num_2 << " "
<< num_3;
};
lambda2();
//引用传递
auto lambda3 = [&]{
all_num = 100;
num_1 = 10;
num_2 = 20;
num_3 = 30;
qDebug() << num_1 << " "
<< num_2 << " "
<< num_3;
};
lambda3();
}
/************************************
*9.非受限联合体(union):
* 描述:实例化的对象可以存储任意数量、任意类型的数据
*************************************/
//C++11 删除了联合体不允许拥�
没有合适的资源?快使用搜索试试~ 我知道了~
qt下对C++11的使用案例
共12个文件
pdb:2个
ilk:1个
exe:1个
需积分: 0 1 下载量 198 浏览量
2022-11-26
17:09:39
上传
评论
收藏 680KB RAR 举报
温馨提示
C++11 是第二个真正意义上的 C++ 标准,也是 C++ 的一次重大升级。C++11 增加了很多现代编程语言的特性,比如自动类型推导、智能指针、lambda 表达式等,这使得 C++ 看起来又酷又潮,一点也不输 Java 和 C#。
资源推荐
资源详情
资源评论
收起资源包目录
MyCPlusPlus11.rar (12个子文件)
MyCPlusPlus11
Makefile.Debug 21KB
MyCPlusPlus11.pro.user 24KB
MyCPlusPlus11.pro 904B
.qmake.stash 1KB
Makefile.Release 21KB
main.cpp 14KB
debug
main.obj 342KB
MyCPlusPlus11.exe 95KB
MyCPlusPlus11.ilk 503KB
MyCPlusPlus11.pdb 1.35MB
MyCPlusPlus11.vc.pdb 1004KB
Makefile 29KB
release
共 12 条
- 1
资源评论
浅笑一斤
- 粉丝: 1w+
- 资源: 61
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功