美文网首页
C++11新特性(2)

C++11新特性(2)

作者: su945 | 来源:发表于2020-08-04 22:03 被阅读0次

1.空指针nullptr

  • nullptr与NULL的区别:
    对于NULL,是一个空指针常量,如果将NULL扩展为常数,那么这个数是0,类型为int。常数0既是整型常量,也是空指针常量,这就有可能导致二义性问题。
    因此c++11新标准引入了nullptr,将其作为空指针常量。

2.基于范围的for循环

注意:在试用&时,才可以对元素进行更改

struct A
{
    int n;
    A(int i) :n(i) {}
};

int main()
{
    int ary[] = { 1,2,3,4,5 };
    for (int & e : ary)
        e *= 10;
    for (int e : ary)
        cout << e << ","; //10,20.30,40,50
    cout << endl;
    vector<A> st(ary, ary + 5);
    for (auto & it : st)
        it.n *= 10;
    for (A it : st)
        cout << it.n << ","; //100,200,300,400,500
    cout << endl;
    return 0;
}

3.右值引用和move语义

右值:一般来说,不能取地址的表达式,就是右值,能取地址的,就是左值。
主要目的是提高程序运行的效率,较少需要进行深拷贝的对象进行深拷贝的次数。

4.正则表达式

#include <iostream>
#include <regex> //使用正则表达式须包含此文件
using namespace std;
int main()
{
    regex reg("b.?p.*k");
    cout << regex_match("bopggk", reg) << endl;//输出 1, 表示匹配成功
    cout << regex_match("boopgggk", reg) << endl;//输出 0, 匹配失败
    cout << regex_match("b pk", reg) << endl; //输出 1, 表示匹配成功
    regex reg2("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");
    string correct = "123Hello N/A Hello";
    string incorrect = "123Hello 12 hello";
    cout << regex_match(correct, reg2) << endl; //输出 1,匹配成功
    cout << regex_match(incorrect, reg2) << endl; //输出 0, 失败
}

5.Lambda表达式

  • 只使用一次的函数对象,能否不要专门为其编写一个类?
  • 只调用一次的简单函数,能否在调用时才写出其函数体?
    形式:
    外部变量访问方式说明符 ->返回值类型
    {
    语句组
    }
    [] 不使用任何外部变量
    [=] 以传值的形式使用所有外部变量
    [&] 以引用形式使用所有外部变量
    [x, &y] x 以传值形式使用, y 以引用形式使用
    [=,&x,&y] x,y 以引用形式使用,其余变量以传值形式使用
    [&,x,y] x,y 以传值的形式使用,其余变量以引用形式使用
    “->返回值类型”也可以没有, 没有则编译器自动判断返回值类型。
int main()
{
    int x = 100, y = 200, z = 300;
    cout << [](double a, double b) { return a + b; }(1.2, 2.5)
        << endl;
    auto ff = [=, &y, &z](int n) {
        cout << x << endl;
        y++; z++;
        return n*n;
    };
    cout << ff(15) << endl;
    cout << y << "," << z << endl;

    int a[4] = { 4,2,11,33 };
    sort(a, a + 4, [](int x, int y)->bool { return x % 10
        < y % 10; });
    for_each(a, a + 4, [](int x) {cout << x << " "; });
}

6.多线程

#include <iostream>
#include <thread>
using namespace std;
struct MyThread {
    void operator () () {
        while (true)
            cout << "IN MYTHREAD\n";
    }
};
void my_thread(int x)
{
    while (x)
        cout << "in my_thread\n";
}
int main()
{
    MyThread x; // 对x 的要求:可复制
    thread th(x);// 创建线程并执行
    thread th1(my_thread, 100);
    while (true)
        cout << "in main\n";
    return 0;
}
/*
输出:
in my_thread
in my_thread
IN MYTHREAD
IN MYTHREAD
in main
in my_thread
IN MYTHREAD
IN MYTHREAD
in main
in main
in my_thread
IN MYTHREAD
…….
*/

相关文章

网友评论

      本文标题:C++11新特性(2)

      本文链接:https://www.haomeiwen.com/subject/pozbrktx.html