this指针

2023-10-11 21:20:27 浏览数 (2)

我们目前接触到的都是对单个对象的操作,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指针。

0 人点赞