我一开始只学习过C语言中的结构体,并且认为C++里的结构体和C里的是一样的,在C++中也一直按照C的方式使用结构体。但我后来发现,C++中的结构体和类在语法上好像没什么两样,给我造成了很大困惑。究竟C++中的类和结构体有何异同?要解决这个问题,让我们先从C中的结构体说起。
C语言中的结构体
(1)由于C语言是面向过程的,所以C中的结构体就不存在面向对象的任何特点:不能继承;不能封装;不能多态;不存在访问控制,只有作用域。
(2)C语言中的结构体只能定义数据,而不不能定义方法,虽然C语言的结构体中不能定义函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针。
(3)C语言中的结构体不能为空,否则会报错。定义一个结构体的变量时,结构体名前的struct关键字不能省略,否则会报错。
struct A
{
int num;
};
int main()
{
struct A a = { 1 };
}
C++中的类和结构体
C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,具有class的特性,而class也可用作struct:
- C++中的类和结构体都可以继承,struct可以继承class,同样class也可以继承struct。
- C++中的类和结构体都可以封装,两者都可以包含成员变量和成员方法,都可以具有构造函数和析构函数。
- C++中的类和结构体都可以多态,允许成员函数是虚函数可以多态。
- C++中的类和结构体都具有访问控制,都可以用public、protected、private修饰其成员变量和成员方法。
- C++中的类和结构体都是按指传递的。另外,都可以同过彼此的方式初始化(此时情况较多,读者可自行总结)。
class A
{
public:
int a;
int b;
};
struct B
{
int a;
int b;
B(int a, int b)
{
(*this).a = a;
(*this).b = b;
}
};
int main()
{
A a = { 1, 2 }; //A是类
B b(1, 2); //B是结构体
return 0;
}
而struct和class之间最本质的一个区别就是默认的访问控制: struct默认的数据访问控制是public的,而class默认的成员变量访问控制是private的。
在继承方面,struct可以继承class,class同样可以继承struct。但是,struct默认是public继承,class默认是private继承。也就是说,在不指定继承方式时,struct是public继承父类的,class是private继承父类的,无论父类是class还是struct。具体继承规则如下:
基类成员的访问权限 | public继承 | protected继承 | private继承 |
public | 在子类中为public | 在子类中为protected | 在子类中为private |
protected | 在子类中为protected | 在子类中为protected | 在子类中为private |
private | 在子类中隐藏 | 在子类中隐藏 | 在子类中隐藏 |
总之,当你显式指定各自的访问权限时,两者就会变得相同。所以,对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,可以避免一些不必要的麻烦,也让你的代码更具可读性。