C++11/14学习笔记(未完成)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26822029/article/details/83039494

本篇内容为侯捷《C++ 11》听课笔记,只讨论在C++中出现的新内容。

0、准备工作

 0.1、C++ Standard演化

C++版本 版本名称 说明
C++ 98 1.0  
C++ 03 TR1, Technical Report 1 许多TR1的特性存在std::tr1中,现在TR1的内容已经被放到STD中,因此现在在std命名空间中
C++ 11 2.0  
C++ 14 -  

本篇讨论的内容为C++ 2011和2014版本的内容。C++2.0的新特性包括语言和标准库两个层面,后者以header files形式呈现。

  1. C++标准库的header files不带副档名(.h), 例如 #include <vector>
  2. 新式C header files 不带副名称.h, 例如 #include <cstdio>
  3. 旧式C header files(带有副名称.h)仍旧可用,例如 #include <stdio.h>

0.2、侯老推荐的的C++ 11书籍

1、Variadic Templates(数量不定的模板参数)

在C语言中出现过不定参数的函数,在C++11中定义了Variadic Templates可以定义数量不定的模板参数,...就是一个所谓的包,这个包里面的内容根据使用情况不同包含了不同的内容。用法如下所示:

#include <iostream>
using namespace std;

// 剩下零个参数的时候调用这个函数
void print()
{}

template <typename T, typename... Types>
void print(const T& firstArg, const Types& ... args)
{
	cout << firstArg << endl;    // 打印第一个参数
	print(args...);              // 对于其余的参数调用print()函数
}

使用下面的代码调用这个模板函数:

print(7.5, "hello", 12.34, 42);

得到的执行结果为:

2、space in Template Expressions

在C++ 11版本之前,如果有模板的嵌套使用,需要像下面这样定义:

vector<list<int> >

也就是说int右边的两个>符号之间必须有一个空格,否则编译器在编译的时候会报错= =! 在C++11 中解决了这一个问题。

3、nullptr和std::nullptr_t

在C++11中可以使用nullptr来代替0或者NULL,用来表示指针指向NULL。

std::nullprt_t实际上就是nullptr的别名。

4、Automatic Type Deduction with auto

在C++11中你可以使用auto来定义一个变量或者对象,不需要手动指明这个变量或者对象的类型,编译器可以自动识别其类型如:

auto i = 42;             // i的类型为int
double f();
auto d = f();            // d的类型为double
vector<string> v;
auto pos = v.begin();    // pos的类型为vector<string>::iterator

这个关键字主要用于变量类型太长或者复杂的时候方便书写程序。如下面的Lambda程序所示(后面会介绍Lambda表达式):

auto l = [] (int x) -> bool {    // l是一个object,表示一个lambda表达式
    ...,
};

5、Uniform Initialization

为了初始化写法的一致性,C++11中规定引入了一致性,为了初始化的写法的一致,你可以使用花括号作为初始化的符号。例如下面的实例:

int values[] {1,2,3};           // 等价于int val[] = {1, 2, 3};
vector<int> v {2,3,4,5,6};
vector<string> cities {"New York", "London"};
complex<double> c{4.0, 3.0};    // 等价于c(4.0, 3.0);

侯老注释:以上的做法其实是利用一个事实:编译器看到{t1, t2, ... tn}便做出一个initializer_list<T>,它关联至一个array<T, n>。调用函数(如ctor)时该array内的元素可被编译器分解逐一传给函数。但若是函数参数是个initializer_list<T>,调用者却不能给与数个T参数然后以为他们会自动转为一个initializer_list<T>传入。

猜你喜欢

转载自blog.csdn.net/qq_26822029/article/details/83039494