类(class)-结构体(struct)-共用体(union)的异同

news2024/5/18 4:13:27

一、"类" 的介绍

在C++中, 用 "" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。

类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。

上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"基类"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。

学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的"派生类"或者"子类"。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。

到此, 我们不再更深的去介绍类的其他相关知识。

二、C++类的定义

C++中使用关键字 class 来定义类, 其基本形式如下:

class 类名{public://公共的行为或属性private://公共的行为或属性};

说明:

①. 类名 需要遵循一般的命名规则;

②. publicprivate 为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。

一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;

③. 结束部分的分号不能省略

三、C++类的运用

对于类其实可以理解是一种映射,就是在把你在main函数中的定量映射到类里边的变量

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

class Account {
public :
    string full_name; //类定义
    string number;
    long balance;
};

int main()
{
    Account lily; //类对象的定义
    lily.full_name = "李莉"; 
    lily.number = " 12345";
    lily.balance = 200; //钱数 200 元
    cout << lily.full_name << "的账户是:" << lily.number << "余额是:" << lily.balance << endl;

    return 0;
}

其实这样去定义一个类是可以表明类的使用,但是存在问题?

  • 未初始化:没有在成员间初始化,只是去赋值,如果忘记赋值呢?

  • 对数据无法保护: 知道账户就知道余额显然很不友善

我们引入函数去定义这样

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

class Account {
private: //如果我没有private呢? 后边只是有一个
    string full_name; //类定义
    string number;
    long crnt_balance;
    /*
    string full_name; //类定义
    string number;
    long crnt_balance;     //和上边是等效的
    */
public:
    Account(string name, string num, long amnt) {
        full_name = name; //按照刚才映射的说法,将传入的数值赋值给  full_name
        number = num;
        crnt_balance = amnt;
    }
    string name()
    {
        return full_name;
    }
    string no(){
        return number;
    }
    long balance() {
        return crnt_balance;
    }
    void quqian(long amnt) {
        crnt_balance -= amnt;
    }
    void cunqian(long amnt) { //
        crnt_balance += amnt;
    }
};

int main()
{
    Account lily("李莉","23452342",10000); //将数据传入 11 行内
    lily.quqian(200);//调用的是26行的函数
    cout << lily.name() << "的账户" << lily.no() << "余额是:"<<lily.balance() << endl;
     //类中函数的调用
    return 0;
}

其实上边的你也发现了,有点麻烦,因为你在类中会定义太多的东西,private public 传入参数, 还有函数的定义........那么怎样才可以分开呢? 就是类的实现,示意图:

那么在vs2019中类的------建立如下右键点击--添加 和类向导都行---添加类--完成

这个时候你写的代码将会分为多个部分来进行

main函数

#include <iostream>
#include "Member.h"
using namespace std; //这是主函数
void print(Member* p) {
    p->print();
}
int main()
{
    Member wangming("王明", 15, 4);
    wangming.set_rank(wangming.get_rank() + 1);
    print(&wangming);
}

头文件(含有类的)

#pragma once
#include<string> //类文件
class Member
{
    std::string full_name;
    int no;
    int rank;
public:
    Member(std::string name, int number, int grade);
    int  get_rank() { return rank; }
    void set_rank(int grade) { rank = grade; }
    void print();
};

函数定义部分

#include <iostream>
#include "Member.h"
using namespace std; //函数的定义及其使用
Member::Member(string name, int number, int grade) {
    full_name = name;
    no = number;
    rank = grade;

}
void Member::print()
{
    cout << "No." << no << ":" << full_name << "{等级:" << rank << "}";
}

对于结构体的内容请点击:

structc结构体的使用

文章引用:

https://blog.csdn.net/xulingxin/article/details/81335030?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167374224216800186586453%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167374224216800186586453&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-81335030-null-null.142^v71^control,201^v4^add_ask&utm_term=c%2B%2B%E7%B1%BB&spm=1018.2226.3001.4187

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

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

相关文章

10道题熟练掌握并运用链表结构算法

目录 1.牛客BM3 链表中的节点每k个一组翻转 2.BM4 合并两个排序的链表 3.BM5 合并k个已排序的链表 4.BM6 判断链表中是否有环 5.BM7 链表中环的入口结点 6.BM8 链表中倒数最后k个结点 7.BM9 删除链表的倒数第n个节点 8.BM10 两个链表的第一个公共结点 9.BM11 链表相加(…

将写好的.py/.java程序变成.exe文件

目录 一、背景 1.1、前言 1.2、说明 二、优点与缺点分析 2.1、优点 2.2、缺点 三、将.py变成.exe步骤 3.1、下载需要的库 3.2、pycharm控制台.py->.exe文件 3.3、命令行.py->.exe文件 四、.py->.exe->执行.exe可能会遇到的报错与解决办法 4.1、pyinsta…

第2章 ESP32 日志

ESP32 日志 UART配置 新建工程 查看->命令面板&#xff0c;输入esp-idf:new project&#xff0c;一路完成工程创建选择menuconfig&#xff0c;输入UART 输入UART 自定义波特率改为&#xff1a;460800 日志打印 ESP32的日志打印函数 ESP_LOGx分成5个等级&#xff1a;err…

前端笔记总结+注册登录页案例

day 1 前端开发 目的&#xff1a;开发一个平台&#xff08;网站&#xff09; 前端开发&#xff1a;HTML、CSS、JavaScript Web框架&#xff1a;接收请求并处理 - Flask、Djiango MySQL数据库&#xff1a;存储数据的地方快速上手&#xff1a;基于Flask Web框架快速搭建一个网站…

Spring Cloud Alibaba商城实战项目(day02)

四、搭建Spring Cloud Alibaba环境 4.1、简介 官方文档&#xff1a;https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html 我们所选用的组件&#xff1a; SpringCloud Alibaba - Nacos&#xff1a;注册中心&#xff08;服务发现/注册&#xf…

还不会二分查找?看这一篇就够了

目录一、整数二分1.1 二分查找模板1.1.1 寻找右边界的二分查找1.1.2 寻找左边界的二分查找1.2 应用&#xff1a;寻找元素的起始位置和终止位置二、浮点数二分2.1 浮点数二分模板2.2 应用&#xff1a;数的三次方根三、使用STL进行二分查找3.1 std::binary_search3.2 std::lower_…

27-Golang中的错误处理机制

Golang中的错误处理机制说明基本说明使用deferrecover处理上述代码错误处理机制的好处自定义错误说明 package main import ("fmt" )func test() {num1 : 10num2 : 0res : num1 / num2fmt.Println("res", res) }func fmt() {test ()fmt.Println("mai…

分享77个Java源码,总有一款适合您

Java源码 分享77个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1EhB4snvWia5eCztyfiX_2A?pwdbofo …

wish、亚马逊、ebay、沃尔玛自养号测评补单优势之分析技巧

测评补单的资源可以说是卖家非常宝贵的财富&#xff0c;通过测评补单和广告相结合&#xff0c;可以快速有效的提升店铺的产品销量&#xff0c;提高转化&#xff0c;提升listing权重&#xff0c;如果是做自养号还可以不用担心以后被别人牵制&#xff0c;毕竟资源掌握在自己手上&…

docker-基础实战第二课

Docker三剑客 Docker 镜像&#xff08;Image&#xff09;&#xff1a;镜像可以用来创建容器&#xff0c;一个镜像可以创建多个容器。 容器&#xff1a;容器实例就是指实际运行的实例&#xff0c;可以理解为镜像是java的类&#xff0c;容器就是new出来的对象。 仓库&#xff1a;…

elasticsearch实现基于拼音搜索

1、背景 一般情况下&#xff0c;有些搜索需求是需要根据拼音和中文来搜索的&#xff0c;那么在elasticsearch中是如何来实现基于拼音来搜索的呢&#xff1f;可以通过elasticsearch-analysis-pinyin分析器来实现。 2、安装拼音分词器 # 进入 es 的插件目录 cd /usr/local/es/…

【论文阅读 CIKM2011】Finding Dimensions for Queries

文章目录ForewordAbsMethodList ExtractionList WeightingList ClusteringDimension and Item RankingForeword This paper is from CIKM2011, so we only condier the method, not resultsThere are many papers that have not been shared. More papers can be found in: Sh…

微信小程序+阿里物联/Onenet物联+esp32搭建无服务器物联系统(一)---ESP32硬件设计开源

目录 简介 一、硬件设计开源连接 二、硬件设计解析 1、电路原理图 2、PCB版图 3、BOM资料 4、整体项目的资料连接 微信小程序阿里物联平台合宙Air724UG搭建无服务器物联系统&#xff08;一&#xff09; 微信小程序阿里物联平台合宙Air724UG搭建无服务器物联系统&#xff08…

uni-app canvas绘制海报流程的一些记录

绘制流程 布局定义 在我们的布局里要声明canvas的定义如下&#xff0c;可以声明class布局样式&#xff0c;width和height是必须的&#xff0c;因为如果没有就绘制不了。 canvas-id也是必须的&#xff0c;我们需要通过id找到对一个你的canvas对象&#xff0c;来做操作 <c…

公测开启!CRMEB 多商户v2.1新功能快来体验

“ 真正实现完美主义当然很困难&#xff0c;但具备追求完美主义的态度&#xff0c;就能减少错误。” ——稻盛和夫 CRMEB 多商户 v2.1公测版正式发布&#xff01;新增付费会员&#xff0c;可进行会员折扣价管理、会员福利设置&#xff1b;新增社区发布短视频&#xff0c;打造短…

Django REST framework--DRF视图

Django REST framework--DRF视图DRF视图编写常规Django视图编写视图装饰器api_view查询资源返回所有数据返回单条数据返回json格式的数据新增资源修改资源删除资源DRF视图编写 常规Django视图编写 序列化器最终的作用是为视图提供转化后的数据&#xff0c;可使用Serializer类…

【饥荒】本地服务器+内网穿透

本地服务器搭建方法 准备工具 网易UU加速器&#xff08;用于加速科雷官网登陆和steam创意工坊&#xff09;Don’t Starve Together Dedicated Server(steam饥荒联机版开服工具) 获取方法&#xff1a;在库中勾选工具&#xff0c;然后搜索Don’t Starve Together Dedicated Ser…

Unity SRP自定义渲染管线学习1.2:初步绘制

绘制物体 绘制物体&#xff0c;包括不透明的物体&#xff0c;透明物体&#xff0c;再加上之前的天空盒 Camera void DrawVisibleGeometry(){//我们需要将不透明物体和透明物体分开绘制//如果我们直接先绘制所有的物体&#xff0c;然后再绘制天空盒&#xff0c;我们就会看到对…

nodejs+vue家庭食谱饮食方案管理系统网站python php java

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看美食食谱&#xff0c;一周健康食谱安排&#xff0c;查看美食食材&#xff0c;在线交流发布帖子&#xff1b;管理员可以对食谱分类&#xff0c;食谱信息&#xff0c;材料信息&#xff0c;美…

区块链技术2---BTC的数据结构

1&#xff1a;Hash pointers&#xff08;哈希指针&#xff09;和普通指针相比&#xff0c;哈希指针除了保存地址还保存哈希值2&#xff1a;Block chain区块链中的区块通过哈希指针相连&#xff0c;这里的哈希指针的哈希值是对前一个区块的整体取哈希值&#xff08;包括前一个区…