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对象中相应成员的值。

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

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

相关文章

网络安全复习大纲wcf

单选10判断10填空30简答25分析25 选择 &#xff08;1&#xff09;计算机网络安全是指利用计算机网络管理控制和技术措施&#xff0c;保证在网络环境中数据的&#xff08; &#xff09;、完整性、网络服务可用性和可审查性受到保护。 A、保密性 B、抗攻击性 C、网络服务管理性 …

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下&#xff0c;还能使用proxy代理地址吗&#xff1f; vite的proxy开发环境设置 环境&#xff1a; vite 4…

网安新战场:CTF的那些事儿

CTF CTF的前世今生CTF竞赛中的挑战和难题CTF竞赛必备知识CTF竞赛中的技巧与策略&#xff1a; 写在末尾 主页传送门&#xff1a;&#x1f4c0; 传送 CTF的前世今生 CTF&#xff08;Capture The Flag&#xff09;是一种网络安全竞赛&#xff0c;旨在测试参与者解决各种网络安全问…

AI赋能的3D资产管理

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 想象一下&#xff0c;作为一名视频游戏设计师&#xff0c;你希望在游戏中使用 3D 龙模型。 以前&#xff0c;你可以通过两种方式执行此操作&#xff1a; 自己制作复杂的 3D 模型或从多个角度拍摄龙模型的照片。前往 3D 模…

Git_03_暂存工作区的修改/自由切换分支

# 保存当前未commit的代码 > git stash # 保存当前未commit的代码并添加备注 > git stash "备注内容" # 列出stash的所有记录 > git stash list # 应用最近一次的stash > git stash apply # 删除stash的所有记录 > git stash clear1.查看工作区的改动…

5+铜死亡+单基因泛癌生信思路

今天给同学们分享一篇铜死亡单基因泛癌的生信文章“Pan-cancer integrated bioinformatics analysis reveals cuproptosis related gene FDX1 is a potential prognostic and immunotherapeutic biomarker for lower-grade gliomas”&#xff0c;这篇文章于2023年2月7日发表在F…

Spring 学习(九)整合 Mybatis

1. 整合 Mybatis 步骤 导入相关 jar 包 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency>…

PASCAL数据集说明

文章目录 一.PASCAL数据集简介1.图像分割 一.PASCAL数据集简介 Pascal VOC2012数据集主要是针对视觉任务中监督学习提供标签数据&#xff0c;它有四个大类别&#xff0c;可以细分为二十个小类别&#xff1a; Person&#xff1a;personAnimal&#xff1a;bird, cat, cow, dog,…

Appium+python+unittest搭建UI自动化框架

阅读本小节&#xff0c;需要读者具备如下前提条件&#xff1a; 掌握一种编程语言基础&#xff0c;如java、python等。 掌握一种单元测试框架&#xff0c;如java语言的testng框架、python的unittest框架。 掌握目前主流的UI测试框架&#xff0c;移动端APP测试框架Appium&…

xcode15下载ios17模拟器失败

升级到xcode15后需要安装ios17模拟器 但是在下载过程中会遇到报错 如下图这种 网上搜索了一下发现有人遇到过无法下载的问题&#xff0c;并且在apple官网也有人提出类似问题 https://developer.apple.com/forums/thread/737648 解决方案就是从https://developer.apple.com/do…

【C++】stack queue

stack & queue 一、容器适配器二、deque&#xff08;了解&#xff09;三、stack1. stack 的介绍2. 模拟实现 stack 四、queue1. queue 的使用2. 模拟实现 queue3. priority_queue&#xff08;1&#xff09;priority_queue 的介绍&#xff08;2&#xff09;priority_queue 的…

[Linux]多线程编程

[Linux]多线程编程 文章目录 [Linux]多线程编程pthread_create函数pthread_join函数pthread_exit函数pthread_cancel函数pthread_self函数pthread_detach函数理解线程库和线程id Linux操作系统下&#xff0c;并没有真正意义上的线程&#xff0c;而是由进程中的轻量级进程&#…

Python二级 每周练习题20

练习一: 日期计算器 设计一款日期计算程序&#xff0c;能否实现下面的功能&#xff1a; (1)要求用户分别输入年、月、日&#xff08;分三次输入&#xff09;&#xff1b; (2)程序自动会根据输入的年月日计算出这一天是这一年的第几天&#xff1b; (3)输出格式为&#xff1a;这…

超全超详细的Redis笔记-数据类型及其使用、主从复制、哨兵模式、缓存穿透、击穿、雪崩

文章目录 狂神聊Redis1、Nosql概述1.1、为什么要用Nosql1.2、什么是NoSQL1.3、NoSQL的四大分类 2、Redis 入门2.1、概述2.2、Windows 安装2.3、Linux安装2.4、测试性能2.5、Redis基础知识 3、五大基本数据类型3.1、Redis-Key3.2、String3.3、List3.4、Set3.5、Hash&#xff08;…

成都瀚网科技有限公司:抖店精选联盟怎么用?

抖音精选联盟是抖音电商平台提供的一项服务&#xff0c;旨在为商家提供更多的推广机会和销售渠道。然而&#xff0c;很多人对于如何使用抖店精选联盟以及如何开通这项服务不太了解。本文将为您详细介绍抖店精选联盟的使用和激活流程。 第一节&#xff1a;如何使用抖店精选联盟 …

国密国际SSL双证书解决方案,满足企事业单位国产国密SSL证书要求

近年来&#xff0c;为了摆脱对国外技术和产品的依赖&#xff0c;建设安全的网络环境&#xff0c;以及加强我国对网络信息的安全可控能力&#xff0c;我国推出了国密算法。同时&#xff0c;为保护网络通信信息安全&#xff0c;更高级别的安全加密数字证书—国密SSL证书应运而生。…

容器管理工具 Docker生态架构及部署

目录 一、Docker生态架构 1.1 Docker Containers Are Everywhere 1.2 生态架构 1.2.1 Docker Host 1.2.2 Docker daemon 1.2.3 Registry 1.2.4 Docker client 1.2.5 Image 1.2.6 Container 1.2.7 Docker Dashboard 1.3 Docker版本 二、Docker部署 2.1 使用YUM源部署…

用友U8 CRM客户关系管理任意文件上传漏洞复现【附POC】

文章目录 用友U8 CRM客户关系管理任意文件上传漏洞复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现4.访问shell地址 0x06 整改建议 用友U8 CRM客户关系管理任意文件上传漏洞复现 0x01 前言 免责声明&#xff1a;请勿利用文…

【Java 基础篇】Java网络编程实战:P2P文件共享详解

Java网络编程是现代软件开发中不可或缺的一部分&#xff0c;因为它允许不同计算机之间的数据传输和通信。在本篇博客中&#xff0c;我们将深入探讨Java中的P2P文件共享&#xff0c;包括什么是P2P文件共享、如何实现它以及一些相关的重要概念。 什么是P2P文件共享&#xff1f; …

mysql自动删除过期的binlog

一、binlog_expire_logs_seconds 配置项 mysql 8.0使用配置项 binlog_expire_logs_seconds 设置binlog过期时间&#xff0c;单位为秒。 mysql旧版本使用配置项 expire_logs_days 设置binlog过期时间&#xff0c;单位为天&#xff0c;不方便测试。 在 8.0 使用 expire_logs_d…