c++的新方法

C++11是C++委员会为进行更新的一次大规模的更新,为C++以及其标准库提供了大量的革新性的更新,为使用者提供了更灵活的编程方法和表达模式。后来还有的对C++的升级还包括C++14和C++17以及将来的C++20。C++14和C++17只做出了微小的改动,因此我主要给大家分享一些大家会在接下来几天会用到的一些实用的C++特性。

C++的自动推断和类型引用(自己取的名字)

C++11中增加了对类型的自动推断,这是什么意思呢,就是编译器能够自动根据赋值的类型来给出一个匹配的类型,从而省去了编写冗长的类型名称的痛苦。也不需要再去记忆类型名称的拼写,非常好用。

1
2
3
4
5
6
7
8
9
10
#include <type_traits>
#include <utility>
int main() {
std::pair<int64_t, int64_t> a(10, 10);

std::pair<int64_t, int64_t> bar = a;
auto foo = a;
decltype(a) too = a;
return 0;
}

C++的for loop 方法

有过Python编程经验的人都知道Python中循环列表(List)的For方法非常方便:

1
2
3
foo = [1,2,3,4,5]
for n in foo:
print(n)

在C++11中,也增加了相应的编写方法,从而让我们更方便的对列表类型的变量进行遍历,同时这里我们也用了之前介绍的自动推断方法,大概的方法如下:

1
2
3
4
5
6
7
8
9
10
#include <vector>
#include <iostream>

int main() {
std::vector<int> n = {1,2,3,4,5,6,7};
for (auto p : n) {
std::cout << p << std::endl;
}
return 0;
}

C++的新的初始化方法

我们知道C语言中数组能够通过这样的方式来初始化数组,在C++11中,我们也能够通过这样的方式来初始化vector以及其他的的列表类型,Python能够多继承。

1
2
3
4
5
#include <vector>
int main() {
std::vector<int> n = {1,2,3,4,5,6,7};
return 0;
}

我们知道C++要初始化一个类需要定义他的构造方法,但是有时候呢,有些构造方法确实所有的类的行为都大致相似,那么我们能不能去省略这些构造函数呢?所以C++11给我们定义了由编译器生产的默认构造函数来帮助我们省略这些代码,同时在C++11中我们能直接在类里面对成员变量初始化

1
2
3
4
5
6
7
class foo {
int fo = 1;
int bar = 1;
public:
foo() = default;
foo(const foo&) = default;
};

这里编译器为我们默认生成了两套构造函数,一个是复制构造函数,一个是没有变量的构造函数。同时我们还可以看到,我们对fo 和 bar给了一个初始值。这在C++11之前的版本是不可以的。 同时我们有能在一个类的构造函数去调用同一个类的另外一个构造函数,这在C++11之前是不允许的。从C++11开始允许了。

C++的智能指针

C语言中的内存泄漏和野指针的让C程序的正确编程变得更加困难,为了解决这个问题,C++中引入了智能指针(smart point)的工具,帮助我们写出更健壮的代码,智能指针的工作原理就是计数应用,什么意思呢?就是系统会记下来有多少个指针指向这一块内存,而当这个指向这一块内存不在存在指针的时候,编译器会自动销毁这一块内存,非常好用,在我们这个链表中,我们就可以只需要销毁根节点的指针,然后整个链表就会自动全部销毁,大家想想为什么? 接下来我们来看看怎么使用这个智能指针。

1
2
3
4
5
6
7
8
9
10
11
#include <memory>

int foo() {
auto p = std::make_shared<int>(6);
return 0;
}

int main() {
foo();
return 0;
}

类的隐式构造

我们在定义一个新的类的时候我们可以定义只有一个的构造函数,这个时候,我们我们就可以用类型转换来编写程序,这个时候会自动通过调用这个只有一个参数的构造函数来“转换成一个类”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <memory>

#include<iostream>

class foo {
public:
int i = 1;
foo() = default;
foo(const foo&) = default;
foo(int a): i(a) {};
const foo operator+(const foo &r) const {
return foo(this->i + r.i);
}
};

int main() {
foo a;
std::cout << (a + 3).i << std::endl;
return 0;
}

Lambda表达式

这里我就不多讲了。有兴趣可以去了解一下。建议大家去了解一下,这是一份非常强大的特性。

迭代器

迭代器在C++中占着举足轻重的地位,他属于STL中的一部分,单独拿出来帮助我们来说是一个非常重要的东西。

标准库、STL和Boost

建议学有余力的同学去了解这三个库,非常好用,封装了常用的一些数据结构和一些有用的函数。在实际的开发中运用非常多,建议有心情的同学去学习了解一下啊。