C++中的结构体

C++中的结构体

浅看结构体

C++除了支持struct以外,还支持class,不需要像C那样用typedef的方式定义一个struct

在C++中,structclass几乎没有任何区别,与C不同,在C++里,struct可以拥有成员函数。其与class的区别主要由以下几点:

  1. 默认访问权限:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的;
  2. class 继承默认是 private 继承,而 struct 继承默认是 public 继承;

在工程中,一般用struct定义“纯数据”的类型,只包含较少的辅助成员函数,用class定义“拥有复杂行为”的类型。

下面是一个例子

#include <iostream>

/* 定义结构体Point */
struct Point {
    int x, y;
    /* 构造函数简单写法 */
    Point(int x = 0, int y = 0) : x(x), y(y) {}
    // 构造函数还可以写成下面的形式
    // Point(int x = 0, int y = 0) { this->x = x, this->y = y };
};

/* 定义Point “+” 运算符 */
Point operator + (const Point& A, const Point& B) {
    return Point(A.x + B.x, A.y + B.y);
}
/* 定义Point “-” 运算符 */
Point operator - (const Point& A, const Point& B) {
    return Point(A.x - B.x, A.y - B.y);
}
/* 定义Point流输出方式 */
std::ostream& operator << (std::ostream& out, const Point& p) {
    out << "(" << p.x << "," << p.y << ")";
    return out;
}

int main(){
	Point a, b(1, 2);
    a.x = 3;
    std::cout << a + b << "\n" ;
	return 0;
}

上述代码中,结构体Point中定义了一个函数Point(),没有返回值,是结构体Point的构造函数。构造函数是在声明变量(结构体/对象)时调用的。Point a, b(1, 2)分别调用了Point()Point(1, 2)Point(int x = 0, int y = 0)中“=0”的含义是默认值为0,Point()相当于Point(0, 0): x(x), y(y)是一个简单的写法,表示把成员变量x初始化为参数x,变量y同理。也可以写成:

Point(int x = 0, int y = 0) { this->x = x, this->y = y };

这里的this是指向当前对象的指针。

接下来的代码分别定义了结构体Point的加法、减法和流输出操作,使ab可以进行加减操作和cout << 操作。

在结构体中使用模板

定义一个求数组和的函数sum(),一般的写法如下:

/* 普通的sum函数,比较局限,只能求整数数组的和 */
int sum(int* begin, int* end) {
    int* p = begin;
    int ans = 0;
    for (int *p = begin; p != end; p++)
        ans += *p;
    return ans;
}

这个函数没有语法错误,但是比较局限,它只能求整数数组的和,无法求doublefloat等类型数组的和,更别提Point类型的和了。可以把sum()函数进行如下改进:

/* 使用模板改进sum函数,改进后可以求double、Point等类型的和 */
template<typename T>
T sum(T* begin, T* end) {
    T* p = begin;
    T ans = 0;
    for (T *p = begin; p != end; p++)
        /* 注意这里把 ans += *p; 改成了ans = ans + *p; */
        /* 这样做的原因是Point类型没有定义“+=”运算符 */
        ans = ans + *p;
    return ans;
}

注意改进后的sum()函数与之前sum()的不同,将int替换成了模板T。特别注意把 ans += *p; 改成了ans = ans + *p;,因为Point在之前并未定义+=操作。

这样,可以使用sum()函数给double数组和Point数组进行求和了。

int main()
{
    double a[] = { 1.1, 2.2, 3.3, 4.4 };
    std::cout << sum(a, a + 4) << std::endl;
    Point b[] = { Point(1, 2), Point(3, 4), Point(5, 6), Point(7, 8)};
    std::cout << sum(b, b + 4) << std::endl;
}

结构体和类也可以带模板。

上面Point中的xyint类型,有时也需要double或者别的类型,+<<的逻辑不变,可以用类似的写法把Point变为模板:

/* Point结构体中带模板 */
template <typename T>
struct Point {
    T x, y;
    Point(T x = 0, T y = 0) :x(x), y(y) {}
};
/* 定义Point “+” 运算符 */
template <typename T>
Point<T> operator + (const Point<T>& A, const Point<T>& B) {
    return Point(A.x + B.x, A.y + B.y);
}
/* 定义Point “-”运算符 */
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);
}
/* 定义Point流输出方式 */
template <typename T>
std::ostream& operator << (std::ostream& out, const Point<T>& p) {
    out << "(" << p.x << "," << p.y << ")";
    return out;
}

这样,就可以同时使用int类型和double类型的Point了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值