首页 > 其他分享 >struct 和 class 的异同

struct 和 class 的异同

时间:2024-06-30 23:56:32浏览次数:17  
标签:struct 异同 默认 public 访问控制 int class

在C++编程语言中,structclass是两个定义数据类型的关键字。尽管它们看起来相似,但它们之间有一些关键的异同。

基本定义

struct

struct是从C语言继承而来的,它用于定义一个结构体(structure),结构体是由多个数据成员组成的一种用户自定义数据类型。在C++中,struct不仅仅用于定义数据成员,还可以包含成员函数。

struct MyStruct {
    int data1;
    float data2;

    void display() {
        std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
    }
};

class

class是C++中的一个核心概念,用于定义一个类。类是面向对象编程的基本构建块,除了可以包含数据成员,还可以包含成员函数、访问控制修饰符、构造函数、析构函数、以及其他特性。

class MyClass {
    int data1;
    float data2;

public:
    MyClass(int d1, float d2) : data1(d1), data2(d2) {}

    void display() {
        std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
    }
};

访问控制

struct的访问控制

struct中,默认的访问控制级别是public。这意味着,如果没有显式地声明成员的访问控制级别,这些成员是公开的,可以被外部代码访问。

struct MyStruct {
    int data1;  // 默认是public
    float data2;

    void display() {  // 默认是public
        std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
    }
};

class的访问控制

class中,默认的访问控制级别是private。这意味着,如果没有显式地声明成员的访问控制级别,这些成员是私有的,只能被类的成员函数访问。

class MyClass {
    int data1;  // 默认是private
    float data2;

public:
    MyClass(int d1, float d2) : data1(d1), data2(d2) {}

    void display() {
        std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
    }
};

继承

在继承关系中,structclass的行为也有所不同。具体来说,在继承时,基类成员的默认访问控制级别不同:

struct的继承

struct中,继承默认是public的。这意味着基类的publicprotected成员在派生类中保持其访问控制级别。

struct BaseStruct {
    int baseData;
};

struct DerivedStruct : BaseStruct {
    void show() {
        std::cout << "baseData: " << baseData << std::endl;  // 继承默认是public
    }
};

class的继承

class中,继承默认是private的。这意味着基类的publicprotected成员在派生类中默认变为private

class BaseClass {
    int baseData;
public:
    BaseClass(int d) : baseData(d) {}
    int getBaseData() { return baseData; }
};

class DerivedClass : BaseClass {
public:
    DerivedClass(int d) : BaseClass(d) {}
    void show() {
        std::cout << "baseData: " << getBaseData() << std::endl;  // 继承默认是private,需要通过public方法访问
    }
};

构造函数和析构函数

structclass在定义构造函数和析构函数时没有本质区别。它们都可以包含默认构造函数、参数化构造函数、复制构造函数、移动构造函数、析构函数等。

struct中的构造函数和析构函数

struct MyStruct {
    int data1;
    float data2;

    MyStruct(int d1, float d2) : data1(d1), data2(d2) {}
    ~MyStruct() { std::cout << "MyStruct destroyed" << std::endl; }
};

class中的构造函数和析构函数

class MyClass {
    int data1;
    float data2;

public:
    MyClass(int d1, float d2) : data1(d1), data2(d2) {}
    ~MyClass() { std::cout << "MyClass destroyed" << std::endl; }
};

小结

尽管structclass在C++中有许多相似之处,它们之间的主要区别在于默认的访问控制级别和继承行为。总结如下:

  1. 默认访问控制级别

    • struct的默认访问控制级别是public
    • class的默认访问控制级别是private
  2. 继承默认访问控制级别

    • struct的继承默认是public
    • class的继承默认是private
  3. 其他方面

    • structclass都可以包含数据成员和成员函数,都支持构造函数、析构函数、继承、多态等特性。

根据具体的需求和代码风格,我们可以选择使用structclass来定义数据类型。在简单的数据结构或需要所有成员默认公开的情况下,可以选择使用struct;在面向对象编程、需要更严格的访问控制时,更常使用class

标签:struct,异同,默认,public,访问控制,int,class
From: https://blog.csdn.net/m0_74091159/article/details/140088764

相关文章

  • Paper Reading: Genetic programming for multiple-feature construction on high-dim
    目录研究动机文章贡献预备知识本文方法MCIFC:一种多类无关的特征构建方法CDFC:一种多类相关特征构建方法实验结果数据集和实验设置多特征构造与单特征构造对比多树GP对比单树GPfilter对比混合方法类依赖对比类独立非GP对比基于GP的特征构建优点和创新点PaperReading是从......
  • Visual Instruction Tuning (LLaVA)
    论文链接:https://proceedings.neurips.cc/paper_files/paper/2023/file/6dcf277ea32ce3288914faf369fe6de0-Paper-Conference.pdf代码链接:https://github.com/haotian-liu/LLaVA?tab=readme-ov-file动机指令微调(InstructionTuning)语言大模型(LLMs)使用机器生成的指令跟......
  • 2024年语言艺术与社会科学国际会议(ICLASS 2024)
    2024InternationalConferenceonLanguageArtsandSocialSciences【1】大会信息会议简称:ICLASS 2024大会时间:2024-07-30大会地点:中国·重庆截稿时间:2024-07-16(以官网为准)审稿通知:投稿后2-3日内通知会议官网:www.lassiac.com投稿邮箱:[email protected]【2......
  • Structured Steaming结构化流详解:大案例解析(第12天)
    系列文章目录一、结构化流介绍(了解)二、结构化流的编程模型(掌握)三、Spark和Kafka整合,流处理,批处理演示(掌握)四、物联网数据分析案例(熟悉)文章目录系列文章目录前言StructuredSteaming一、结构化流介绍(了解)1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4、回......
  • image-classification-dataset
    importtorchtextfromtorchvisionimporttransformsfromtorch.utilsimportdatafromd2limporttorchasd2limporttorchvisiontrans=transforms.ToTensor()fashion_mnist_train=torchvision.datasets.FashionMNIST("../data",......
  • Lightroom Classic 2023 for Mac(摄影后期图像编辑工具) v12.4版
    lightingClassic是Adobe公司推出的一款图像处理软件,是数字摄影后期制作的重要工具之一。与其他图像处理软件相比,LightroomClassic具有以下特点:LightroomClassic2023forMac(摄影后期图像编辑工具)软件地址高效的图像管理:LightroomClassic提供了强大的图像管理功能,可以......
  • DRF 报错:RuntimeError: Model class django.contrib.contenttypes.models.ContentType
    该错误发生于将'django.contrib.contenttypes'注释之后该组件的功能见如下链接:https://www.cnblogs.com/xiugeng/p/9831665.htmldrf的APIView内部会走认证源码,相关代码导致的报错,怎么解决呢?就是在settings.py中配置上如下两个参数(匿名用户和认证)即可:https://www.cnblogs.com/N......
  • 在使用InputStream templateStream = this.getClass().getClassLoader().getResourceA
    在使用 this.getClass().getClassLoader().getResourceAsStream()读取项目目录路径下的文件需要注意在pom.xml文件中加入<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-......
  • 在Java中public class与class的区别(详细解释)
    在Java中,class 关键字用于定义一个类。当你使用 class关键字定义一个类时,它可以是公开的(即可以从其他包中访问)或包私有的(即只能在定义它的包内部访问)。在编写程序时,为了明确指定一个类为公开的,我们可以使用public 关键字来修饰 class。下面是publicclass 和 class(没有......
  • 【异常】nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/
    原因是版本冲突。以下我原本使用的版本信息<!--SpringBootRedis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.8.RELEASE</version><......