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