C/C++结构体和类的对比

19 篇文章 0 订阅

C/C++结构体和类的对比

前言

对于类和结构体的区别其实还是很小的,但是总有初学者或者很多年开发经验的工程师搞不清楚!(吐槽:前段时间和某公司开发人员沟通,他居然对这个能搞错,还深信不疑的说他说的对,我的不对,还说让我在环境上试一下,就离谱!他一直这么勇的?)

首先我先来对比C和C++中的结构体!

在C语言中的结构体和C++中的结构体百分之90是一样的。C语言中结构体中不能定义函数及函数的声明,而C++中是可以的!

直接看代码

// struct.c
#include <stdio.h>

struct A
{
    int x;
    void func(int val);
    void func1(int val)
    {
        printf("val = %d\n", val);
    }
};

int main()
{
    struct A a;
    return 0;
}

编译结果

gcc struct.c 
struct.c:6:10: error: field ‘func’ declared as a function
     void func(int val);
          ^~~~
struct.c:8:5: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token
     {
     ^

直接报错!但是你别说用 g++ struct.c没问题!使用g++虽然可编译通过,但是你在编写代码时候,在编辑器上就报错了,使用结构体变量都访问不到函数,何必呢?而且g++就是编译c++的!支持c++对结构体的扩展的解析。

把上面的代码改成c++的就没问题,使用g++编译不会出现报错。编辑器也不会检查出错误!

还有对于C语言中不具有面向对象的思想,结构体中写private、protected、public也是不被识别的!

C++中对结构体成员还扩展了,可以在结构体中直接对成员变量、成员函数初始化操作!

虽然C语言结构体中不能定义、声明函数,但是可以定义函数指针来调用函数!

代码来:

#include <stdio.h>

void test(int val)
{
    printf("test val = %d\n", val);
}

int test1(int val1, int val2)
{
    return val1 * val2;
}

typedef void (*func)(int);

struct A
{
    int x;
    func f;
    int (*func1)(int, int);
};

int main()
{
    struct A a;
    a.f = test;
    a.f(10);

    a.func1 = &test1;
    printf("a.func1(5, 2) = %d\n", a.func1(5, 2));

    return 0;
}

运行结果:

test val = 10
a.func1(5, 2) = 10

由于c++中结构体和类相似,类可以直接使用类名来创建对象,结构体也是可以的,如:

// C++
struct A {
	...
};
A a; // 在c++中是允许的,但是在C语言中如果没有使用typedef关键字创建别名,是不被允许这么写的。

// C
typedef struct A {
	...
}A1;

A1 a1; //这种是允许的,等同于struct A a1;
对比总结
对比CC++
初始化数据成员不能被初始化可以,无论成员变量还是成员函数
静态数据不可以可以
访问权限公有权限,不可以设置其它访问权限公有权限,可以设置其它访问权限
继承不可以被继承可以被继承
定义函数不可以,但是可以定义函数指针可以
空结构体大小01
下面来对比一下C++中类和结构体的区别

先说结论再看代码

  1. 结构体中可以和类一样定义函数,默认情况下结构体中的所有成员是public访问权限,而类默认是private!
  2. struct继承默认是public,class默认是private,如混合交叉继承,则访问权限取决于派生类,如struct权限是public;class权限是private!

结论一代码示例:

#include <iostream>

using namespace std;

struct A
{
    int x = 10;
    void func1(int val)
    {
        cout << "A::func1 val = " << val << endl;
    }
};

class B
{
    int x = 11;
    void func(int val)
    {
        cout << "B::func val = " << val << endl;
    }
};

int main(int argc, char **argv)
{
    A a;
    B b;
    cout << "a.x = " << a.x << endl;
    cout << "b.x = " << b.x << endl;
    return 0;
}

编译结果:

structVSclass.cc:28:27: error: ‘int B::x’ is private within this context
     cout << "b.x = " << b.x << endl;

结论二代码示例:

#include <iostream>

using namespace std;

struct A
{
    int x = 10;
    void func1(int val)
    {
        cout << "A::func1 val = " << val << endl;
    }
};

struct A1 : A
{
    int a1 = 2;
};

// struct默认继承是public方式
class B
{
public:
    int x = 11;
    void func(int val)
    {
        cout << "B::func val = " << val << endl;
    }
};

// class默认继承是private方式
class B1 : B
{
public:
    int B1 = 5;
};

// 结构体继承于类,访问权限是共有方式
struct C : B
{
};

// 类继承结构体,访问权限是私有方式
class D : A
{
};

int main(int argc, char **argv)
{
    A1 a1;
    B1 b1;
    cout << "a.x = " << a1.x << endl;

    // class默认采用私有继承所以没法访问基类的的成员,会报错
    // cout << "b.x = " << b1.x << endl;

    C c;
    D d;
    cout << "c.x = " << c.x << endl;

    // 类继承结构体,访问权限是私有方式,所以d无法访问A中的x成员
    // cout << "d.x = " << d.x << endl;

    return 0;
}

总结:C++中class和struct区别并不大,class基本涵盖了struct的所有功能,c++中保留了struct为了兼容c,所以c++中具体使用啥看自己的习惯吧!不过还是建议如果想要封装一些数据构成一个整体,struct可能比较方便!

如果本文对你有帮助,记得一键三连哦!

本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值