C++11 带来的新特性 (1)
1 语法改进
1.1 模板表达式中的空格
- 在c++03 及以前
vector<list<int>>; //Error
vector<list<int> >; //OK
- c++11
vector<list<int>>; //OK
1.2 nullptr 和 std::nullptr_t
- 在c++03 及以前
void f(int);
void f(void*);
f(0); //call f(int)
f(NULL); //有歧义
- c++11
f(nullptr);//call f(void*)
nullptr是关键词,其类型是std::nullptr_t
2 auto-自动类型推断
auto i = 42; //int
double f();
auto d = f(); //double
auto n; //Error
static auto vat = 0.19;
vector<string> v;
auto pos = v.begin();
auto f = [](int x)-> bool{return x+1;}
3 for循环
基本形式:
for( decl : coll ){
statement
}
等价于:
for( auto _pos = coll.begin(), _end = coll.end(); _pos != NULL; ++_pos){
decl = * _pos;
statement
}
或者(其中begin()和end()是全局函数):
for( auto _pos = begin(coll), _end = end(coll); _pos != NULL; ++_pos){
decl = * _pos;
statement
}
- 示例1
for( int i : {2, 3, 4, 5,8} ){
std::cout<< i << std::endl;
}
- 示例2。使用引用方式,修改容器中的元素。
std::vector<double> vec;
...
for( auto & elem : vec ){
elem *= 3;
}
- 示例3。结合模板,同时使用const修饰元素。
template < typename T>
void printElements( const T& coll ){
for( const auto& elem : coll ){
std::cout<< elem << std::endl;
}
}
- 示例3。结合模板,同时使用const修饰元素。
template < typename T>
void printElements( const T& coll ){
for( const auto& elem : coll ){
std::cout<< elem << std::endl;
}
}
- 示例4。range方式使用for循环,会调用拷贝构造函数。
Get() const{
return m_data;
}
private:
int m_data;
};
ostream& operator<<(ostream& os, const X& x)
{
os << x.Get();
return os;
}
int main(){
vector<X> v = {1, 3, 5, 7, 9};
cout << "\nElements:\n";
for (auto x : v)
{
cout << x << ' ';
}
return 0;
}
输出:
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
Elements:
X copy ctor.
1 X copy ctor.
3 X copy ctor.
5 X copy ctor.
7 X copy ctor.
9
为了防止调用拷贝构造函数,提高下率,加上引用。
for (auto &x : v)
{
cout << x << ' ';
}
执行输出:
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
Elements:
1 3 5 7 9
发现已经不调用拷贝构造函数了。
- 反面示例。在for循环中,不能显示调用(使用explicit)类型转换函数:
class C {
public :
explicit C( const std::string & s); //显示转换
...
};
int main(){
std::vector<std::string> vs;
for( const C& elem : vs ){
std::cout << elem << std::endl;
}
}
报错。去掉“explicit”后,可正常运行。
invalid initialization of reference of type ‘const C&’ from expression of type ‘std::__cxx11::basic_string<char>’
4 字符串
- 原始字符串
在字符串前面加上关键字R,表示这是一个原始字符串。
下面这两个是等效的。
"\\\\n"
R"\\n"
下面这两个也是等效的。
R"nc(a\
b\nc()"
)nc";
"nc(a\\\n b\\nc()\"\n )nc";
- 编码的字符串
使用编码前缀制定字符串编码。如下
L"hello" // 定义wchar_t编码的字符串
前缀有以下几种:
- u8表示UTF-8编码。
- u表示char16_t
- U表示char32_t
- L表示宽字符集,类型wchar_t
5 强枚举类型
c++11中的枚举类型如下所示:
enum class Salutation : char { mr, ms, co, none };
- 与int类型之间显示转换是不允许的。
- 使用 Salutation::mr 方式引用枚举类型。
- 可以显示的指定一个后台类型,如上例中的char。如果不显示指定,默认是int类型。
待续。。。
C++11 带来的新特性 (1)的更多相关文章
- C++11 带来的新特性 (4)—— 匿名函数(Lambdas)
1 语法 Lambdas并不是新概念,在其它语言中已经烂大街了.直接进入主题,先看语法: [ captures ] ( params ) specifiers exception attr -> ...
- C++11 带来的新特性 (3)—— 关键字noexcept
1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...
- C++11 带来的新特性 (2)—— 统一初始化(Uniform Initialization)
1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...
- (数据科学学习手札139)geopandas 0.11版本重要新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...
- Mysql8.0.11简介,新特性
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- 发布倒计时!JDK11为我们带来哪些新特性?
今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中. 这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今 ...
- Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...
- kafka 幂等生产者及事务(kafka0.11之后版本新特性)
1. 幂等性设计1.1 引入目的生产者重复生产消息.生产者进行retry会产生重试时,会重复产生消息.有了幂等性之后,在进行retry重试时,只会生成一个消息. 1.2 幂等性实现1.2.1 PID ...
- Xcode8 带来的新特性和坑
Xcode8新特性 Interface Builder 随着14年的iPhone6和6P出来之后,iPhone的屏幕尺寸也越来越多,屏幕适配是一个需要解决的问题,以后不一定苹果又出什么尺寸的iPhon ...
随机推荐
- 大二学生党的Security+备考宝典(一次过)
刚出成绩的一刹那,我的心里是慌的很的,因为可能知识点复习的不够扎实,考试上的题目全都回归了课本,而我的知识回归了老师(滑稽),一下给大家分享下我的经验,希望大家引以为戒,都能考出好成绩. 一.直播阶段 ...
- redis cluster简介和配置(3)
前面我介绍了 redis sentinel,既然有了sentinel,为什么还要一个cluster呢?因为随着业务量的增加,不可避免要对redis进行扩容,扩容方式一般由2种:1. 垂直扩容 2. 水 ...
- python7 数据类型的相互转化 字符编码
复习 1.深浅拷贝 ls = [1, 'a', [10]] 值拷贝:直接赋值 ls1 = ls, ls中的任何值发生改变,ls1中的值都会随之改变 浅拷贝:通过copy()方法 ls ...
- 为Nexus配置阿里云代理仓库【转】
Nexus默认远程仓库为https://repo1.maven.org/maven2/ 慢死,还常连不上. 可以添加阿里云代理仓库 URL:http://maven.aliyun.com/nexus/ ...
- 树莓派设置固定IP地址
vi /etc/dhcpcd.conf # 使用 vi 编辑文件,增加下列配置项 # 指定接口 eth0 interface eth0 # 指定静态IP,/24表示子网掩码为 255.255.255. ...
- mongodb增加新字段报错解决方法
今天想在项目的一个集合里增加一个新字段 db.article.update({},{$set:{status:0}},{multi:true}) multi : 可选,mongodb 默认是false ...
- 【LOJ 6041】「雅礼集训 2017 Day7」事情的相似度
Description 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的 ...
- 3、设置jsp上的类容自动更新
1.run->edit configurations进入下面的界面,并修改 On ‘Update’ action 为 Redeploy. On frame deactivation 为 ...
- Hadoop yarn任务调度策略介绍(转)
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资 ...
- git知识总结-3.gitignore文件说明
1.前言 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表. 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等. 在这种情况下,我们可以创建一个名 ...