欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > C++ struct和class的异同、C中和C++中struct的异同

C++ struct和class的异同、C中和C++中struct的异同

2024/10/24 19:26:39 来源:https://blog.csdn.net/han2205277149/article/details/142631701  浏览:    关键词:C++ struct和class的异同、C中和C++中struct的异同

一、前言

  1. C++中的struct结构体和C语言中的struct结构体差异较大。
  2. C++中的struct结构体和C++中的class类极为相似。

二、C++的struct和class

1.相同点 

         (1)成员

         struct和class都可以在主体中定义成员变量和成员函数!两者在定义成员变量和成员函数上的方式完全一致。

struct S 
{int x;void f() {  //函数体}
};/***************************************************************************/class C 
{int x;void f() {//函数体}
};

         (2)构造函数和析构函数

        structclass都可以有构造函数、析构函数、拷贝构造函数、移动构造函数等。它们的使用方法完全一致。

struct S 
{S() {//构造函数}~S() {//析构函数}
};/***************************************************************************/class C 
{C() {//构造函数}~C() {//析构函数}
};

        (3)封装

         struct和class都具有封装特性,都可以通过访问修饰符public、protected和private来控制外界的访问权限。

struct S
{
public:/*公有区域*/protected:/*受保护区域*/private:/*私有区域*/};/***************************************************************************/class C
{public:/*公有区域*/protected:/*受保护区域*/private:/*私有区域*/};

        (4)继承

        structclass 都支持继承,可以使用单继承或多继承。

struct A : public B, protected C, private D
{//结构体A继承自B、C、D
};/***************************************************************************/class E : public F, protected G, private H
{//类E继承自F、G、H
};

        (5)多态 

         struct和class都支持多态,可以使用virtual关键字声明虚函数。

struct S 
{virtual void f() {}
};/***************************************************************************/class C
{virtual void f() {}
};

         (6)运算符重载

         structclass都支持运算符重载,这让结构体和类可以像内置类型一样参与运算。例如,重载+运算符,使得两个结构体或者两个类可以相加:

struct S 
{int x, y;S operator+(const S& other_S) {return {x + other_S.x, y + other_S.y};}
};/***************************************************************************/class C
{int x, y;C operator+(const C& other_C) {return {x + other_C.x, y + other_C.y};}
};

        (7)模板支持

        struct和class都可以与模板结合使用,从而创建泛型数据结构。

template<typename T>
struct Pair 
{T first, second;Pair(T a, T b) : first(a), second(b) {}  //带初始化列表的构造函数
};Pair<int> intPair(1, 2);                     //定义一个Pair结构体/***************************************************************************/template<typename T>
class Pair
{T first, second;Pair(T a, T b) : first(a), second(b) {}   //带初始化列表的构造函数
};Pair<int> intPair(1, 2);                      //定义一个Pair对象

 2.异同点

        (1)封装 

         class成员的默认访问权限是private,而struct成员的默认访问权限是public。

struct S
{/*公有区域*/     //不同点public:/*公有区域*/protected:/*受保护区域*/private:/*私有区域*/};/***************************************************************************/class C
{/*私有区域*/     //不同点public:/*公有区域*/protected:/*受保护区域*/private:/*私有区域*/};

         (2)继承

        class的默认继承方式是private,而struct的默认继承方式是public。

struct Base_S 
{
};struct Derived_S : Base_S
{//未指定继承方式,默认是 public 继承
};/***************************************************************************/class Base_C  
{
};class Derived_C : Base_C
{//未指定继承方式,默认是 private 继承
};

3.总结

        C++中,struct和class几乎完全相同, 只有成员的默认访问权限和继承时的默认继承方式不同。从技术角度来说,structclass 可以做同样的事情。

        C++ 中,struct 通常用于表示简单的数据结构,更像是 C 语言中的struct,仅包含数据成员,少量或不包含成员函数。

        C++中,class则通常用于表示具有更多功能的复杂对象,不仅包含数据成员,还有操作这些数据的成员函数,以及面向对象的特性,如封装、继承和多态。

        当然了,这只是一种约定俗成的用法。在实际开发中,structclass 之间的选择通常是基于习惯和上下文的,而非硬性规则。

三、C++的struct和C的struct 

1.相同点

        (1)基本语法 

        C++的struct和C的struct的基本定义语法和使用语法一样 ,如:

struct Point     //结构体定义
{int x;int y;
};Point p;         //结构体使用p.x = 10;
p.y = 20;

         (2)成员

        C++的struct和C的struct都可以包含数据成员。这些数据成员可以是任意基本数据类型(例如intfloatchar等),或者是其他复杂类型。 

        (3)支持指针操作 

        C++的struct和C的struct的指针操作也是相同的。可以定义一个指向struct的指针,并通过指针访问结构体的成员。 

struct Point 
{int x;int y;
};Point p1 = {10, 20};
Point* p = &p1;p->x = 30;        // 通过指针访问成员

        (4)支持数组 

         C++的struct和C的struct可以包含数组成员,或被定义为一个数组类型。

2.异同点 

        (1)成员 

        在C++中,struct不仅可以包含数据成员,还可以包含函数成员。这使得C++中的struct更像是class,具备面向对象的能力。 在C中,struct只能包含数据成员,不能包含函数成员。

        (2)构造函数和析构函数 

        在C++中,struct可以定义构造函数和析构函数,用于对象的初始化和销毁。在C中,struct不支持这些特性,结构体的初始化必须通过手动赋值来完成。 

        (3)封装 

        在C++中,struct支持访问修饰符(publicprotectedprivate)。在C中,不存在这种访问控制机制。C的struct成员默认都是public(可以从外部访问),而C++中的struct默认也是public,但可以通过访问控制符号修改其成员的访问权限。 

        (4)继承 

        在C++中,struct可以像class一样,支持继承,允许从一个struct继承另一个struct。在C中,struct不支持继承。

        (5)多态 

         在C++中,struct可以像class一样,支持多态,可以使用虚函数,对虚函数进行重写。在C中,struct不支持多态

        (6)运算符重载 

         在C++中,struct可以像class一样,支持运算符重载,这让结构体可以像内置类型一样参与运算。在C中,struct不支持运算符重载。

        (7)模板支持 

        在C++中,struct可以与模板结合使用,从而创建泛型数据结构。在C中,没有模板的概念,struct自然也不支持模板。 

3,总结 

        C中的struct主要用于聚合不同的数据类型,类似于容器,用于存储和管理数据,但不具备任何面向对象的功能。 

        C++中的struct不仅可以像C语言一样使用,还具备了面向对象的特性,可以定义成员函数、构造函数、继承和多态等高级功能。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com