1.定义成员函数的函数体:类的成员函数必须在类定义中声明,可以在类外定义。在类内定义的成员函数默认为内联函数。类的成员函数可以访问该类的private成员。类的定义应该放在type.h头文件中,类的成员函数的定义应该放在名为type.cc的文件中,后者必须包含前者。
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),revenue(0.0) {}
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
2.成员函数的调用:在编译器中存在隐含的形参。
total.same_isbn(trans);
Sales_item::same_isbn(&total, trans);
this指针的引入:实际上成员函数是这样的。this是指向const对象的指针,该成员函数不能修改调用他的对象,称为常量成员函数。函数被声明为常量成员函数,那么形参表后要加const。
bool Sales_item::same_isbn(const Sales_item *const this, const Sales_item &rhs) const
{return (this->isbn == rhs.isbn);}
3.在函数体外定义类成员函数时,要指明他们是类的成员。
double Sales_item::avg_price() const
{
if(units_sold) return revenue/units_sold;
else return 0;
}
4.构造函数: Sales_item(): units_sold(0),revenue(0.0) {}
形参表和函数体均为空,默认构造函数不需要形参,这时类的成员初始化为0,isbn默认隐式的初始化为空串。
5.重载函数:出现在相同作用域中的两个函数,具有相同的名字,而形参不同,则称为重载函数。重载函数和重复声明是不同的。
局部声明函数会屏蔽外部的重载函数。
void print(double);
void foobar(int ival)
{
void print(int);
print(3.14);
}
6.函数匹配:将函数调用和重载函数集合中的一个函数相关联的过程。
候选函数:找到在调用点上声明可见的与被调函数同名的函数。
可行函数:函数的形参个数相同,实参类型必须和形参类型匹配或可隐式转换。
最佳匹配:不能存在二义性,否则需要强制类型转换。最佳匹配分等级:精确匹配,通过类型提升匹配,通过标准转换匹配,通过类类型转换匹配。
7.重载和const对象:仅当形参是引用或指针时,形参是否为const才有影响。
Record lookup(Phone);
Record lookup(const Phone);//重复声明
Record lookup(Acount&);
Record lookup(const Acount&);//重载