this指针

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

class Stock
{
private:
double total_val;
...
public:
double total() const
{
return total;
}
}

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

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

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

Stock top = stock1.topval(stcok2);

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

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才是对象本身
所以上面的代码可以这样写

const Stock& topval(const Stock&s) const
{
	if(s.total_val>total_val)
	{
	return s;
	}
	else
	{
	return *this
	}
}

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

对象数组

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

Stock mystuff[4];

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

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);
};

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

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],剩下的对象元素将使用默认构造函数进行初始化。初始化对象数组的方案,首先使用默认构造函数创建数组元素,然后花括号中的构造函数,将创建临时对象,然后将临时对象的内容赋给相应的元素中。因此,创建类对象数组,则必须要有默认构造函数。

//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;

}

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

void Stock::show() const
{
	std::cout << "Company: " << company
		<< "Share: " << share << '\n'
		<< "share price: $" << share_val
		<< "Total Worth: $" << total_val << '\n';
}

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

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指针。

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c/206/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 6天前
下一篇 6天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注