当前位置: 首页 > 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++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...