C++中类的成员函数要注意的地方

1.类的成员函数可以在类的定义内定义,也可以在类的定义外定义(这时就是在类内声明)。编译器隐式地将在类内定义的成员函数当作内联函数(按照谷歌C++代码规则——不要超过10行,否则会影响效率!)。

2.成员函数含有额外的、隐含的形参:this。this代表的是调用这个成员函数的对象的地址!例子:

bool same_isbn(const Sales_item &rhs) const

{  return isbn == rhs.isbn;  }

rhs.isbn是函数传入参数对应的实参(是一个Sales_item的对象)的数据成员isbn。而有一个isbn,则指的是this.isbn,也即:调用函数的那个对象的数据成员isbn。比如调用方法为:total.same_isbn(trans);其中trans是:Sales_item trans定义而来的一个对象!

可以把total.same_isbn(trans);重写为: Sales_item::same_isbn(this,trans);或者更明确点: Sales_item::same_isbn(&total,trans);注意:this指针是隐式定义的,不需要在函数形参表中包含this指针(不合法的),但是,在函数体中可以显式地使用this指针。如:bool same_isbn(const Sales_item &rhs) const  {  return this->isbn == rhs.isbn;  },虽然没必要,但是是合法的!注意此处:this->isbn而非this.isbn,因为this并非是对象本身,this是指向对象的指针,同样的表达方式为:(*this).isbn与this->isbn等价!

3.注意到上面2中的const的作用:const改变了隐含的this形参的类型。在调用total.same_isbn(trans)时,隐含的this形参将是一个指向total对象的const Sales_Item*类型的指针。上面的same_isbn函数体相当于:

bool Sales_item::same_isbn (const Sales_item *const this,const Sales_item &rhs) const

        {  return (this->isbn == rhs.isbn);  }

用这种方式使用const的函数称为常量成员函数。由于this是指向const对象的指针,const成员函数不能修改调用该函数的对象。因此,函数same_isbn只能读取而不能修改调用它们的对象的数据成员。

4.构造函数,是一种特殊的成员函数。同样是:必须在类内声明,可以在类内或类外进行定义。必须与类同名,没有返回值。一个类可以有多个构造函数,每个构造函数必须有与其他构造函数不同数目或类型的形参。

Sales_item():units_sold(0),revenus(0,0) { }

比较疑惑的是units_sold(0),revenus(0,0),称为构造函数的初始化列表。构造函数的初始化列表为类的一个或多个数据成员指定初值。一般,除非在初始化列表中有其他表述,否则具有类类型的成员皆被其默认的构造函数自动初始化。于是,isbn由string类默认构造函数初始化为空串。

目前,较完整的类定义为:

class Sales_item {

public :

        double avg_price() const;

        bool same_isbn(const Sales_item &rhs) const

            {    return isbn == rhs.isbn;    }

        Sales_item():units_sold(0),revenus(0,0) { }

private :

        std :: string isbn;

        unsigned units_sold;

        double revenue;

};




转载于:https://my.oschina.net/DanielLee/blog/204380

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值