003 C++与STL入门(2):结构体struct/class、模板template的使用

(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)

6da2fa2cca67ac49c6d4ec17b5bd4c1e.png

要注意的是,对结构体我们只定义了+,并未定义其他运算,如+=,都是不被理解的。

(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;
}

⭐定义结构体后面的“;”不能少⭐

得到结果:

50460e3ecbfd42292a61b72d6d163e07.png

模板的功能很强大,理解模板后有助于更好地理解STL的内容,从下一节起将进入STL初步的内容。

晚安~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值