1、一个类就是用户定义类型。
2、在一个类里声明的函数被称为成员函数。
3、常量成员函数,例如int year() const。在函数声明的(空)参数表后面出现的const,它指明这些函数不会修改数据状态。
如果在一个类的外面定义它的const成员函数,也需要给出const后缀。
4、对于const或者非const对象都可以调用const成员函数,而非const成员函数则只能对非const对象调用。
5、偶然有这种情况,一个成员函数在逻辑上是const,但是它却仍然需要改变某一个成员的值。
如果在某一个表示中,只有一部分允许改变,将这些成员声明为mutable是最合适的。
如果在一个对象在逻辑上保持为const的同时,其中的大部分都需要修改,那么最好将这些需要修改的数据放入另一个独立的对象中,并间接地访问它。
6、如果一个函数是在类定义的内部定义的,而不是仅仅在这里声明,它就被作为一个在线成员函数。在类里定义成员函数应该是小的、频繁使用的函数。
或者用inline成员函数定义,紧随类定义之后。
7、在一个应用中,如果缺乏一些合适的小而有效的类型,并因此过分使用一些代价昂贵的类,就可能导致严重的时间与空间上的低效率。
8、由于const和引用必须进行初始化,包含const或引用成员的类就不能进行默认构造,除非显式提供了默认构造器。
---建立对象的不同方式以及怎么销毁--
1、局部变量
对一个局部变量的构造函数将在控制线程每次通过该变量的声明时执行,在控制离开该变量所在的块时,将执行其构造函数。
对于对象的复制有两种可能:一种是复制构造函数,一种是复制赋值。这两种情况很不一样。
复制构造函数是去完成对未初始化的存储区的初始化,而复制赋值运算符则必须处理原本的对象。
对于复制赋值运算符的一般处理策略是防止自赋值,删除老元素,初始化,复制那些新元素。
2、自由存储区变量
由new调用,直到delete调用将其释放。一旦delete后,再以任何方式访问该变量都是错误的。
3、类对象作为成员
成员的构造函数将在容器类的构造体执行之前先被执行。
对于const成员以及引用成员,只存在初始化式的方式进行初始化。对于其他类型而言初始化式或者赋值都可以选择,但是初始化式可能效率会更高。
4、成员常量
对于static型的变量,可以加上const表达式作为初始式。
7、数组变量
像C一样,C++不区分指向单个对象的指针和指向某个数组起始元素的指针。因此在delete时要说明是单个对象还是数组。
8、局部静态存储变量
对于该类变量,构造函数是在控制线程第一次通过该对象的定义时调用。
程序结束时,析构函数将按照相反次序调用。
10、非局部存储变量
在所有函数之外定义的变量,即全局变量,命名空间的变量以及各个类的static变量。
在main被激活之前完成初始化。析构在main退出后调用。
如果在同一个编译单位 里,对非局部变量的构造将按照它们的定义顺序进行。
如果在不同编译单位里,其构造顺序没有保证。依赖于具体实现。
11、临时对象
如果存在于字表达式,那么会在比如x+yz之后被销毁,除非被约束到某个引用或者被用作初始化。
临时对象不能被约束到某个非const引用。
12、operator new 放置语法。晦涩。以后再看。
13、联合
联合可以有成员函数,但不能有静态成员。
其中各个成员具有相同的地址。
最好仅仅用于底层代码或者作为某一个类实现中的一部分,由这个类去维护联合的信息。
建议:
1、在类声明中需要定义整型常量时,使用枚举。
2、临时对象将在建立它的那个完整表达式结束时被销毁。