一定义
类的成员分为public,private,和protected三种。
类内部定义的函数默认为inline。
对于成员函数,在形参表之后添加const关键字,得到常量成员函数,则此成员函数不能改变操作对象的数据成员。
类可以有class和struct两个关键字定义。区别:在类的左括号之后,第一个访问标号之前;如果是class定义的,则默认这些成员是私有的;如果是struct定义的,则默认这些成员是公有的。
重载成员函数。
显式指定inline成员函数。
二隐含的this指针
三类作用域
□”.”左边跟对象,“->”左边跟指针。
成员函数中使用到的名字的查找顺序:
1查询成员函数局部作用域。
2查询类作用域。
3查询外围作用域。(成员函数出现之前的作用域)。
四构造函数
1构造函数初始化式
Sales_item::sales_item(const string &book):isbn(book),units_sold(0),revenue(0.0){}
构造函数分两个阶段执行:(1)初始化阶段:(2)普通的计算阶段。计算阶段由构造函数中的所有语句构成。
解析:
(a)也就是说在构造函数发挥作用之前,对象有一个初始化阶段;如果不能正常初始化(比如,某数据成员没有定义默认初始化),则报错。
(b)也就是说:在开始执行构造函数之前,必须完成初始化。
□必须对任何const或者引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。
成员初始化的顺序与声明的顺序是一样的。
Eg<
Class X{
Int i;
Int j;
Public:
X(int val):j(val),i(j){}
};
这个程序可能是错误的,因为i先被初始化。报错的原因是:使用为初始化的j来初始化i.
2默认构造函数
只有当类没有定义构造函数时,编译器才会自动生成一个默认构造函数。
所以,如果定义了其他构造函数,提供一个默认构造函数几乎总是对的。
(因为这可以避免很多麻烦,比如,假如没有默认构造函数,则构造函数必须提供初始化值,才能继续执行)。
用单个实参来调用的构造函数定义了从形参到该类类型的一个隐式类类型转换。
使用explicit可以抑制构造函数定义的隐式转换。
Eg,
类sales_item
explicit sales_item(std::istream &is);构造函数
same_isbn(sales_item&);成员函数
则对于item.same.isbn(cin)会报错(cin不会因为构造函数自动转化为类类型);但是去掉explicit就不会报错。
□单形参构造函数最好为explicit从而避免错误。
五友元函数
友元机制允许一个类将其非公有成员的访问授予指定的函数或者类。
六static类成员(函数或者数据)
类的static成员理解:1类似全局对象。2理解为此类定义的全局对象。使用前加上类的名字。3static数据成员是与类关联的对象,并不与该类的对象关联。
Static数据成员必须在外部定义(仅仅一次)。(内部只能声明,不能定义和初始化)
Static const 数据成员即使在类声明时初始化,也必须在外部定义。
Eg,
Class ac{
Static const int pe=30;
}
Const int ac::pe;