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

2020-04-24  本文已影响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};
};

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

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

上一篇下一篇

猜你喜欢

热点阅读