技术: C++11 特性补充

介绍一些个人觉得不太重要,或者不值得单独说的, 其他特性.

C++真的是一门新的语言. 如果在C++11, 即C++2.0没有跟上的同学, 再过一两个版本, 基本上看不懂C++代码了.

前面已经陆陆续续把大部分C++11的新特性全部都说完了, 这里带一下剩下的

推荐书籍

C++ Primer, 2012
The C++ programming Language C++ 2013.
Effective Modern C++ 2014. –推荐.

编译器支持

ISOC++11支持, GNUC++11支持.
总之要记得调整你的compiler选项.

代码中主要检查相关的宏:

1
2
3
4
5
#define __cplusplus 201103L  //11

#define __cplusplus 199711L //98

std::cout << __cplusplus << std::endl;

模板参数的括号问题

右移操作符和连续模板包含中的空格问题

1
2
3
vector<list<int> >;
//以及C++11的
vector<list<int>>;

不多解释了.

委托构造

C++03里面, 从一个构造调用同一个类的另外一个构造, 其实是在初始化另外一段内存空间,
它一般是不允许你这么做(不像Java那么灵活; 或者允许你这么做, 但是实际上产生的是临时对象), 但是现在好了, C++允许了.
(可能要借助完美转发实现委托构造)
举个例子:

1
2
3
4
5
6
7
8
9
10
11
class M
{
int x, y;
char *p;

public:
M(int v) : x(v), y(0), p(new char [MAX]) {} //#1 target
M(): M(0) {
cout<<"delegating ctor"<<end; //#2 delegating
}
};

#2就是所谓的委托构造函数, 调用了真正的构造函数#1.

新的算法

主要是 all_of()、any_of() 和 none_of(), copy_n().

1
2
3
4
5
6
7
8
#include <algorithm>  
//C++11 code
//are all of the elements positive?
all_of(first, first+n, ispositive()); //false
//is there at least one positive element?
any_of(first, first+n, ispositive());//true
// are none of the elements positive?
none_of(first, first+n, ispositive()); //false

以及copy_n:

1
2
3
4
5
#include <algorithm>  
int source[5]={0,12,34,50,80};
int target[5];
//从 source 拷贝 5 个元素到 target
copy_n(source,5,target);

iota() 算法可以用来创建递增序列,它先把初值赋值给 *first,然后用前置 ++ 操作符增长初值并赋值到给下一个迭代器指向的元素,如下:

1
2
3
4
5
#include <numeric>  
int a[5]={0};
char c[3]={0};
iota(a, a+5, 10); //changes a to {10,11,12,13,14}
iota(c, c+3, 'a'); //{'a','b','c'}

array容器

其实就是封装了数组, 主要方法是size, begin, end, 当然还有at等方法.

1
2
3
4
5
6
7
8
//int myArray[10];
std::array<int ,10> myArray;

//array<int, 10>::iterator;
auto it = myArray.begin(); //拿到索引

it += 3; //移动到第三个元素上
cout << *it;

这样可以使用标准库更多的算法等.

不过也会失去这样做的好处

1
2
typedef int T[100];
T myArray;

我一般不适用 array, 还是直接使用原始数组.

越做越复杂的东西, 很烦的.

override

重写父类的虚函数, 可以在函数名字后面, 实现大括号前面, 加上override, 让编译器帮助检查函数声明, 确保一致.

final

两个作用, 情景:

  • 用于类, 不让别人再继承, 表明自己是继承体系的最后一个类.
  • 用于虚函数, 子类则不可以重写.

本篇的确没有什么深度, 权当记载了吧.

文章目录
  1. 1. 推荐书籍
  2. 2. 编译器支持
  3. 3. 模板参数的括号问题
  4. 4. 委托构造
  5. 5. 新的算法
  6. 6. array容器
  7. 7. override
  8. 8. final
|