C语言中结构体能不能相加

描述

C语言中,结构体能不能相加?
 
这个问题乍一看好像很简单,但是仔细一想,好像又没这么干过。

写个代码试下:

#include 


struct Test
{
    int a;
    int b;
};


int main()
{
    struct Test t1; 
    struct Test t2; 


    t1 + t2; 


    return 0;
}
 
随便来个结构体,定义两个结构体变量,计算:
t1 + t2;


的值。
编译代码,很显然,报错了:
root@turbo:~# gcc 1.c -o 1
1.c: In function ‘main’:
1.c:14:12: error: invalid operands to binary + (have ‘struct Test’ and ‘struct Test’)
   14 |         t1 + t2;
      |            ^
root@turbo:~#
 

所以结论就是:

C语言中的结构体不支持相加的操作。

原因也很简单,编译器不知道相加的规则:到底是 a 跟 a 相加还是 a 跟 b 相加。

C++  

要解决这个问题,可能只有函数能行。
#include 


struct Test
{
    int a;
    int b;
};


struct Test func(struct Test t1, struct Test t2)
{
    struct Test t;
    t.a = t1.a + t2.a;
    t.b = t1.b + t2.b;


    return t;
}


int main()
{
    struct Test t1;
    struct Test t2;


    //t1 + t2;
    func(t1, t2);


    return 0;
}
 
定义一个函数,参数是两个结构体变量,函数体相当于是你指定的规则,返回的结果也是一个结构体。

不过这个问题要是放在C++里面,那就真的不算问题。

因为C++有专门的机制来解决它,运算符重载,本质也是写个函数。
Test operator+(Test t1, Test t2) 
{
    Test t;
    t.a = t1.a + t2.a;
    t.b = t1.b + t2.b;


    return t;
}
  函数名就叫:operator+。

operator是C++里面的关键字,专门用来给运算符赋予第二个含义。

函数的参数和返回值都是相同类型的结构体,函数体跟我们刚才写的也一样。

唯一不一样的地方,就是调用函数的时候,既可以通过函数名的形式:
operator+(t1, t2);
  也可以直接写成:
t1 + t2;
  这种形式,看起来更加人性化。

编译的时候选择C++的编译器g++,可以顺利通过:
root@turbo:~# g++ test.cpp -o test
root@turbo:~#
 
当然了,我们在C++里面写代码,更多时候用的是class,成员变量给个私有属性,因为要在函数里面访问类的私有成员变量,所以把它声明成友元函数,这样看起来就顺眼的多。
class Test
{
private:
    int a;
    int b;
public:
    Test operator+(Test t)
    {   
        Test tmp;
        tmp.a = this->a + t.a;
        tmp.b = this->b + t.b;


        return tmp;
    }   
};
加法运算符不仅能重载友元函数,还能重载成成员函数。然后还会涉及构造函数、析构函数、this指针等等一大堆机制。所以,你觉得C语言和C++,哪个更复杂一些?    

 

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分