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
数据成员的值可以不同。 -
枚举可以`
而枚举常量可以满足我们的需求,枚举常量不会占用对象的存储空间,他们在编译时被全部求值。
枚举常量的缺点是:它的隐含数据类型是整数,最大值有限。
网友评论