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;
对比总结
对比 | C | C++ |
---|---|---|
初始化 | 数据成员不能被初始化 | 可以,无论成员变量还是成员函数 |
静态数据 | 不可以 | 可以 |
访问权限 | 公有权限,不可以设置其它访问权限 | 公有权限,可以设置其它访问权限 |
继承 | 不可以被继承 | 可以被继承 |
定义函数 | 不可以,但是可以定义函数指针 | 可以 |
空结构体大小 | 0 | 1 |
下面来对比一下C++中类和结构体的区别
先说结论再看代码
- 结构体中可以和类一样定义函数,默认情况下结构体中的所有成员是public访问权限,而类默认是private!
- 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可能比较方便!
如果本文对你有帮助,记得一键三连哦!
本人能力有限,如有错误,望不吝指正;原创不易,欢迎转载,转载请注明出处!