20分钟了解C++ 11

1 初始化列表 Initializer List


//C++ 03中用初始化列表初始化数组
int arr[4] = {3, 2, 4, 5}; vector<int> v;
v.push_back(3);
v.push_back(2);
v.push_back(4);
v.push_back(5); // C++ 11 做了扩展,可以初始化vector
vector<int> v = {3, 4, 1, 9}; // 调用初始化列表构造函数
// 所以相关的STL容器都更新了,支持初始化列表 // 定义自己的初始化列表构造函数:
#include <initializer_list>
class BoVector {
vector<int> m_vec;
public:
BoVector(const initializer_list<int>& v) {
for (initializer_list<int>::iterator itr = v.begin(); itr!=v.end(); ++ itr)
m_vec.push_back(*itr);
}
}; BoVector v = {0, 2, 3, 4};
BoVector v{0, 2, 3, 4}; // 初始化的另一种方式 // 自动进行常规的初始化
class Rectangle {
public:
Rectangle(int height, int width, int length){ }
}; void draw_rect(Rectangle r); int main() {
draw_rect({5, 6, 9}); // Rectangle{5,6,9}被自动调用
} // 注意:要小心使用
// 1. 可读性非常差,即使有IDE的帮助也是。函数名称很少表示函数所采用的参数类型
// 2. 函数可以被不同参数类型重载,比如下面的情况 void draw_rect(Triangle t);

2 统一初始化Uniform Initialization

// C++ 03
class Dog { // 聚合类或者结构体,直接初始化对应成员
public:
int age;
string name;
};
Dog d1 = {5, "Henry"}; // 可以直接用大括号聚合初始化 // C++ 11 扩展了大括号初始化的范围
class Dog {
public:
Dog(int age, string name) {...};
};
Dog d1 = {5, "Henry"}; //类有合适参数的构造函数 /* 统一初始化的搜索顺序:
* 1. 初始化列表构造函数
* 2. 具有合适参数的常规构造函数
* 3. 聚合初始化(直接初始化对应成员)
*/ Dog d1{3}; class Dog {
public:
int age; // 第3选择 Dog(int a) { // 第2选择
age = a;
} Dog(const initializer_list<int>& vec) { // 第1选择
age = *(vec.begin());
}
};

3 auto类型

std::vector<int> vec = {2, 3, 4, 5};

// C++ 03
for (std::vector<int>::iterator it = vec.begin(); it!=vec.end(); ++ it)
m_vec.push_back(*it); // C++ 11: 使用auto节省大量打字的时间
for (auto it = vec.begin(); it!=vec.end(); ++ it)
m_vec.push_back(*it); auto a = 6; // a is a integer
auto b = 9.6; // b is a double
auto c = a; // c is an integer
auto const x = a; // int const x = a
auto& y = a; // int& y = a // 它是静态类型,没有运行时成本,fat-free.
// 使得代码更易维护 // 1. 当需要类型转换时不要使用auto
// 2. IDE变得很重要

4. foreach

 */
// C++ 03:
for (vector<int>::iterator itr = v.begin(); itr!=v.end(); ++ itr)
cout << (*itr); // C++ 11:
for (auto i: v) { // 任何有begin()和end()的类都能使用
cout << i ; // 只读访问
} for (auto& i: v) {
i++; // 改变v的值,避免拷贝构造
} auto x = begin(v); // 同int x = v.begin(); int arr[4] = {3, 2, 4, 5};
auto y = begin(arr); // y == 3
auto z = end(arr); // z == 5
// 因为数组定义了begin()和end()
// 可以通过给数据的容器定义begin()和end(),使你的代码适配第三方库

5 nullptr

 * 代替C++ 03中的NULL
*/
// NULL具有二义性
void foo(int i) { cout << "foo_int" << endl; }
void foo(char* pc) { cout << "foo_char*" << endl; } int main() {
foo(NULL); // 二义性,调用哪个函数? // C++ 11
foo(nullptr); // 调用foo(char*)
}

6 枚举类 enum class


// C++ 03
enum apple {green_a, red_a};
enum orange {big_o, small_o};
apple a = green_a;
orange o = big_o; if (a == o) //两个不同枚举类型进行比较
cout << "green apple and big orange are the same\n";
else
cout << "green apple and big orange are not the same\n"; // C++ 11
enum class apple {green, red};
enum class orange {big, small};
apple a = apple::green;
orange o = orange::big; if (a == o) //编译失败,因为我们没有定义 ==(apple, orange)
cout << "green apple and big orange are the same\n";
else
cout << "green apple and big orange are not the same\n";

7 static_assert


// 运行时断言
assert( myPointer != NULL ); // C++ 11提供了静态断言,在编译时检查
// 如果int的大小不是4,编译不过
static_assert( sizeof(int) == 4 );

8 委托构造函数


// 一个构造函数想复用另一个构造函数的代码
// 下面这种方法是错误的,会构造两个对象
class Dog {
public:
Dog() { ... }
Dog(int a) { Dog(); doOtherThings(a); }
}; // C++ 03的实现方法:
class Dog {
init() { ... };
public:
Dog() { init(); }
Dog(int a) { init(); doOtherThings(); }
};
/* 缺点:
* 1. 代码笨重.
* 2. 而且init()可能被其他函数调用
*/ // C++ 11 方法:
class Dog {
int age = 9;
public:
Dog() { ... }
Dog(int a) : Dog() { doOtherThings(); }
};
// 限制: Dog()也即被委托的构造函数必须先被调用

C++11--20分钟了解C++11 (上)的更多相关文章

  1. C++11--20分钟了解C++11 (下)

    20分钟了解C++11 9 override关键字 (虚函数使用) * * 避免在派生类中意外地生成新函数 */ // C++ 03 class Dog { virtual void A(int); ...

  2. Java基础部分(11~20)

    11."=="和 equals 方法究竟有什么区别? (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ==操作符专门用来比较两 ...

  3. 【转】Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

    [转]Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性 Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

  4. 【转载】20分钟MySQL基础入门

    原文:20分钟MySQL基础入门 这里持续更新修正 开始使用 MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格 ...

  5. 20分钟成功编写bootstrap响应式页面 就这么简单

    最近发现一个叫 Bootstrap 的好东西,Bootstrap 是现在最流行的响应式 CSS 框架,它以移动设备优先,能够快速适应不同设备.使用它编写响应式页面快捷.方便,而且屏蔽了浏览器差异.使用 ...

  6. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  7. [转]20位活跃在Github上的国内技术大牛

    FROM : http://blog.csdn.net/yaoxtao/article/details/38518933 20位活跃在Github上的国内技术大牛 本文列举了20位在Github上非常 ...

  8. 无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟

    同事说,有个语句5个小时不出结果,叫我帮忙看看,于是叫同事发过来.不看不知道,一看吓一跳,3个表关联,强制使用了2个index hint,当中一个表9g,一个表67g,另一个小表40Mb.开发者,总以 ...

  9. 关于.net服务启动注册到zookeeper,但是注册节点20分钟自动消失解决办法

        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,作用简单描述就是相当于一个中介,服务提供者将服务注册到zk,服务调用者直接从zk获取,zk的作用就是协调     最近碰到公 ...

随机推荐

  1. Django框架的使用

    1.创建项目: 语法:django-admin startproject 项目名称 2.Django的项目结构介绍 1.manage.py 功能:包含执行django中的各项操作的指令,不太清楚可以使 ...

  2. [LeetCode&Python] Problem 563. Binary Tree Tilt

    Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as the ab ...

  3. day01计算机组成与操作系统

    1.什么是编程语言编程语言是程序员与计算机之间的沟通介质 2.什么是编程编程的过程就是程序员通过某种语言将命令给到计算机并让计算机表达出来 修改后:编程就是程序员按照某种语法规则将自己想让计算机做的事 ...

  4. TS 基础数据类型

    1.基础数据类型 Boolean布尔值   Number数字 String字符串  Array数组 Tuple元组  Enum枚举   Any    void Boolean布尔值:true/fals ...

  5. 改变radio单选按钮的样式

    <div class="choose_btn"> <input type="radio" name="choose_raido&qu ...

  6. hdoj 2159 (带限制的完全背包)

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; ] ...

  7. python开发day02

    一 while循环 while 条件 代码块(循环体)  #:  判断条件是否为真,如果是真,则执行代码块, 然后再次回头判断条件是否为真,如果为真,则只执行代码块.......知道循环的判断出代码为 ...

  8. libsvm使用总结

    ./tools/ subset.py  分割数据集 grid.py   优化参数c.g checkdata.py   检测数据集格式 easy.py   综合 ./windows/ svm-scale ...

  9. 2018.4.23 深入理解java虚拟机(转)

    深入理解java虚拟机 精华总结(面试) 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个 ...

  10. 深入学习Motan系列(二)——服务发布

    闯关经验: 袋鼠走过了第一关,顺利搭建出了Demo,信心爆棚.不过之后,心想怎么去研究这个框架呢.查了一下,官方文档,好像没什么东西可以研究啊.后来,又搜了搜博客,因为这是微博的框架嘛,所以搜索时用百 ...