C++ primer plus 类和对象

embedded/2025/3/15 9:15:52/

文章目录

  • 系列文章目录
  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

接着上一篇继续


一  this指针

我们可能看到这个this指针是不知道干什么的,但是我们可以通过一个问题来引入这个,就比如我们上一章的程序,我们知道是用来计算股票的,那么我如果要比较两个股票的总值最大要怎么比较呢?我们下面来分析一下

我们首先需要一个方法来比较这两个数值的大小
所以我们就要在类里面设置一个方法来比较大小
首先我们要有一个这个函数原型

const Stock& topval(const Stock& s) const;

这个就是我们用来计算总和的函数原型,我们来分析一下
首先我们这个函数用出来之后,是隐式了是用调用这个函数的那个对象里面的私有值,就是谁调用了这个函数就使用了那个私有值这个是隐式访问但是我们传过来的对象是显式访问,为什么呢?因为它传过来我们就可以使用对应得私有值

然后这个末尾得const有什么等等会奖

当我们去编写这个函数的时候

const Stock& Stock::topval(const Stock& s) const {if (total_vale < s.total_vale)return s;else}

 我们会发现我们可以去饭返回对应的对象,但是好像不可以返回自己,这个要怎么办,因为自身式隐式的,所以这个时候就引入了this指针,这个this指针就是用来指向你所调用那个对象的,这个时候这个指针式指向地址,所以我们只要对它进行解引用就好了,这个this指针是你构造这个类的时候就会有,不用自己去编写

就是这样子

const Stock& Stock::topval(const Stock& s) const {if (total_vale < s.total_vale)return s;else*this;
}

所以这个this指针是用来返回自己的

博主当时阅读书籍的时候在想,为什么这个我只要把这个对象传进去就可以访问这个对象的private里面的数据呢?这个不是相互独立的吗?

在C++中,如果您有一个对象 obj1 的成员函数,并且该函数需要访问另一个对象 obj2 的私有数据,您可以通过将 obj2 作为参数传递给 obj1 的成员函数来实现这一点

这里的关键点是:

  1. 成员函数的访问权限:类的成员函数可以访问该类的所有成员,包括私有成员。这是由类的封装性决定的,成员函数是类定义的一部分,因此它们有权访问类的所有内部数据

  2. 参数传递:当您将 obj2 作为参数传递给 obj1 的成员函数时,该成员函数可以访问 obj2 的所有公共、保护和私有成员。这是因为参数 obj2 在函数内部被视为其所属类的实例,因此函数可以像访问任何其他实例一样访问其成员

这就很TM神奇你知道吧

所以这个this指针是用来进行对象与对象之间的联系的

 二  对象数组

我们直接通过程序来理解这个对象数组是最好的

#include<iostream>
#include"cool.h"//表示公司首次购买股票
Stock::Stock(const std::string& co, long n, double pr) {company = co;if (n < 0) {std::cout << "Number of shares can't be negative;"<< company << "shares set to 0.\n";shares = 0;}else {shares = n;share_vale = pr;set_tol();}
}Stock::~Stock() {std::cout << "bey bey" << company <<std::endl;
}//增加股票
void Stock::buy(long num, double price) {if (num < 0) {std::cout << "Number of shares can't be negative;"<< "Transaction is aborted.\n";}else {shares += num;share_vale = price;set_tol();}
}//减少股票
void Stock::sell(long num, double price) {using std::cout;if (num < 0) {std::cout << "Number of shares can't be negative;"<< "Transaction is aborted.\n";}else if (num > shares) {cout << "You can't sell more than you have!"<< "Transaction is aborted.\n";}else {shares -= num;share_vale = price;set_tol();}
}//更新
void Stock::update(double price) {share_vale = price;set_tol();
}//展示
void Stock::show() const {std::cout << "compay: " << company << " "<< "shares:" << shares << '\n'<< " share price: $" << share_vale<< " total worth: $" << total_vale << '\n';
}const Stock& Stock::topval(const Stock& s) const {if (total_vale < s.total_vale)return s;elsereturn *this;
}
#include<iostream>
#include"cool.h"
using namespace std;int main() {Stock a[5]{Stock("cat",10,19.19),Stock("dog", 7, 17.13),Stock("bear", 9, 11.13),Stock("cow", 6, 10.19),};for(int i = 0; i < 4;i++) {a[i].show();cout << endl;}const Stock* top = &a[0];for (int i = 1;i < 4;i++) {top = &a->topval(a[i]);}top->show();/*return 0;*/int cc = 10;if (cc > 11)cout << a;
}

这个就是我们设置对象数组,然后进行比较

三  类作用域

在类中定义的名称(如类数据成员名和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是己知的,在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不 会引起冲突,类作用域意味着 不能从外部直接访问类的成员,公有成员函数也是如此。 也就是说,要调用公有成员函数,必须通 过对象

我们在定义方法的时候,在前面一定要写上这个类的名字和::这个作用域运算符,才可以算是写了这个类里面的成员函数

然后我们在调用这个类里面的成员函数是需要进行运用.,->,::这里三个运算符号的

当我们在使用类的时候,我们假设类里面要用到一个常量,如果每次都是开辟一个的话,那是不是太浪费内存了,能不能让这个常量变成公有的,这样不就可以节省内存吗?

首先我么最先想到的就是这个方案,但是这个方案其实是行不通的
因为声明类只是描述了对象的形式,并没有创建对象,也就是说这个值是存放在这个对象里面的。因此,在创建对象前,将没有用于存储值的空间(实际上, C++11提供了成员初始化, 但不适用于前述数组声明)这个会在后面进行讲解

所以我们有两个方法
1  运用枚举

这个枚举的意思就是说我么在编译的时候就已经吧这个month替换为了12,所以不存在上面这个问题

2  运用static关键词

这个是把这个变量放到只读数据段里面,并不是放在对象里面,那么就不会产生错误


总结

剩下的抽象数据在我的数据结构里面有,这里就不讲了

现在我们学习了this指针,对象数组和类的作用域和常量该怎么处理


http://www.ppmy.cn/embedded/172727.html

相关文章

【redis】zset 类型:基本命令(上)

set 集合&#xff1a; 唯一无序。&#xff08;顺序不重要&#xff09;孙行者、行者孙>同一只猴 list 有序。&#xff08;顺序很重要&#xff09;孙行者、行者孙>不同的猴 zset 有序。升序/降序 有序集合 排序的规则是什么&#xff1f; 给 zset 中的 member 引入了…

问问 DeepSeek 什么是网络爬虫

在现代互联网时代&#xff0c;信息的获取和整理变得至关重要&#xff0c;而爬虫&#xff08;Web Crawler&#xff09; 是一种自动化工具&#xff0c;帮助我们从网页上提取数据。爬虫在新闻采集、商品比价、天气数据收集等方面应用广泛。 爬虫的工作原理 爬虫的基本工作流程如下…

基于javaweb的SpringBoot宠物平台系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

P6772 [NOI2020] 美食家

训练角度&#xff1a;图上的状态转移&#xff0c;倍增 → \rightarrow → 优化状态转移&#xff1b; ▍ 题意 精灵王国共有 n n n 座城市&#xff0c;城市从 1 1 1 到 n n n 编号&#xff0c;其中城市 i i i 的美食能为小 W 提供 c i c_i ci​ 的愉悦值。精灵王国的城市…

【贪心算法4】

力扣452.用最少数量的剪引爆气球 链接: link 思路 这道题的第一想法就是如果气球重叠得越多那么用箭越少&#xff0c;所以先将气球按照开始坐标从小到大排序&#xff0c;遇到有重叠的气球&#xff0c;在重叠区域右边界最小值之前的区域一定需要一支箭&#xff0c;这道题有两…

Linux centos 7 grub引导故障恢复

CentOS 7误删GRUB2可以通过以下步骤恢复&#xff1a; 进入救援模式 1. 插入CentOS 7安装光盘&#xff0c;重启系统。在开机时按BIOS设置对应的按键&#xff08;通常是F2等&#xff09;&#xff0c;将启动顺序调整为CD - ROM优先。 2. 系统从光盘启动后&#xff0c;选择“…

详解数据库范式

范式 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. BC范式&#xff08;BCNF&#xff0c;Boyce-Codd Normal Form&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&a…

flutter 专题 八十八 Flutter原生混合开发

使用 Flutter 从头开始写一个 App是一件轻松惬意的事情。但是对于成熟产品来说&#xff0c;完全摒弃原有 App 的历史沉淀&#xff0c;全面转向 Flutter 并不现实。用 Flutter 去统一 iOS/Android 技术栈&#xff0c;把它作为已有原生 App 的扩展&#xff0c;然后通过逐步试验有…