• 基础知识(2)


    1、c++11新特性:

    • “语法糖”:nullptr, auto自动类型推导,范围for循环,初始化列表, lambda表达式等
    • 右值引用和移动语义
    • 智能指针
    • C++11多线程编程:thread库及其相配套的同步原语mutex, lock_guard, condition_variable, 以及异步std::furture
    (1)auto:auto声明的变量必须要初始化,否则编译器不能判断变量的类型。auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数。关于效率: auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响。另外,auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。
    (2)lambda表达式是匿名函数,可以认为是一个可执行体functor,语法规则如下:
    [捕获区](参数区){代码区};
    auto add = [](int a, int b) {return a + b};

    (3)右值引用是C++11新特性,它实现了转移语义和完美转发,主要目的有两个方面:消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率;能够更简洁明确地定义泛型函数。C++中的变量要么是左值、要么是右值。通俗的左值定义指的是非临时变量,而左值指的是临时对象。左值引用的符号是一个&,右值引用是两个&&

    (4)移动语义:转移语义可以将资源(堆、系统对象等)从一个对象转移到另一个对象,这样可以减少不必要的临时对象的创建、拷贝及销毁。

    (5)智能指针:为防止内存泄露等问题,用一个对象来管理野指针,使得在该对象构造时获得该指针管理权,析构时自动释放(delete).

    • shared_ptr,基于引用计数的智能指针,会统计当前有多少个对象同时拥有该内部指针;当引用计数降为0时,自动释放
    • weak_ptr,基于引用计数的智能指针在面对循环引用的问题将无能为力,因此C++11还引入weak_ptr与之配套使用,weak_ptr只引用,不计数
    • unique_ptr: 遵循独占语义的智能指针,在任何时间点,资源智能唯一地被一个unique_ptr所占有,当其离开作用域时自动析构。资源所有权的转移只能通过std::move()而不能通过赋值
    (6):override关键字,可以防止C++因你试图重载一个继承函数,但拼写名字错误创建一个新的不必要的成员函数。
    (7)final:此关键字阻止函数被应用它的类重载
     
    2、模板的泛化、全特化、偏特化、类模板、函数模板:
    1. 模板特化按对象类型(类和全局函数)分为两种: 类模板的特化和全局模板函数的特化;
    2. 按特化的类型分全特化和偏特化(也就是多个模板参数可以选定只特化一个或者多个),全局模板函数的特化不支持偏特化;
    3. 全局模板函数的特化需要关注几个重要元素函数返回值 函数名 形参类型、个数和顺序,eg:template T max_(const T &, const T &)
    4. 类模板的特化需要关注几个重要元素类名,形参类型和个数,形参的顺序倒不重要了;
    5. 模板特化,任何针对模板参数进一步进行条件限制设计的特化版本。《泛型思维》
    6. 全特化就是全部特化,即针对所有的模板参数进行特化。《c++ primer》
    7. 偏特化就是部分特化,即针对部分模板参数进行特化。《c++ primer》
    8. 全特化和偏特化的定义不是很严格,所以有的时候不容易让人理解。
    #include <iostream>
    using namespace std;
    
    namespace templateTest{
    
        //模版泛化
        template<typename T>
        class iterator_traits
        {
        public:
            iterator_traits()
            {
                cout << "模版泛化" << endl;
            }
    
            ~iterator_traits()
            {
    
            }
        };
    
        //偏特化
        template<typename T>
        class iterator_traits<T*>
        {
        public:
            iterator_traits()
            {
                cout << "模版偏特化,特化常规指针" << endl;
            }
    
            ~iterator_traits()
            {
    
            }
        };
    
        //偏特化
        template<typename T>
        class iterator_traits<const T*>
        {
        public:
            iterator_traits()
            {
                cout << "模版偏特化,特化const指针" << endl;
            }
    
            ~iterator_traits()
            {
    
            }
        };
    
        //全特化
        template<>
        class iterator_traits<int>
        {
        public:
            iterator_traits()
            {
                cout << "模版全特化int类型" << endl;
            }
    
            ~iterator_traits()
            {
    
            }
        };
    };
    
    //泛化
    template<class U, class T>
    class Test
    {
    public:
        Test()
        {
            cout << "Test 泛化" << endl;
        }
    };
    
    //偏特化
    template< class T>
    class Test<int,T>
    {
    public:
    
        Test()
        {
            cout << "Test 偏特化" << endl;
        }
    };
    
    //全特化
    template<>
    class Test<int, char>
    {
    public:
    
        Test()
        {
            cout << "Test 全特化" << endl;
        }
    };
    template<typename T>
    void max(const T& t1, const T & t2)
    {
        cout << "模版函数泛化"<< endl;
    
    }
    
    //其实函数模版不存在偏特化,只有全特化
    template<>
    void max<int>(const int& t1, const int& t2)
    {
        cout << "模版函数特化" << endl;
    }
    
    void main()
    {
        templateTest::iterator_traits<int> t1;
        templateTest::iterator_traits<float> t2;
        templateTest::iterator_traits<int *> t3;
        templateTest::iterator_traits<const int *> t4;  
        Test<int, int> t5;
        Test<float, int> t6;
        Test<int, char> t7;
        max(5, 10);
        max(5.5, 10.5);
        system("pause");
    }
    模版全特化int类型
    模版泛化
    模版偏特化,特化常规指针
    模版偏特化,特化const指针
    Test 偏特化
    Test 泛化
    Test 全特化
    模版函数特化
    模版函数泛化
    请按任意键继续. . .
  • 相关阅读:
    机器学习之数据预处理
    使用Python一步一步地来进行数据分析总结
    深入对比数据科学工具箱:Python和R之争
    机器学习算法中的过拟合与欠拟合
    监督学习与无监督学习
    Python数据分析之pandas学习
    Python数据分析之numpy学习
    Dart语言学习(二) Dart的常量和变量
    Dart语言学习(一)为什么学习Dart?
    iOS项目中集成Flutter的最新适配升级
  • 原文地址:https://www.cnblogs.com/zl1991/p/13132438.html
Copyright © 2020-2023  润新知