基础知识(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 全特化
模版函数特化
模版函数泛化
请按任意键继续. . .

 

原文链接: https://www.cnblogs.com/zl1991/p/13132438.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    基础知识(2)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/355288

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午9:08
下一篇 2023年3月2日 上午9:09

相关推荐