C++ primer plus 类和对象下

server/2025/3/19 0:15:05/

目录

前言

一  this指针

 二  对象数组

三  类作用域

总结


前言

接着上一篇继续


一  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/server/176093.html

相关文章

前端(vue)学习笔记(CLASS 4):组件组成部分与通信

1、组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; 注意点&#xff1a; 1、结构只能有一个根元素 2、全局样式&#xff08;默认&#xff09;&#xff0c;影响所有组件&#xff1b;局部样式&#xff0c;scoped下样式&#xff0c;只作用于当前组件 3、el根实例独…

平板作为笔记本副屏使用spacedesk

平板作为笔记本的一块副屏使用 软件 spacedesk 已上传&#xff0c;可自行下载。&#xff08;上传需要审核且只能绑定一个资源&#xff0c;可在官网自行下载&#xff0c;或私聊我&#xff09; PC版 移动版 spacedesk-2-1-17.apk 电脑版按照提示一步一步安装节即可移动端直接…

SpringBoot入门-(1) Maven【概念+流程】

SpringBoot入门-(1) Maven 动机 对于企业级大项目而言&#xff0c;需要手动导入很大Jar包&#xff0c;费时费力&#xff0c;且Jar包之间也可能存在依赖和冲突&#xff0c;这些关系导致Jar包之间想毛线团一样缠在一起&#xff0c;因此我们需要一个包管理系统帮我们自动下载导入…

06.Python基础4

目录 元组 tuple 1.概述 2.可变数据为什么可变 3.不可变数据如何变化 4.基础操作 4.1创建元组 4.2定位元素 4.3遍历元组 4.4序列拆包 5.字符串 str 5.1定义 5.2编码 5.2.1字符集 5.2.2编码方式 5.2.3不可变 5.3序列 5.4字面值 5.4.1单引和双引号的区别 5.4.2…

jmeter 循环控制器遍历列表中的数据

jmeter遍历列表中的数据并使用if控制器做相应的处理 测试场景请求获取列表接口发送请求JSON Extractor 提取对应字段 Loop Controller计数器If Controller 测试场景 请求获取列表接口使用循环控制器遍历接口&#xff0c;根据state字段判断是否发起其他请求 请求获取列表接口 …

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目&#xff0c;直接写一个vite的插件&#xff0c;通过这个插件可以动态注入环境变量&#xff0c;然后当打包的时候&#xff0c;自动注入这个时间到环境变量中&#xff0c;然后在项目中App.vue中或者Main.tsx中打印出来&#xff0c;这就知道是什么时候编译的项目了…

通向AGI的未来之路!首篇2D/视频/3D/4D统一生成框架全景综述(港科大中山等)

文章链接&#xff1a; https://arxiv.org/pdf/2503.04641 摘要 理解并复现现实世界是人工通用智能&#xff08;AGI&#xff09;研究中的一个关键挑战。为实现这一目标&#xff0c;许多现有方法&#xff08;例如世界模型&#xff09;旨在捕捉支配物理世界的基本原理&#xff0…

【Mac】安装 Parallels Desktop、Windows、Rocky Linux

一、安装PD 理论上&#xff0c;PD只支持试用15天&#xff01;当然&#xff0c;你懂的。 第一步&#xff0c;在 Parallels Desktop for Mac 官网 下载 Install Parallels Desktop.dmg第二步&#xff0c;双击 Install Parallels Desktop.dmg 第三步&#xff0c;双击安装Paralle…