c++ 类 总结
#############
## 类
#############
友元(friend)、可变成员(mutable)、静态成员(static)
构造函数:(冒号后面为初始化列表,用来初始化数据成员)
Fun():x(5),y(10){}
成员函数:必须在类内部声明,但是不必在内部定义。如果在内部定义,则默认为inline。
外部定义:必须用域操作符'::'指定所属类名。例如:ClassName::fun1(){}
struct: 如果类用该关键字定义,则默认成员是公有的。
class :默认成员是私有的。
类的访问符:public 、private、protected。
访问符出现的次数、位置都没有限制;访问符限制其后定义的成员的访问级别。
public:可以由程序的所有部分访问。
private:只能本类内部访问。
protected:本类已经后代类访问。
关键字 typedef: std::string::size_type index
typedef 给一个类型设置别名
重载操作符:
1、两个重载成员的形参数量和类型不能完全相同。
2、类的成员函数只能重载类的其他成员函数,不能重载非成员函数和其他类中声明的函数。
inline:类内部成员函数默认inline,也可以显示的指定inline
三种方式定义内联函数:
1、在类内部定义函数。
2、在类内部的函数声明上用inline显示指定。
3、在类外部的函数定义上用inline显示指定。
类定义:一个类只能被定义一次,如果在多个文件中定义一个类,则每个文件中的定义必须相同。
头文件保护符:header guard,保证即使头文件在同一文件中被包含多次,类定义也只出现一次。
前向声明(forward declaraton):class Screen。Screen为类类型,它在声明后,定义前这个状态,是一个不完全的类型(incompete type)。
不完全类型(incompete type):
1、不能定义该类型的对象。
2、用于定义指向该类型的指针已经引用
3、用于声明(而非定义) 使用改类型作为形参类型或返回类型的 函数。
类不可以具有自身类型的数据成员,但可以有指向自身类型的指针和引用。
####################
##类对象
####################
1、定义类型时并不进行内存分配,当我们定义对象时会分配内存
2、类类型的使用:
a、将类的名字直接用作类型名。
b、关键字class|struct + 类的名字。
3、类定义后可以接一个对象列表,必须以分号结束。
4、this指针:成员函数具有附加的隐含形参,即指向该类对象的一个指针-this
5、可变数据成员(mutable data member):永远不能为const ,即使他是const对象的成员。mutable数据成员可以被const成员函数修改
6、常成员函数:const放在参数列表后面修饰成员函数表示常成员函数
特性:const 成员函数不能修改它所在对象的数据成员。(mutable 除外)
const 成员函数只能访问const 成员函数,成员函数只能访问成员函数。
7、成员访问操作符:‘.' '->' 。前者是对象访问成员,后者是对象指针访问成员
8、‘::'类作用域限定符,可以用于在类外定义成员函数。
9、在类作用域外定义的成员函数,需要使用完全限定名即:ClassName::fun
函数的返回值因为在函数名前,也需要使用完全限定名。
形参列表和函数体在函数名后,则不需要使用。
10、名字查找优先级:先后为所在函数体、所在类、所在文件
#####################
##构造函数
#####################
1、构造函数初始化列表:以冒号开始,以逗号分割,每个数据成员后面用括号包含初始化式
2、初始化const或者引用数据成员的唯一机会是在构造函数初始化列表。
3、默认构造函数:只有没有定义构造函数时系统才会自动生成默认构造函数
4、没有定义构造函数并且全体数据成员均为public的类,可以采用与初始化数组元素乡土的方式初始化其成员(按照声明的顺序)。例如:
ClassName obj = {0,0};
################
##友元
################
友元机制(friend):允许一个类将对自身非公有成员的访问权限授予指定的函数或类。
特性:只能出现在类定义内部(任何地方),不受声明出现部分的访问控制影响。
例如:
class Screen
{
friend class Window_Mgr;
}
Window_Mgr 对象可以访问Screen的私有成员。如果Screen想访问Window_Mgr 的私有成员 则需要在Window_Mgr 中设置 friend class Screen;
友元可以是非成员函数、其他类的成员函数、或者整个类。
###############
## static
###############
1、数据成员:
static 数据成员是与类关联的,独立于该类的任何对象。
非static 数据成员与对象关联,存在该类的每个对象中。
2、成员函数:
static成员函数:没有this形参,可以直接访问所属类的static成员,不能直接使用非static成员。
3、static成员的定义:在声明前添加static关键字。static成员遵循访问规则。
4、static成员的使用:
a:通过作用域操作符直接调用,Account::rate();
b: 通过对象调用:Account act;act.rate();
c: 通过指针调用:Account* p = &act; p->rate();
5、外部定义static成员,无须重复指定static保留字,改保留字只出现在类定义体内部的声明处。
6、static函数没有this指针,也不能被指明为const,也不能被声明为虚函数。
7、static 数据成员必须在类定义体外部定义(static const 除外)。
static 数据成员不通过构造函数初始化
例如:int ClassName::data = initData();//类定义体外、main函数外