C++ 类和结构体的对比

我一开始只学习过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:

  1. C++中的类和结构体都可以继承,struct可以继承class,同样class也可以继承struct。
  2. C++中的类和结构体都可以封装,两者都可以包含成员变量和成员方法,都可以具有构造函数和析构函数。
  3. C++中的类和结构体都可以多态,允许成员函数是虚函数可以多态。
  4. C++中的类和结构体都具有访问控制,都可以用public、protected、private修饰其成员变量和成员方法。
  5. 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 在子类中隐藏 在子类中隐藏 在子类中隐藏

总之,当你显式指定各自的访问权限时,两者就会变得相同。所以,对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,可以避免一些不必要的麻烦,也让你的代码更具可读性。

猜你喜欢

转载自blog.csdn.net/iNamePro/article/details/84994463