博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中类的成员函数要注意的地方
阅读量:7142 次
发布时间:2019-06-28

本文共 1685 字,大约阅读时间需要 5 分钟。

hot3.png

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

你可能感兴趣的文章
Unity3d热更新(四):压缩文件
查看>>
sysctl.conf文件详解
查看>>
在连接中的EOF意味着什么?
查看>>
我的友情链接
查看>>
获得指定日期【月初和月末】
查看>>
Angular动画
查看>>
谈谈redis,memcache的区别和具体应用场景
查看>>
redis安装开发使用
查看>>
Java注解技术
查看>>
ArangoDB 3.2 Beta 版本发布,3项新特性为独家所有!
查看>>
java读取xml文件字段值
查看>>
5-3 8 shell介绍 命令历史 补全 别名 通配符 重定向
查看>>
分布式应用的各基本领域及开发技术概要
查看>>
python文件管理
查看>>
Flex布局兼容知识点总结
查看>>
Truffle 3.0部署智能合约至Ethereum节点
查看>>
Hadoop-HBase安装和配置
查看>>
go-xorm报错(expect \d+ desination arguments in Scan,but 1)
查看>>
1.4 TCPIP网络之网络层
查看>>
hive
查看>>