美文网首页
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