美文网首页
C++面向对象高级编程(下) Week 1 (Boolan) b

C++面向对象高级编程(下) Week 1 (Boolan) b

作者: Im4lish | 来源:发表于2017-08-10 20:40 被阅读0次

    0-导读
    1-Conversion Function

    operator typename ()
    {
    ……
    }
    
    

    2-non-explicit one argument constructor
    explicit关键字,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。
    一般来说explicit多用在构造函数上。
    与explicit对应的还有一个implicit关键字
    3-pointer-like classes

    #include <iostream>
    using namespace std;
    
    template <class T>
    class myshared_ptr
    {
    public:
        T& operator * () const
        { return *px; }
        T* operator -> () const
        { return px; }
    /*
    it->print();
    相当于 (*it).print();
    相当于 (&(*it))->print();
    */
        myshared_ptr(T* p)
            :px(p)
        { }
    private:
        T* px;
    };
    
    class Foo
    {
    public:
        Foo(int a = 0)
            :a(a)
        { }
        void print()
        {
            cout << "print Foo by clever ptr" << endl;
        }
    
        int a;
        int b;
    };
    
    int main()
    {
        myshared_ptr<Foo> ptr(new Foo);
        ptr->print(); // 调用print()函数, 相当与 px->print();
        Foo f(*ptr);
    
    
        Foo* pf = &f;
        cout << pf->a << ' ' << pf->b << endl;
        pf->print();
        return 0;
    }
    

    智能指针
    "->"操作符具有连续的传递性,因为这个特性,智能指针类重载"->"操作符时可以达到设计目的。
    4-Function-like classes
    类对"()"操作符进行重载,使该类像函数一样去使用,从而可以达到更强的可读性。
    5-namespace经验谈
    使用namespace可以在大工程软件开发中避免变量重复。
    6-Class Template
    类模版中可以指定类中函数参数或者成员变量的类型为模版类型:

    类模板是这样一种通用的类:在定义类时不说明某些数据成员、成员函数的参数及返回值的数据类型。类是对对象的抽象,而类模板是对类的抽象,及更高层次上的抽象。类模板称为带参数的类,也称为类工厂(class factory),它可用来生成多个成员相同而某些数据成员、成员函数的参数及返回值的数据类型不同的类型参数。
    使用类模板可以省去大量重复代码
    7-Function Template
    1.函数模板是一种不说明某些参数的数据类型的函数。
    2.函数模板被调用时,编译器根据实际参数的类型确定模板参数T的类型,并自动生成一个对应的函数。
    3.定义函数模板时也可以使用多个类型参数,这时,每个类型参数前面都要加上关键字class 或typename,其间用逗号分隔。
    8-Member Template
    典型应用:模板类的构造函数

    template <class T1, class T2>
    struct xxx
    {
        typedef T1 first_type;
        typedef T2 second_type;
    
        T1 first;
        T2 second;
    
        xxx()
            :first(T1()), second(T2()) 
        { }
        xxx(const T1& a, const T2& b)
            :first(a), second(b)
        { }
        
        //member template
        template <class U1, class U2>
        pair(const pair<U1, U2>& p)
            :first(p.first), second(p.second)
        { }
    };
    

    9-specialization(模板特化)
    模板特化是模板泛华中的特殊情况。编译器优先匹配特化。
    10-模板偏特化
    1、个数上的偏
    有多个模板参数的模板中,绑定某一个或者多个参数,形如以下的代码。

    template <typename T,typename Alloc=……>
    class xxx
    {
    ……
    };
    template <typename Alloc=……>
    class xxx<bool, Alloc>
    {
    ……
    };
    

    2、范围上的偏
    template <typename T>
    class x
    {
    ……
    };
    template <typename T>
    class C<T*>
    {
    ……
    };//当如果是指针时调用这个版本
    11-模板模板参数
    模板中参数中含有模板
    !!!稍后整理
    12-关于C++标准库
    13-三个主题
    1.variadic templates(数量不定的模板参数)

    template <typename T, typename... Types>
    

    2.auto(编译器推断)
    并不是弱类型,而是去靠编译器去推断。

    auto x;//错误
    auto x=3.0;//正确
    

    3.ranged-base for

    for ( decl : coll)
    {
      statement;
    }
    //例子
    for (int i : {2, 3, 5, 7, 9, 13, 17, 19 })//for_each
    {
      statement;
    }
    vector<double> vec;
    ……
    for (auto elem : vec)
    {
      statement;
    }
    

    14-Reference

    15-符合&继承关系下的构造和析构

    相关文章

      网友评论

          本文标题:C++面向对象高级编程(下) Week 1 (Boolan) b

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