欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > C++ primer plus 类和对象下

C++ primer plus 类和对象下

2025/3/15 19:58:29 来源:https://blog.csdn.net/2401_86738532/article/details/146262613  浏览:    关键词:C++ primer plus 类和对象下

目录

前言

一  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指针,对象数组和类的作用域和常量该怎么处理

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词