C++ 与复合数据类型:透过类理解结构体

news2024/10/7 12:22:50

文章目录

  • 参考
  • 描述
  • 结构体
      • 概念
      • 结构体与类
      • 结构体还是类?
  • 默认访问级别
      • struct 与其默认访问级别
      • class 与其默认访问级别

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
C++ Primer Plus (第六版)中文版史蒂芬·普拉达 / 张海龙,袁国忠 译
精通C++(第九版)ISBN:9787302503163
黑马程序员C++
CPlusPlusReference

描述

项目描述
操作系统Windows 10 专业版
编辑器VSCode
编译器g++.exe (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 13.1.0

结构体

概念

在C++中,结构体主要用于 将分属数种数据类型的数个变量组合成一个单独的数据类型,这使得我们可以更容易地组织和处理相关的数据。结构体的定义通常包括关键字 struct结构体名称 以及 包含在花括号中的成员

一个普通的结构体定义

struct MyStruct
{
    string name = "RedHeart";
    unsigned short age = 18;
    string nation = "China";
    string home = "BinaryMoon";
};

结构体与类

C++ 最初被设计为 C with classes,它是C语言的一个超集。由于C语言已支持结构体,C++便继承了这一特性。
为了确保与 C 的 兼容性,C++ 保持了 struct 的 语法和语义。但为了 利用面向对象的特性,C++ 扩展了 struct,使其与 C++ 中的类 近乎一模一样

尽管 structclass 在语法上 几乎相同,但程序员通常会按照一致的约定来使用它们,例如 使用 struct 来表示纯粹的存储结构(用于存放多种不同数据类型数据的结构),而 使用 class 来表示具有行为和属性的类。这种约定有助于代码的 可读性维护性

结构体还是类?

从语义层面出发,应该 使用 struct 来存放数据使用 class 来定义类。但 C++ 为开发者提供了足够的灵活性,在特殊情况下我们可以依据特定的情况进行分析。

比如:

场景描述
与 C 语言交互如果你的 C++ 代码 需要与 C 进行交互,使用结构体可能会更方便一些。因为 C 语言中 没有类的概念,但是 结构体在 C 与 C++ 中都是存在的
性能敏感尽管 在大多数情况下,结构体和类之间的性能差异可以忽略不计,但在一些性能敏感非常严重的场景下,程序员可能更愿意选择 更为简单和直接的数据结构 struct,以确保编译器不会产生较多的额外开销。

默认访问级别

在 C++ 中,类与结构体在功能方面两者之间 存在的最大差异是两者所支持的默认访问级别

修饰符
(Modifier)
访问级别
(Access Level)
类内部
(Inside Class)
子类
(In Subclass)
外部
(Outside Class)
public公有可访问可访问可访问
protected受保护可访问可访问不可访问
private私有可访问不可访问不可访问

struct 与其默认访问级别

对于 struct,默认的访问级别是 public。这意味着结构体的成员变量与成员函数默认属于 公共成员可以从当前结构体的外部对其成员进行直接访问。对此,请参考如下示例:

#include <iostream>
#include <string>
using namespace std;


int main () {
    struct MyStruct
    {
        string name = "RedHeart";
        int age = 18;
        string nation = "China";

        int sayHello() {
            cout << "Hello World" << endl;
            return 0;
        }
    };

    // 通过结构体创建结构体实例
    struct MyStruct myStruct;

    // 访问结构体中的成员并将其内容输出至终端
    cout << myStruct.name << endl;
    cout << myStruct.age << endl;
    cout << myStruct.nation << endl;
    myStruct.sayHello();

    // 通过执行 Windows 平台支持的命令 pause
    // 暂停程序的继续执行,使得我们能够观察到程序的输出结果。
    system("pause");
    return 0;
}

执行效果

在上述实例中,我们在创建结构体 MyStruct 的过程中并没有通过使用访问修饰符来设置成员的访问级别,但却能够在定义成员的结构外对其成员进行访问,故结构体默认支持的访问级别是 public

RedHeart
18
China
Hello World
请按任意键继续. . .

class 与其默认访问级别

对于 class,默认的访问级别是 private。这意味着类的成员变量与成员函数默认属于 私有成员仅能够在当前结构体内部对其成员进行访问。对此,请参考如下示例:

#include <iostream>
#include <string>
using namespace std;


int main() {
    class BaseClass
    {
        string role = "BaseClass";
    };

    // DerivedClass 继承自 BaseClass
    // BaseClass 的成员对 DerivedClass 的访问级别是 public
    class DerivedClass : public BaseClass
    {
        // 尝试通过子类访问父类中的内容
        string snitch() {
            return role;
        }
    };

    system("pause");
    return 0;
}

执行效果

C++ 抛出异常信息 'std::string main()::BaseClass::role' is private within this context。由该错误信息我们即可断定类的默认访问级别是 private

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做SEO要选择什么代理IP?2023最新综合指南

在 SEO 领域&#xff0c;代理IP在取得成功方面发挥着至关重要的作用。它们提供了一种隐藏您的 IP 地址并通过不同位置访问网络的方法&#xff0c;使您能够收集数据、分析竞争对手的策略并提高网站的可见性。在这篇博文中&#xff0c;我们将深入研究代理服务器的世界&#xff0c…

虚拟列表本质以及解决方式

前言 简述&#xff1a;虚拟列表是一种优化长列表渲染的技术&#xff0c;它可以在保持流畅性的同时&#xff0c;渲染大量的数据。在传统的列表渲染中&#xff0c;如果列表非常长&#xff0c;会导致渲染时间过长&#xff0c;页面卡顿&#xff0c;用户体验变得非常差。而虚拟列表…

AVL 树的初步认识与基本操作

历史 AVL 树是一种自平衡二叉搜索树&#xff0c;由托尔哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字&#xff1a;Adelson-Velsky 和 Landis&#xff0c;他们是苏联数学家&#xff0c;于 1962 年发表了一篇论文&#xff0c;详细介绍了 AVL 树的概念和…

nginx配置https 访问

nginx 解压目录有configure文件 [rootoracledb10 ~]# which nginx1、检查nginx是否包含http_ssl_module 模块 如果出现 --with-http_ssl_module 就是已经安装了[rootoracledb10 sbin]# pwd /usr/local/nginx/sbin [rootoracledb10 sbin]# nginx -V nginx version: nginx/1.23…

技术分享| 二进制部署MySQL

一、介绍 ​MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#x…

华为手环8全新炫酷表盘上线,这些免费表盘,你绝对不能错过

在现今忙碌的生活节奏中&#xff0c;保持身心健康已逐渐成为大众的共同追求。华为手环8以时尚的设计、轻巧的体积、精确的传感器、丰富的健康模式以及智慧生活的无缝拓展&#xff0c;成为了潮流先锋达人的理想之选。华为手环8还支持多种表盘样式&#xff0c;满足不同用户的个性…

Vue开发中Jwt的使用

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

ai智能语音机器人必须具备的功能

近年来&#xff0c;大多数互联网公司都进入了智能化领域。 随着人工智能技术的不断升级和突破&#xff0c;智能出境行业涌现出许多新品牌。 这些品牌有的以价格取胜&#xff0c;有的以产品性能取胜&#xff0c;这确实给消费者增加了很多选择。 ​ 然而&#xff0c;智能外呼产品…

【Java每日一题】——第二十八题:编程定义一个学生类汽车类Car(2023.10.12)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

史上最全,最详细SQL基础

SQL基础 一、 建库建表 1.1 创建数据库 创建数据库模板&#xff1a; create database 数据库名称 --创建数据库 on primary (name --数据库的逻辑名称filename --物理存放位置及物理文件名称(Student_info.m…

spark中的shuffle简述 那些会导致shuffle的算子

shuffle操作说白了就是重分区操作 在Apache Spark中&#xff0c;任务之间的依赖关系主要分为两类&#xff1a;宽依赖&#xff08;Wide Dependency&#xff09;和窄依赖&#xff08;Narrow Dependency&#xff09;。这两者之间的主要区别在于它们对任务之间数据的依赖性以及执行…

JNI中调用Java函数

文章目录 一、JNI 注册二、JNI 调用 Java 函数1、实例2、总结3、参考 三、JNI 数据传递四、JNA五、图像传递 一、JNI 注册 JNI 分成静态注册和动态注册 静态注册 cpp 实现 JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv *env, jobject…

【TensorFlow2 之012】TF2.0 中的 TF 迁移学习

#012 TensorFlow 2.0 中的 TF 迁移学习 一、说明 在这篇文章中&#xff0c;我们将展示如何在不从头开始构建计算机视觉模型的情况下构建它。迁移学习背后的想法是&#xff0c;在大型数据集上训练的神经网络可以将其知识应用于以前从未见过的数据集。也就是说&#xff0c;为什么…

omnipathr官网教程 mistr

github python版本 omnipath tutorials Issue #17 saezlab/omnipath (github.com) R版本 saezlab/OmnipathR: R client for the OmniPath web service (github.com)https://github.com/saezlab/OmnipathR GitHub - saezlab/OmnipathR: R client for the OmniPath web s…

Prettier插件使用

一、前言 由于之前使用的Beautify格式化插件已经没有在维护了&#xff0c;所以这里再分享一个Formatter插件-Prettier。 二、插件安装 首先在扩展(ctrlShiftX)中搜索关键词Prettier&#xff0c;点击安装。 三、插件使用配置 首先在VSCode编辑器中依次打开菜单文件-首选项-…

Oauth2.0单点登录的解决方案 安当加密

上海安当技术有限公司的ASP身份认证系统提供针对Oauth2.0单点登录的解决方案。该解决方案可以帮助客户实现以下目标&#xff1a; 统一的用户管理&#xff1a;Oauth2.0单点登录可以提供一个统一的用户管理平台&#xff0c;使得用户只需要在一个平台上进行注册和身份认证&#x…

基于Java使用SpringBoot+Vue框架实现的前后端分离的美食分享平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在当今社会&#xff0…

打造类ChatGPT服务,本地部署大语言模型(LLM),如何远程访问?

ChatGPT的成功&#xff0c;让越来越多的人开始关注大语言模型&#xff08;LLM&#xff09;。如果拥有了属于自己的大语言模型&#xff0c;就可以对其进行一些专属优化。例如&#xff1a;打造属于自己的AI助理&#xff0c;或是满足企业自身的业务及信息安全需求。 所以&#xff…

天猫商品评论数据接口,天猫商品评论API接口,天猫API接口

天猫商品评论内容数据接口的步骤&#xff0c;但是可以提供淘宝商品评论内容数据接口的步骤&#xff1a; 授权获得淘宝开放平台API所需的权限。获取AppKey和AppSecret等认证信息。发送HTTP请求&#xff0c;获取所需评价信息。对获取到的评价信息进行处理和解析。结果处理&#…

行业顶流|AI数字人直播,低成本、高回报的新趋势

去年&#xff0c;元宇宙的概念炒得特别火&#xff0c;落地却寥寥无几&#xff0c;今年的AI数字人是否也只是一时炒作的概念呢&#xff1f; 在这个信息时代&#xff0c;科技的发展总是伴随着各种概念的冒起。元宇宙作为其中之一&#xff0c;的确在一瞬间扑面而来&#xff0c;引…