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语言一样使用,还具备了面向对象的特性,可以定义成员函数、构造函数、继承和多态等高级功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值