this指针和对象数组

1 this指针

this指针是一个特殊的指针,当类的某个非静态的成员函数在执行时,就会存在this指针。它指向类的一个对象,且这个对象的某个成员函数正在被调用。

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。

注意:

1)this只能在成员函数中使用。
2)全局函数,静态函数都不能使用this。

如果想要实现一个这样的方法,定义一个成员函数,它查看两个Stock对象,并返回股票价较高的那个对象的引用。首先,如何将两个要比较的对象提供给成员函数呢?例如,假设将该方法命名为topval(),则函数调用stock1.topval()将返回stock1对象的数据,而stock2.topval()将访问stock2对象的数据。如果希望该方法对两个对象进行比较,则必须将第二个对象作为参数传递给它。出于效率方面的考虑,可以按引用来传递参数,也就是说,topval()方法是用一根类型为const Stock&的参数。

其次,如何将方法的答案传回给调用程序呢?最直接的方法是让方法返回一个引用,该引用指向股价总值较高的对象。因此,用于比较的方法的原型如下:

const Stock& topval(const Stock &是) const;

该函数隐式地访问一个对象,而显式地访问另一个对象,并返回其中一个对象的引用。括号中的const表明,该函数不会修改该显示地访问的对象;而括号后的const表明,该函数不会修改被隐式地访问的对象。由于该函数返回了两个const对象之一的引用,因此返回类型也应该为const引用。

const Stock &Stock::topval(condt Stock &s) const
{
       if(s.total_val>total_val)
             return s;
       else
             return ????;
}

如果s.total_val对于total_val,则函数将返回指向s的引用;否则,将返回调用该方法的对象。问题在于,如何称呼这个对象呢?如果调用stock1.topval(stock2),则s是stock2的引用,但stock1没有别名。

C++解决这种问题的方法是:使用被称为this的特殊指针。this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法)。这样,函数调用stock1.topval(stock2)将this设置为stock1对象的地址,使得这个指针可用于topval()方法。一般来说,所有的类方法都将this指针设置为调用它的对象的地址。


注意:每个成员函数(包括构造函数和析构函数)都有一个this指针。this指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样讲不能使用this来修改对象的值。

然而,要返回的并不是this,因为this是对象的地址,而不是对象本身,即*this(将解除引用运算符*用于指针,将得到指针指向的值)。现在,可以将*this作为调用对象的别名来完成前面的方法定义。

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

返回类型为引用意味着返回的是调用对象本身,而不是副本。

2 对象数组

如果用户要创建同一个类的多个对象,可以创建独立的对象变量,但创建对象数组将更合适。

对象数组的声明:
Stock mystuff[4];
前面说过,当程序创建未被显式初始化的类对象时,总是调用默认构造函数。上述声明要求,这个类要么没有显式地定义任何构造函数(在这种情况下,将使用不执行任何操作的隐式默认构造函数),要么定义了一个显式默认构造函数。
可以用构造函数来初始化数组元素。在这种情况下,必须为每个元素调用构造函数:
const int STKS=4;
Stock stocks[STCKS]={
         Stock("NanoSmart",12.5,20),
         Stock("Boffo Objects",200,2.0).
         Stock("Monolithic Oblisks",130,3.25),
         Stock("Fleep Enterpriaes",60,6.5)
};

如果类包含多个构造函数,则可以对不同的元素使用不同的构造函数:
const int STKS=10;
Stock stocks[STKS]={
        Stock("NanoSmart",12.5,20),
        Stock(),
        Stock("Monolithic Obelisks",130,3.25),
};

由于该声明只初始化了数组的部分元素,因此余下的7个元素将使用默认构造函数进行初始化。

初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认构造函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值