当前位置: 首页 > news >正文

C++ Primer 类和对象(3)

        类和结构体是比较相似,而传统的C的结构体中都是一些数据的类型,类除了有数据之外还有函数。所以可以把类想象成一个具有既有数据又有函数的复合数据类型。

        类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。

        以股票为例:

股票中的数据类型有:股票的价格,股票的公司,所持股票的量等等。

可执行的操作限制为:获得股票,增持,卖出股票,更新股票价格,显示所持股票的信息。

        存储下面的信息:

  • 公司名称;
  • 所持股票的数量;
  • 每股的价格;
  • 股票总价;

        然后定义类。一般来说,类规范由两个部分组成。

  • 类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口。
  • 类方法定义:描述如何实现类成员函数。

        简单来说,类声明提供了类的蓝图,而方法定义则提供了细节。

一般来说把类的定义放在.h文件中,类的成员函数的实现放入.c文件中

        凡是出现在private中出现的标识无论是函数还是数据的某个变量某个类型,都只能通过public中的方法间接地去访问它。

       

stock00.cpp

#include <iostream>
#include "stock00.h"void Stock::acquire(const std::string &co,long n,double pr)
{company = co;if(n<0){std::cout<<"Numer of shares can't be negative;"<<company<<"shares set to be 0."<<std::endl;}else {shares = n;}share_val = pr;set_tot();
}
void Stock::buy(long num,double price)
{if(num<0){std::cout<<"Numer of shares can't be negative,Transaction is aborted"<<std::endl;}else{shares += num;share_val = price;set_tot();}
}
void Stock::sell(long num,double price)
{if(num<0){std::cout<<"Numer of shares can't be negative,Transaction is aborted"<<std::endl;}else if(num >shares){std::cout<<"You can't sell more than you have!Trancsaction is aborted"<<std::endl;}else{shares -= num;share_val=price;set_tot();}
}
void Stock::update(double price)
{share_val = price;set_tot();
}
void Stock::show()
{std::cout<<"Company:"<<company<<std::endl;std::cout<<"Shares:"<<shares<<std::endl;std::cout<<"Share price"<<share_val<<std::endl;std::cout<<"Total worth:"<<total_val<<std::endl;
}

        Stock是类,而fluffy_the_cat就是类的对象。其中 fluffy_the_cat 就像是 int i 中的 i 。类的成员函数可以通过对象来调用。类似于用结构体的对象来访问结构体中的成员。

        要使用新类型,最关键的是要了解成员函数的功能,而不必考虑其实现细节。就像std空间,我们只需要知道如何使用cin,cout之类的功能,而不用去了解为什么。一般把这种方法称为“客服/服务器模型”。

        客服/服务器模型

        OOP程序员(面向对象的程序员)经常依照 客服/服务器模型 来讨论程序设计。客服是使用类的程序。类声明(包括类方法)构成了服务器,它是程序可以使用的资源。客户只能通过以公有方式(public)定义的接口使用服务器。所以客户只需要了解该接口。设计服务器的人的责任是确保服务器根据该接口可靠并准确的执行。服务器设计人员只能修改类的设计的实现细节,而不能修改接口。

        指定类设计的第一步是提供类声明。类声明类似于结构声明,可以包括数据成员和函数成员。声明有私有部分,在其中声明的成员只能通过成员函数进行访问;声明还有公有部分,在其中声明的成员可以被使用类的对象的程序直接访问。通常,数据成员被放在私有部分中,成员函数被放在公有部分中,因此典型的类声明格式如下:

class className
{private:data member declarations    //数据成员声明public:member function prototypes  //成员函数原型
};

        除非函数很短可以直接在函数定义的时候写出来,变成内联函数,否则尽量单独提供函数类的声明以及类的成员函数定义。例如set_tot():

private:std::string company;long shares;double share_val;double total_val;void set_tot(){total_val = shares * share_val;}

 stock00.h

#ifndef __STOCK00_H__
#define __STOCK00_H__
#include <string>
class Stock
{private:std::string company;long shares;double share_val;double total_val;void set_tot(){total_val = shares * share_val;}public:void acquire(const std::string &co,long n,double pr);void buy(long num,double price);void sell(long num,double price);void update(double price);void show();
};#endif

 usestock00.cpp

#include <iostream>
#include "stock00.h"int main()
{Stock fluffy_the_cat;fluffy_the_cat.acquire("PTU",20,12.50);fluffy_the_cat.show();fluffy_the_cat.buy(15,18.125);fluffy_the_cat.show();fluffy_the_cat.sell(400,20.00);fluffy_the_cat.show();fluffy_the_cat.buy(300000,123.123);fluffy_the_cat.show();fluffy_the_cat.sell(300000,0.123);fluffy_the_cat.show();return 0;
}

要注意的是,只能在某些特定的环境中,如类方法的代码中,可以省略的类名和::作用域解析符。

假设Bozo有一个名为Retort()的成员函数,该函数返回char指针,则其函数头如下:

char * Bozo::Retort()

此时,Retort()不仅是一个char*类型的函数,而是一个属于Bozo类的char*函数。该函数全名(限定名)为Bozo::Retort()。而Retort()是限定名的缩写。

另一种描述这种情况的方式是,名称Retort的作用域为整个类,因此在类声明和类方法之外使用该名称时,需要使用作用域解析运算符进行限定。

        要创建对象,只需要将类名视为类型名既可:

Bozo bozetta;

        因为类是用于定义的类型,所以这样是可行的。

        类成员函数(方法)可以通过类对象来调用。

cout<<bozetta.retort();

        将调用Retort()成员函数,每当其中的代码引用某个数据成员时,该函数都将使用bozetta对象中相应成员的值。

相关文章:

C++ Primer 类和对象(3)

类和结构体是比较相似&#xff0c;而传统的C的结构体中都是一些数据的类型&#xff0c;类除了有数据之外还有函数。所以可以把类想象成一个具有既有数据又有函数的复合数据类型。 类是一种将抽象转换为用户定义类型的C工具&#xff0c;它将数据表示和操纵数据的方法组合成一个整…...

IntelliJ IDEA 介绍、安装、配置优化与快捷键大全

一、简介 IDEA全称 IntelliJ IDEA&#xff0c;是Java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能…...

css 语法笔记

.abc {margin-left:20px; } .xyz {margin-left:20px; } 等同于 .abc, .xyz {margin-left: 20px; } 参考 CSS - 选择器_css最后一个元素选择器_伏城之外的博客-CSDN博客 CSS Selectors Reference...

【初阶数据结构】二叉树全面知识总结

二叉树详解 树的概念及其结构树的概念树的相关概念树的表示方法孩纸兄弟表示法双亲表示法&#xff08;并查集&#xff09; 树的实际应用 二叉树二叉树的概念二叉树的种类二叉树的性质二叉树的存储结构 二叉树顺序结构的实现堆的概念及结构堆向上、向下调整法堆的插入堆的删除堆…...

CMD命令终端快捷键学习

很多环境需要安装并且指定环境变量才可用终端访问 比如一些数据库、一些环境、例如&#xff1a;nodejs Oracle、mysql 在一个文件夹按住shift鼠标右键可以快速在当前目录运行终端&#xff01;免去cd 目录的烦恼 快捷键 当你学习和使用命令终端&#xff08;如 Windows 的 CMD&…...

Leetcode198. 打家劫舍

https://leetcode.cn/problems/house-robber/description/ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&…...

前端技术社区总目录

前端技术社区欢迎您的订阅。订阅后&#xff0c;您将可以查看以下所有博客内容。 注&#xff1a;专栏内容主要面向新手 注&#xff1a;每个示例都有相对应的完整代码 注&#xff1a;该专栏博客内容将会逐步迁移至https://blog.csdn.net/m0_60387551/article/details/128017725 …...

极客时间:左耳听风【文章笔记 思考总结】

本篇博客是学习过程中的笔记、思考和总结。原文链接&#xff1a;https://time.geekbang.org/column/intro/100002201 开篇词 | 洞悉技术的本质&#xff0c;享受科技的乐趣01 | 程序员如何用技术变现&#xff08;上&#xff09;02 | 程序员如何用技术变现&#xff08;下&#xf…...

《论文阅读27》SuperGlue: Learning Feature Matching with Graph Neural Networks

一、论文 研究领域&#xff1a; 图像特征点匹配论文&#xff1a;SuperGlue: Learning Feature Matching with Graph Neural NetworksCVPR 2020veido论文code 二、论文简述 [参考] [参考] [参考] 三、论文详述 SuperGlue&#xff1a;使用图神经网络学习特征匹配 本文介绍了…...

远程计算机或设备不接受连接解决方法

远程计算机或设备不接受连接解决方法 点击左下角开始&#xff0c;点击运行&#xff0c;输入inetcpl.cpl&#xff0c;点击确定&#xff0c;打开Internet选项。 将三个框的勾勾去掉&#xff0c;即为不选中状态&#xff0c;点击确定。 当你的电脑浏览器不能正常上网时&#xff…...

基于Python实现的快递管理系统源码+数据库,采用PyQt6实现GUI界面

快递管理系统 完整代码下载地址&#xff1a;快递管理系统 介绍 通过对传统的快递收发流程进行分析&#xff0c;完成网上快递管理系统的分析设计与开发&#xff0c;使客户能方便在网站上查询自己的快件信息以及网上寄件&#xff0c;同时管理员又能对每天的收到快件进行登记和…...

如何使用docker快速部署MinDoc文档系统

MinDoc是非常优秀的知识分享系统&#xff0c;但是很多刚接触的人会一脸懵逼&#xff0c;而且官方文档写的也并不清晰&#xff0c;所以和大家分享一下快速部署MinDoc的方法。 首先docker环境先自行安装好&#xff0c;这里不再赘述。 拉取docker镜像&#xff1a; docker pull …...

9月25日,每日信息差

今天是2023年9月27日&#xff0c;以下是为您准备的18条信息差 第一、苹果向法国监管机构提交iPhone 12软件更新&#xff0c;解决辐射超标问题 第二、“双节”期间&#xff0c;北京全市预计接待游客1283万人次&#xff0c;中秋国庆“双节”长假将至&#xff0c;北京市民和游客…...

【网络协议】Https

HTTP 协议内容都是按照⽂本的⽅式明⽂传输的,这就可能导致在传输过程中出现⼀些被篡改的情况。所以在HTTP协议的基础上&#xff0c;引入加密层&#xff0c;形成了HTTPS协议。 HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议&#xff0c;主要…...

Lostash同步Mysql数据到Elasticsearch(三)Elasticsearch模板与索引设置

logstash数据同步ES相关 同步数据时&#xff0c;Elasticsearch配合脚本的相关处理设置 1.模板创建更新 在kibana中执行&#xff0c;或者直接给ES发送请求&#xff0c;你懂得&#xff0c;不懂得百度下ES创建template PUT /_template/test-xxx {"template": "…...

python——ptp()函数

函数功能&#xff1a;求最大值和最小值的差值 def ptp(a, axisNone, outNone):"""沿轴的值范围&#xff08;最大值-最小值&#xff09;。该函数的名称来自“peak-to-peak”的首字母缩写。参数----------a:array_like输入值。axis:int&#xff0c;可选找到山峰的…...

SpringBoot之异常处理

文章目录 前言一、默认规则二、定制异常处理处理自定义错误页面ControllerAdviceExceptionHandler处理全局异常ResponseStatus自定义异常自定义实现 HandlerExceptionResolver 处理异常 三、异常处理自动配置原理四、异常处理流程总结 前言 包含SpringBoot默认处理规则、如何定…...

Flask-[实现websocket]-(2): flask-socketio文档学习

一、简单项目的构建 flask_websocket |---static |---js |---jquery-3.7.0.min.js |---socket.io_4.3.1.js |---templates |---home |---group_chat.html |---index.html |---app.py 1.1、python环境 python3.9.0 1.2、依赖包 Flask2.1.0 eventlet0.33.3 #使用这个性能会…...

网页中使用的图片格式

网页中使用的图片格式有以下几种&#xff0c;各有优缺点&#xff1a; JPEG&#xff1a;适用于照片或彩色图像&#xff0c;支持16.7万种颜色&#xff0c;有损压缩&#xff0c;可以调节压缩比和质量&#xff0c;文件较小&#xff0c;加载较快PNG&#xff1a;适用于图标或透明图像…...

【android】如何设置LD_LIBRARY_PATH?

目录 一 配置方法 1 进入Android shell 2 使用export命令 3 使用echo命令查看变量是否设置成功 二 扩展 1 LD_LIBRARY_PATH设置多个路径 2 push文件 一 配置方法 android中配置LD_LIBRARY_PATH的方法具体为&#xff1a; 1 进入Android shell adb shell 2 使用export…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...