Friday, February 11, 2022

[c++] struct和class的區別

C++中的struct是对C中的struct进行了扩充,所以增加了很多功能,主要的区别如下图所示:

cc++
成員函數不能可以
靜態成員不能可以
防控屬性預設 public,不能修改public/private/protected
繼承關係不可以繼承可以有類或其它結構體繼承
初始化不能直接初始化數據成員可以

使用過程:

在C中使用结构体时需要加上struct,或者对结构体使用typedef取别名,而C++可直接使用,例如:

================================================================

结构体声明,C和C++使用同一个

struct Student

{

int  iAgeNum;

string strName;

}

typedef struct Student Student2;//C中取别名


struct  Student  stu1; //C中正常使用

Student2   stu2; //C中通过取别名的使用

Student    stu3; //C++使用

================================================================

C与C++实际上编程思想的区别,C是面向过程,C++面向对象

所以在C中结构体就是不同类型数据的集合,并不涉及算法和操作。

而C++是把数据变量及对这些数据变量的相关算法和操作给封装起来


區別 1:内部成员变量及成员函数的默认防控属性

struct 默认防控属性是 public 的,而 class 默认的防控属性是 private 的,例如:

================================================================

struct A

{

int iNum;

}

class B

{

int iNum;

}

A a;

a.iNum = 2; //没有问题,默认防控属性为public

B b;

b.iNum = 2; //编译出错,默认防控属性为private

================================================================

區別 2:默认的继承权限

在继承关系,struct默认是public的,而class是private,例如:

================================================================

struct A

{

int   iAnum;

}

struct B : A

{

int   iBnum;

}

A a;

a.iAnum = 1; //在struct情况下是正确的,在class情况下是错误的

================================================================

struct的情况下B是默认public继承A的。如果将上面的struct改成class,那么B是private继承A的。

上面的列子都是struct继承struct,class继承class,那么class与struct继承会怎样呢?结论是:默认的防控属性取决于子类而不是基类,例如:

================================================================

struct A{};

class B : A {}; //默认为private继承

struct C : B{}; //默认为public继承

================================================================

所以我们在写代码的时候,为了不引起歧义,最好指明继承的方式,而不要用默认的继承,例如:

================================================================

class B : public A{};

struct B : public A{};

================================================================

區別 3:模板中的使用

class这个关键字还可用于定义模板参数,就像typename。但是strcut不用与定义模板参数,例如:

template<typename T> ok

template<class T> ok

template<struct T> not ok

================================================================

template< typename T, typename Y > //可以把typename 换成 class

int  Func( const T& t, const Y& y )

{

//TODO

}

================================================================

區別 4:模板中的使用

struct在C语言中:

在C语言中,我们知道struct中是一种数据类型,只能定义数据成员,不能定义函数,这是因为C语言是面向过程的,面向过程认为数据和操作是分开的,所以C语言中的struct可以直接使用大括号对所有数据成员进行初始化

================================================================

struct test

{

    int a;

    int b;

};

//初始化

test A={1,2};//完全可以

================================================================

在C++中:

在C++中对struct的功能进行了扩展,struct可以被继承,可以包含成员函数,也可以实现多态,当用大括号对其进行初始化需要注意:

当struct和class中都定义了构造函数,就不能使用大括号对其进行初始化
若没有定义构造函数,struct可以使用{ }进行初始化,而只有当class的所有数据成员及函数为public时,可以使用{ }进行初始化
所以struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。
加入一个构造函数或是一个虚函数会使strcut更体现出一种对象的特性,而使{}操作不在有效

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能