(1)结构体
C++中除了支持Struct结构体以外还支持class结构体,在工程中一般用struct定义纯数据类型,用class定义拥有复杂行为的类型,事实上在C++中两者最主要的区别是默认访问权限和继承方式不同,其他方面的差异很小。
结构体具有许多功能,也十分的复杂。
①结构体除了可以包含成员变量,还可以包含成员函数。
②结构体可以定义操作。
给出一段代码:
#include <iostream>
using namespace std;
struct Point
{
int x,y;
Point(int x=0, int y=0):x(x),y(y){}
/*在结构体中定义了一个函数,函数名为Point 无返回值,这样的函数称为构造函数(ctor)
在定义时有=0字样说明,若在使用结构体时不进行定义则默认为0
“:x(x),y(y)”是一个简化的写法表示“把成员变量x初始化为参数x,y初始化为y”
同样的写法:*/
//Point(int x=0,int y=0){this->x=x;this->y=y;}//this 是指向当前结构体的指针
};
Point operator + (const Point& A,const Point& B)
{
return Point(A.x+B.x,A.y+B.y);
//定义了对Point结构体执行操作“+”加 的处理方法:返回Point结构体中的x,y为相加结构体中x,y分别相加
}
ostream& operator << (ostream &out,const Point& p)
{
out<<"("<<p.x<<","<<p.y<<")";
return out;
//重载了输出操作流,使得结构体可以直接输出:cout<<p;输出样式是:(x,y)
}
int main()
{
Point a, b(1,2);//易知a是(0,0)
a.x=3;
cout << a+b <<endl;
return 0;
}
这段代码中Point表示二维平面点坐标,输出形式为(x,y),加的形式为(x1+x2,y1+y2)
运行后输出的结果为:(4,2)
要注意的是,对结构体我们只定义了+,并未定义其他运算,如+=,都是不被理解的。
(2)模板
模板的使用可以不受数据类型限制。
如:
int sum(int *begin,int *end)
{
int *p=begin;
int ans=0;
for(int *p = begin; p != end; p++)
ans += *p;
return ans;
}
这段代码显然必须要求输入数据为整数,对于double类型或其他类型,则不能使用该函数求和。对此问题我们可以用模板解决。
template<typename T>//template 中文意思为模板
T sum(T *begin,T *end)
{
T *p=begin;
T ans=0;
for(T *p = begin; p != end; p++)
ans = ans + *p;
return ans;
}
将int全部换成T,T表示任意相同的类型。
这样调用函数时就可以对任意类型包括结构体进行运算了。
如上面定义的Point类型。
结构体和类(class)也是可以带模板的。
例如我们把刚才定义结构体的代码进行改写。
#include <iostream>
using namespace std;
template <typename T>
struct Point
{
T x,y;
Point(T x=0, T y=0):x(x),y(y){}
};
template <typename T>
Point<T> operator + (const Point<T>& A,const Point<T>& B)
{
return Point<T>(A.x+B.x,A.y+B.y);
}
template <typename T>
ostream& operator << (ostream &out,const Point<T>& p)
{
out<<"("<<p.x<<","<<p.y<<")";
return out;
}
int main()
{
Point<int> a(1,2),b(3,4);
Point<double> c(1.1,2.2), d(3.3,4.4);
cout << a+b <<" " << c+d << "\n";
return 0;
}
⭐定义结构体后面的“;”不能少⭐
得到结果:
模板的功能很强大,理解模板后有助于更好地理解STL的内容,从下一节起将进入STL初步的内容。
晚安~