首页 > 编程语言 >C++ struct和class的异同、C中和C++中struct的异同

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

时间:2024-09-29 23:48:21浏览次数:11  
标签:struct 异同 成员 C++ class public 构造函数

一、前言

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

标签:struct,异同,成员,C++,class,public,构造函数
From: https://blog.csdn.net/han2205277149/article/details/142631701

相关文章

  • C++ string的基本运用详细解剖
    string的基本操作一.与C语言中字符串的区别二.标准库中的string三.string中常用接口的介绍1.string中常用的构造函数2.string类对象的容量操作函数3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类的非成员函数6.string中的其他一些操作一.与C语言......
  • AVLTree【c++实现】
    目录AVL树1.AVL树的概念2.AVLTree节点的定义3.AVLTree的插入4.AVLTree的旋转4.1左单旋4.2右单旋4.3左右双旋4.4右左双旋5.AVLTree的验证6.AVLTree的性能AVL树AVLTree的代码实现连接:AVLTree代码链接1.AVL树的概念学习了二叉搜索树之后,我们知道二叉搜索树虽可以......
  • C++ list容器的使用介绍
     前言:list的底层结构是一个带头双向循环链表,string和vector平时我们用到的比较多,相对于string容器和vector容器,我们对于list相对来说稍微陌生一些,通过文章的介绍和和以后使用到此容器后有遗忘的点,通过官方文档的查阅,加强对于list容器的认识。内容摘要:本文包含四种构造......
  • C++:数据类型
    1C++  1.1什么是C++语言呢?    C++语言是面向过程编程的高级语言,同时也可以向高级语言一样面向对象编程,泛型编程;    C++语言派生自C语言,所以C++语言可以向下兼容C语言;C++相比C,扩展了面向对象编程,泛型编程;    C++语言大小写敏感,支持ANSI标准;    G++编译器......
  • C++ 函数
    定义函数实例函数声明调用函数函数参数参数的默认值Lambda函数与表达式函数是一组一起执行一个任务的语句。每个C++程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。您可以把代码划分到不同的函数中。如何划分代码到不同的函数......
  • 南沙C++信奥赛陈老师解一本通题 1922:【03NOIP普及组】乒乓球
    ​ 【题目描述】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不......
  • C++中的多态(详细讲解)
    目录一、多态的概念1、多态的概念二、多态的定义以及实现1、多态的构成条件2、虚函数3、虚函数的重写1)虚函数重写的理解 2)虚函数重写的两个例外1.协变(基类与派生类虚函数返回值类型不同)2.析构函数的重写(基类与派生类析构函数的名字不同) 4、关键字override......
  • C++ | Leetcode C++题解之第445题两数相加II
    题目:题解:classSolution{public:ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){stack<int>s1,s2;while(l1){s1.push(l1->val);l1=l1->next;}while(l2){......
  • C++ | Leetcode C++题解之第443题压缩字符串
    题目:题解:classSolution{public:intcompress(vector<char>&chars){intn=chars.size();intwrite=0,left=0;for(intread=0;read<n;read++){if(read==n-1||chars[read]!=chars[read......
  • C++实现简单的tcp协议
    Server.cpp#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#pragmacomment(lib,"ws2_32.lib")constintPORT=8888;constintBUFFER_SIZE=1024;intmain(){WSADATAwsaData;intiResult=WSAStartu......