美文网首页
C++模板、常函数、&操作符、枚举类型

C++模板、常函数、&操作符、枚举类型

作者: 哦小小树 | 来源:发表于2020-04-24 21:14 被阅读0次

    0x01模板方法

    • 定义
    template <typename T>
    inline T const& Max(T const& a, T const& b)
    {
        return a < b ? b : a;
    }
    
    • 使用
    int i = 10;
    int j = 4;
    int c = Max(i, j);
    int d = Max<int>(i, j);
    

    0x02 模板类

    • 定义
    template <class T1, class T2>
    class Pair
    {
    public:
        T1 key; // 关键字
        T2 value;   // 值
        Pair(T1 k, T2 v):key(k), value(v) {};
        bool operator < (const Pair<T1, T2> &p) const;
    };
    
    template<class T1, class T2>
    bool Pair<T1, T2>::operator < (const Pair<T1, T2> &p) const
    {
        // p.value = 10; 如果打开注释会报错,因为是常函数,不能修改属性
        return this->value < p.value;
    }
    
    • 使用
    // 创建两个对象
    Pair<string, int> dog("age",1);
    Pair<string, int> cat("age",2);
    
    if (cat < dog) {
        cout << "狗比较厉害" << endl;
    } else {
        cout << "猫猫更威猛" << endl;
    }
    
    注意

    bool Pair<T1, T2>::operator < (const Pair<T1, T2> &p) const; 尾部有一个const,有什么用处呢?

    class A
    {
    public:
        int x;
        A(int x):x(x) {};
        void changeValue() const {
            x = 11;  
    /*Cannot assign to non-static data member within 
     const member function 'changeValue'
     如果需要修改成员变量,移除尾部const即可
    */  
        }
    };
    
    

    C++函数声明中,尾部的const是限定函数类型为常成员函数。

    常成员函数:不能改变对象成员变量值的函数。

    可以理解为”只读“函数。它既不能更改数据成员的值,也不能调用那些能引起数据成员值变化的成员函数,只能调用const成员函数


    0x03 地址操作符[&]

    int func(int b) {
        return b + 10;
    }
    
    int a = 10;
    func(a)  # 这样是将a的值传入函数中
    
    int func(int& b) {
        return b + 10;
    }
    
    int a = 10;
    
    # 当调用时,没有这个赋值的过程,因为此时b是是实参的别名,相当于直接操作了实参a
    func(a);  
    

    从这个例子可以看出引用的两个特性:

    • 节约空间,少了一个实参赋值给形参的过程
    • 可以直接操作实参,而不是形参

    既然是引用传递,那么就很方便改写引用数据。


    0x04 类中枚举

    使用如下

    class ClassA
    {
    public:
        int x;
        enum {TESTA = 1024, TESTB = 3*3};
    };
    

    目的: 我们希望创建一些常量只能在类中有效

    • #define为什么不行
      由于#define定义的宏常量是全局的,不能达到目的。

    • const为啥也不行
      而是用常量const来声明的话,那这个变量在某个对象生存期内是常量。
      但是对于整个类来说是可变的,因为类可以创建多个对象。不同的对象对其const数据成员的值可以不同。

    • 枚举可以`
      而枚举常量可以满足我们的需求,枚举常量不会占用对象的存储空间,他们在编译时被全部求值。

    枚举常量的缺点是:它的隐含数据类型是整数,最大值有限。

    相关文章

      网友评论

          本文标题:C++模板、常函数、&操作符、枚举类型

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