一、struct和class的区别
1、struct默认是public,class默认是private。
2、struct默认不会初始化成员。
二、template - 模板
1、function template -函数模板
函数参数类型、返回值类型不确定,可以利用template书写函数模板。
实际上,可以看作多个重载函数的集合。传入参数为数据类名。
示例:比较两值的大小
template<typename T> T maxValue(const T& a,const T& b){
renturn a>b? a:b;
}
ps:class Vs typename,
在template的调用中,class和typename可以视作相同。
typename还可用于避免歧义,添加在嵌套从属名称前。
也可在template后换行
template<typename T>
T maxValue(const T& a,const T& b){
renturn a>b? a:b;
}
调用示例:
int a =3 , b = 4;
maxValue(a,b);
//为了提高代码可读性可以在调用时声明需要引用的数据类型
maxValue<int>(a,b);
2、class template -类模板
与函数模板类似,将数据类型或者需要用到的参数传入自定义的类型中。
示例:(自定义Vec类型),利用模板方便一次性定义多种Vec,将Vec的维数当作参数传入template模板中,实现代码的简化
template<int n> struct vec {
double data[n] = {0};
double& operator[](const int i) { assert(i>=0 && i<n); return data[i]; }
double operator[](const int i) const { assert(i>=0 && i<n); return data[i]; }
double norm2() const { return *this * *this; }
double norm() const { return std::sqrt(norm2()); }
};
其中n代表需要定义的Vec的维数
使用示例:(定义Vec2)与函数模板类似,在定义vec类型时,传入template需要的参数或者数据类型。
template<> struct vec<2> {
double x = 0, y = 0;
double& operator[](const int i) { assert(i>=0 && i<2); return i ? y : x; }
double operator[](const int i) const { assert(i>=0 && i<2); return i ? y : x; }
double norm2() const { return *this * *this; }
double norm() const { return std::sqrt(norm2()); }
vec<2> normalized() { return (*this)/norm(); }
};
三、语法糖
一种简化代码的行为,使代码更加易读、易懂。
1、操作符重载:为自定义的数据类型重载加减乘除等操作符
示例:(定义Vec的[])
double& operator[](const int i) { assert(i>=0 && i<n); return data[i]; }
double operator[](const int i) const { assert(i>=0 && i<n); return data[i]; }
四、assert -断言检查
需要包含cassert头文件
在程序执行过程中进行断言检查,满足条件后程序得以继续运行,否则将会出现报错信息。通常用于调试。
示例:(定义Vec[])确保参数不超过数组边界
double& operator[](const int i) { assert(i>=0 && i<n); return data[i]; }
double operator[](const int i) const { assert(i>=0 && i<n); return data[i]; }