C++11_新语法
版权声明:本文为博主原创文章,未经博主允许不得转载。
本节主要介绍C++的新特性,对于C++的基础语法不再讲解.由于编译器的不同.在某些地方可能有些差异,但是无太大影响.
讲解本节知识之前先确认你的C++支持度[__cplusplus]
#include <iostream>
int main(int argc, const char * argv[]) {
std::cout<<__cplusplus<<std::endl;
return ;
}
会看到这样,说明支持C++11
主要介绍如下:
新特性 1 模板套模板
新特性 2 空指针
新特性 3 新auto
新特性 4 新初始化
新特性 5 initializer_list<>
新特性 6 新for循环
新特性 7 =default与=delete
新特性 8 Alias Template(template typedef)
新特性 9 Type Alias
新特性 10 noexcept,override,final关键字
新特性 11 decltype
新特性 1 模板套模板
在旧版本的C++中模板套用模板可能要加空格,像这样
vector<list<int> > //旧板中需要加空格
vector<list<int>> //新模板中不需要加
新特性 2 空指针
新规定中nullptr可以代替0和NULL(0指针)
void f(int) { cout << "f(int) be called" << endl; }
void f(void*) { cout << "f(void*) be called" << endl; } f(); //calls f(int)
f(NULL); //calls f(int) if NULL is 0
f(nullptr); //calls f(void*)
新特性 3 新auto
1.自动识别类型(编译器的实参推倒)
auto i = ; //自动识别 i为 int
auto d = func(); //自动识别d为函数返回值
2.如果初始化表达式是引用,则去除引用语义.如果auto关键字带上&号,则不去除const语意
int a = ;
int &b = a; auto c = b;//c的类型为int而非int&(去除引用)
auto &d = b;//此时c的类型才为int&
3.如果初始化表达式为const或volatile,则除去const/volatile语义.
const int ci=i,&cr=i;
auto a=ci; //a为int(忽略顶层const)
auto b=cr; //b为int(忽略顶层const,cr是引用)
auto c=&i; //c为int *
auto d=&ci; //d是pointer to const int(&ci为底层const
4.初始化表达式为数组时,auto关键字推导类型为指针.
int main()
{
int array[]{ , , };
auto array_b = array;
std::cout << typeid(array_b).name() << std::endl; return ;
}
输出结果Pi(int*)
注意事项
1.auto声明的变量必须要初始化,否则编译器不能判断变量的类型.
2.auto不能被声明为返回值(但可以与decltype结合使用做返回值的站位下文有),auto不能作为形参,auto不能被修饰为模板参数
新特性 4 新初始化
C++11之前的初始化
Rect r1 = {,,,};//大括号
Rect r2(,,,) ;//小括号
int arry[] = {,,};//[]
C++11之后一切的初始化都可以用 {} 代替
int value[] {,,};
vector<int> v {,,};
complex<double> c {,,};
新初始化的优点
int i; //初始值不知道
int i{}; //初始值是0
int * p;//初始值不知道
int * p{}; //初始值是nullptr //{} 不允许窄化转换
int x1(5.3);它会被初始化为5
int x2{5.3};它会报错
新特性 5 initializer_list<>
一包东西,但是类型得是相同的,实现C++源码的重要语法,知道怎么用就可以.传递过程不需要我们担心,编译器会自动处理
int main(int argc, const char * argv[]) {
std::initializer_list<int> t1 {,,,};
std::cout<<max(t1)<<std::endl;//新的max() 传参采用 initializer_list 不在受限于参数个数
return ;
}
输出结果
新特性 6 新for循环
新的for循环采用for(del声明 : coll容器),与旧for()不冲突
#include <iostream>
#include <vector> int main()
{
std::vector<int> v1 {,,,,};
for (auto i: v1) { //此时的auto变量i是 pass by value 不能改变容器中的成员如果想改变其成员,需要pass by reference
std::cout<< i <<std::endl;
}
return ;
}
输出结果
pass by reference写法
int main()
{
std::vector<int> v1 {,,,,};
for (auto& i: v1) {
i *= ;//此时传递的是引用,可以改变vector中的成员
}
return ;
}
新特性 7 =default与=delete
class Zoo//delete删掉编译器给的 default要编译器给的即使定义了也要让编译器给出
{
public:
Zoo(int i1,int i2) : d1(i1),d2(i2) {}
Zoo(const Zoo&) = delete;//拷贝构造函数
Zoo(Zoo&&) = default;//右值引用 Move()
Zoo & operator = (const Zoo&) = default;
Zoo operator = (const Zoo&&) = delete;
virtual ~Zoo(); private:
int d1,d2;
};
a. =default用于普通函数无意义(构造函数可以共存)
b. =delete用于普通函数可以取代于virtual function = 0
c. BIG-Three 默认构造函数 默认拷贝构造函数 默认析够函数 他们三个函数的作用是给编译器防止一个幕后藏身的地方 如父类的构造函数调用过程.
类中有指针成员,需要重写BIG-Three没有则不用
d. 类中讲拷贝构造与构造函数声明成private 如果你的类继承自noncopyable 那么你的类也不能被拷贝
简单实现一下noncopyable
class noncopyable
{
protected:
noncopyable (void) {}
~noncopyable (void) { } private:
noncopyable (const noncopyable&);
const noncopyable& operator= (const noncopyable&);
};
新特性 8 Alias Template(template typedef)
功能相当于取别名
template<typename T>
using vec = std::vector<T,std::allocator<T>>;
int main()
{
vec<int> v1 {,,,};
for(auto i: v1)
{
std::cout<< i <<std::endl;
}
return ;
}
新特性 9 Type Alias
类似于typedef,重新命名
typedef void (*func) (int, int);
using func = void(*) (int,int);//这两个函数意义相同 但是感觉using更容易让人理解
template <typename T>
struct Container {
using value_type = T; // 相同于 typedef T value_type;
};
新特性 10 noexcept,override,final关键字
//noexcept 保证函数不会丢出异常
void foo() noexcept; //== void foo() noexcept(true) 括号内处条件 在完成什么条件下不会抛出异常
void swap(string & x ,string & y) noexcept(noexcept(x.swap(y)))
{
x.swap(y);
} class MyString
{
private:
char * _data;
size_t _len; public:
//move constructor move语法必须用noexcept 尤其在vecotr上 不然不让编译 (voctor 是按传进参数个数成长 很容易在申请内存上出错) move意义上当于 by reference
MyString(MyString&& str)noexcept : _data(str._data), _len(str._len){}
MyString& operator= (MyString&&str) noexcept {return *this;} };
//override 运用在虚函数上 自动识别是否是虚函数
struct Base
{
virtual void vfunc(float){}
};
struct Drivedl:Base
{
virtual void vfunc(float) override {}//自动识别该函数是否是基类中的虚函数 如果不是报错
};
//final 继承树下的最后一个 (没有人可以在继承它)
struct Base1 final{};//1.作用于类,该类不可被继承
struct Base2
{
virtual void f() final;//2.作用于函数 该虚函数不可以被重写
};
新特性 11 decltype
相当于type of (识别类型),然编译器去识别type,不能识别重载的函数
1.基本使用方法
int main() {
auto num = ; //num 是int类型
decltype(num) num2 = num; //num2 也是int类型
return ;
}
2..声明返回值类型
//判断两个参数相加的返回值类型
template<typename T1,typename T2>
auto add(T1 x, T2 y) -> decltype(x+y);
3. 做参数
class Person
{
public:
Person(){};
~Person(){}; public:
int m_age = ;
std::string lastname = "";
std::string firstname = ""; }; auto cmp = [](const Person& p1,const Person& p2)//lambda
{
return p1.lastname<p2.lastname||
(p1.lastname == p2.lastname && p1.firstname< p2.firstname);
}; int main()
{
std::set<Person,decltype(cmp)> coll(cmp);
Person * p1 = new Person;
p1->lastname = "a"; Person * p2 = new Person;
p2->lastname = "b"; Person * p3 = new Person;
p3->lastname = "c";
coll.insert(*p3);
coll.insert(*p1);
coll.insert(*p2); for (auto i: coll) {
std::cout<<i.lastname<<std::endl;
} return ;
}
输出结果
参照<<侯捷 C++新标准 C++11>>
如有不对请指正.
C++11_新语法的更多相关文章
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- qt5中信号和槽的新语法
qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...
- Qt 5.0+ 中 connect 新语法与重载函数不兼容问题的解决方法,以及个人看法
Qt 5.0+ 版本提供了 connect 的新语法,相比之前的语法新语法可以提供编译期检查,使用也更方便.可是使用过程中发现一个小问题——当某个 signal 和成员函数是重载关系的时候,qmake ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
- .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式
开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...
- .NET中那些所谓的新语法之四:标准查询运算符与LINQ
开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运算符是定义在System.Linq.Enumerable类中的50 ...
- 1、ASP.NET MVC入门到精通——新语法
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...
- 总结常见的ES6新语法特性
前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...
随机推荐
- 前端学习笔记之BOM和DOM
前言 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- Redis 数据结构-字符串源码分析
相关文章 Redis 初探-安装与使用 Redis常用指令 本文将从以下几个部分进行介绍 1.前言 2.常用命令 3.字符串结构 4.字符串实现 5.命令是如果操作字符串的 前言 平时在使用 Redi ...
- 20145211《网络渗透》MS12-004漏洞渗透
20145211<网络渗透>MS12-004漏洞渗透 一 实验原理 初步掌握平台matesploit的使用 有了初步完成渗透操作的思路 在这里我选择对的不是老师推荐的MS11_050,而是 ...
- linux共享内存简单介绍以及编码演示
共享内存的基本概念 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 下图是共 ...
- 【Swift实现代码】iOS架构模式之MVP
1.什么是MVP? MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. 1.1 模型 (Model):负责处理数据的加载或存储 1.2 视 ...
- 【bzoj2563】阿狸和桃子的游戏(贪心+构造)
题目传送门:bzoj2563 先膜拜一波PoPoQQQ的题解:BZOJ 2563 阿狸和桃子的游戏 贪心 其实我们可以这样看:把一条边的权值均分到两个端点,那么取到两个端点就能得到这条边的边权,如果只 ...
- 爬虫框架Scrapy之案例一
阳光热线问政平台 http://wz.sun0769.com/index.php/question/questionType?type=4 爬取投诉帖子的编号.帖子的url.帖子的标题,和帖子里的内容 ...
- 在 Linux 服务器上搭建和配置 Hadoop 集群
实验条件:3台centos服务器,jdk版本1.8.0,Hadoop 版本2.8.0 注:hadoop安装和搭建过程中都是在用户lb的home目录下,master的主机名为host98,slave的主 ...
- Linux安装keepalived
1.下载安装ipvs安装包,进行解压 http://www.keepalived.org/software/ 2.创建安装路径连接 安装环境: yum -y install openssl-devel ...
- 解决httpclient因为保持永久长连接造成连接吊死的问题
httpclient使用了连接池,如果没有设置keep-alive策略,PoolingHttpClientConnectionManager会默认使用永久连接. 最近在调用京东api时,发现一个请求开 ...