代码改变世界

C++ 类

2012-06-10 13:17  netwy  阅读(167)  评论(0)    收藏  举报

构造函数
默认构造函数就是调用时不必提供参数的构造函数。如果用户没有声明其他构造函数,编译器就会在需要的时候
设法生成一个,编译器生成的构造函数将隐式的为类类型的成员和它的基类调用有关的默认构造函数,而不会对
基本类型进行初始化。由于const和引用必须进行初始化,包含const和引用成员的类就不能进行默认构建,除非
程序员显示的提供默认构造函数。
析构函数
析构函数通常完成一些清理和释放资源的工作。当自动变量离开其作用域,当一个位于自由存储的对象被删除时,
还有其他类似的情况中,析构函数将被隐式的调用
建立和销毁对象的不同方式
1、一个命名的自动对象,当程序的执行每次遇到它的声明时建立,程序离开它的作用域时销毁
2、一个自由存储的对象,通过net运算符建立,通过delete运算符销毁
3、一个非静态成员对象,作为另一个类对象的成员,在它作为成员的那个对象建立和销毁时,
   它也随之建立或销毁
4、一个数组元素,在它作为数组元素的那个数组被建立和销毁的时候建立和销毁
5、一个局部静态对象,在程序执行中第一次遇到它的声明时建立一次,在程序终止时销毁一次
6、一个全局对象、命名空间对象,类的静态对象,他们只在"程序开始时"建立一次,在程序终止时销毁一次 
7、一个临时对象,作为表达式求值的一部分被建立,在它所出现的那个完整表达式的最后被销毁
8、一个在分配操作中由所提供的参数控制,在通过用户提供的函数获得的存储里放置的对象
9、一个union成员,它不能有构造函数和析构函数
常量成员函数
在函数声明的参数表后面出现const,它指明这些函数不会修改对象的状态。在定义const成员函数是,也要给出const后缀
对于const或非const对象都可以调用const成员函数,而非const成员函数则只能对非const对象调用。
运算符重载

运算符函数的名字有关键字operator后跟对应的运算符构成,运算符函数的定义和使用都可以像其他函数一样。
使用运算符不过是显示调用运算符函数的一种简写形式
二元和一元运算符
二元运算符可以定义为取一个参数的非静态成员函数,也可以定义为取两个参数的非成员函数。
aa@bb可以解释为aa.operator@(bb),或者解释为operator@(aa,bb)
对于一元运算符,无论它是前缀的还是后缀的,都可以定义为无参数的非静态成员函数,或者定义为取一个参数的非成员函数
@aa可以解释为aa.operator@()或者operator@(aa)
运算符的预定义意义
对于用户定义运算符只做了不多的几个假定。特别是operator=,operator[],operator()和operator->只能作为非静态的成员函数
这就保证了他们的第一个运算对象一定是个左值
一个运算符函数必须或者是一个成员函数,或者至少有一个用户定义类型的参数(net和delete函数则没有此项要求)。
如果某个运算符函数想要接受某个内部类型做第一个参数,那么它自然就不可能是成员函数了。

函数调用运算符
函数调用,即记法形式expression(expression-list),可以解释为一种二元运算符,其中将expression作为左运算对象,而
expression-list作为右运算对象。
函数调用运算符()的最明显,或许也是最重要的应用是为对象提供常规的函数调用的语法形式,使它们具有像函数似的行为方式
一个活动起来像函数的对象被称为函数对象
间接运算符
运算符->是一个很重要的概念,迭代器是这个说法的一个重要佐证。该运算符必须是成员函数,它的返回类型必须是一个指针,或则
是一个可以应用->运算符的类对象
派生类

抽象类
如果一个类里存在一个或者几个纯虚函数,这个类就是一个抽象类。纯虚函数就是用=0作为初始式的虚函数。
一个抽象类就是一个接口,类层次结构是一种逐步递增地建立类的方式。