前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >this指针

this指针

作者头像
用户7272142
发布2023-10-11 21:20:27
1260
发布2023-10-11 21:20:27
举报
文章被收录于专栏:Republic博客Republic博客

我们目前接触到的都是对单个对象的操作,show是用来输出对象中的价格总计,如果要让程序知道类的数据,一般是让方法返回一个值供外部使用。即

代码语言:javascript
复制
class Stock
{
private:
double total_val;
...
public:
double total() const
{
return total;
}
}

有些情况我们需要两个对象互相访问的情况,比如我们这个类中,比较两个对象的total,const将成员函数转为const成员函数,无法修改任何成员函数,也代表着该total是只读的。通过返回我们可以查看,然后比较返回最高的一支股票。当然,我们这篇笔记主要说的是this指针,我们可以定义一个成员函数,然后参数传入另一个对象,并且返回较高的对象的引用,避免生成临时对象造成的浪费和不必要的调用。

代码语言:javascript
复制
const Stock& topval(const Stock&s);const

我们来解释一下这个成员函数 括号内的const表示传入一个常对象,即对象的数据成员不能被修改 而括号后的const表示这是一个const成员函数 该对象的数据成员也不能被修改 至于返回对象的引用,我们在引用那篇笔记已经很详细的说明了。 我们调用的时候可以这样调用

代码语言:javascript
复制
Stock top = stock1.topval(stcok2);

因为我们是隐式调用stcok1所以默认是stock1的成员,而stock2作为函数参数就要显示访问

代码语言:javascript
复制
const Stock& topval(const Stock&s) const
{
    if(s.total_val>total_val)
    {
    return s;
    }
    else
    {
    return ?
    }
}

如果参数对象大,我们可以直接返回他的引用,但如果是隐式调用stcok1,我们该如何称呼它呢?this指针。

this指针开篇

this指针指向用来调用成员函数的对象(作为隐藏参数传递给方法),如此,stock1.topval(stock2)将设置this作为隐藏对象stock1的地址,这样就可以表示这个隐式对象了,一般来说,所有的类方法都将this指针设置为调用它的对象的地址,当然,直接用total_val也可以表示,不过这是一种简写。 每个成员函数都有一个this指针,this指针指向调用对象,如果方法需要引用整个调用对象,可以用*this。在函数的括号后面使用const将this限定为const,这样就不能使用this修改对象的值,this是对象的地址,而*this才是对象本身 所以上面的代码可以这样写

代码语言:javascript
复制
const Stock& topval(const Stock&s) const
{
    if(s.total_val>total_val)
    {
    return s;
    }
    else
    {
    return *this
    }
}

现在我们再进一步修改一下我们之前写的那个类,只需要把我们改写的show和topval加入即可

对象数组

和Stock类一样,用户通常要创建同一个类的多个对象,当然也可以创建单独对象变量。声明对象数组和标准类型数组相同。

代码语言:javascript
复制
Stock mystuff[4];

创建对象肯定要调用构造函数,如果没有定义,那么就会执行默认的构造函数,如果有,就执行。作为Stock对象,可以使用对象的方法。可以使用构造函数来初始化数组元素,在这种情况下,为每个元素调用构造函数:

代码语言:javascript
复制
const int STKS = 4;
Stock stcoks\[STKS\]= {
Stock("NanoSmart",12.5,20);
Stock("boffo objects",200,2.0);
Stock("monolithic obelisks",130,3.25);
Stock("Fleep Enterprises",60,6.5);
};

这里的代码使用标准格式对数组进行初始化,如果类包含多个构造函数,则可以对不同的元素使用不同的构造函数:

代码语言:javascript
复制
const int STKS = 10;
Stock stcoks\[STKS\]= {
Stock("NanoSmart",12.5,20);
Stock();
Stock("monolithic obelisks",130,3.25);
};

上述代码使用了Stock(const string&co,long n,double pr);初始化stock[0]stcok[2] 使得构造函数stcok()初始化stock[1],剩下的对象元素将使用默认构造函数进行初始化。初始化对象数组的方案,首先使用默认构造函数创建数组元素,然后花括号中的构造函数,将创建临时对象,然后将临时对象的内容赋给相应的元素中。因此,创建类对象数组,则必须要有默认构造函数。

代码语言:javascript
复制
//usestock2.cpp
#include <iostream>
#include "stcok.h"
int main()
{
    Stock stcokers[STKS] = {
    Stock("NanSmart",12,20.0),
    Stock("boffo objects", 200, 2.0),
    Stock("Monolithic obelisks", 130, 3.25),
    Stock("Fleep Enterprises", 60, 6.5)
    };
    std::cout << "Stock holding:\n";
    int st = 0;
    for (size_t st = 0; st < STKS; st++)
    {
        stcokers[st].show();
    }
    const Stock* top = &stcokers[0];
    for (size_t st = 1; st< STKS; st++)
    {
        top = &top->topval(stcokers[st]);
    }
    std::cout << "\nMost valuable holding:\n";
    top->show();
    return 0;

}

大部分设计工作是在类设计完成后

代码语言:javascript
复制
void Stock::show() const
{
    std::cout << "Company: " << company
        << "Share: " << share << '\n'
        << "share price: $" << share_val
        << "Total Worth: $" << total_val << '\n';
}

可以转成下面这种C++风格的程序

代码语言:javascript
复制
void Stock::show(const Stock * this) 
{
    std::cout << "Company: " << this->company
        << "Share: " << this->share << '\n'
        << "share price: $" <<this->share_val
        << "Total Worth: $" << this->total_val << '\n';
}

show(&top)将调用对象的地址赋给了this指针。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • this指针开篇
  • 对象数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com