复习10:类-续

来源:互联网 发布:河南网络电视大象直播 编辑:程序博客网 时间:2024/05/16 07:56

10.4.4 局部变量

10.4.4.1 对象的复制

      如果t1和t2都是Table对象,t2=t1的默认含义就是把t1按成员逐个复制给t2.这种复制方式应用到具有指针成员的对象时,可能会产生意料之外的作用。具体的例子就省略了。使用编译器生成的默认的拷贝构造函数与此一样。为了避免这种麻烦,需要显式定义拷贝构造函数和重载=运算符。

10.4.5 自由存储

      对new产生的对象多次使用delete释放他,结果是未定义的。

10.4.6类对象作为成员       容器类Club的构造函数使用了成员初始式列表,它由冒号开头,用逗号隔开。成员的构造函数将在容器类本身的构造函数体执行前执行。这些构造函数按照成员在类中声明的顺序执行,而不是按这些成员在初始式表中出现的顺序。为了避免混乱,最好还是按照声明的顺序描述这些初始式。在类本身的析构函数执行之后,各成员的析构函数按照相反的顺序逐个执行。所以无需也不要在类的构造或析构函数中调用成员的构造或析构函数。

10.4.6.1 成员初始化的必要性

      对于那些初始化与赋值不同的情况--即对于那些没有默认构造函数的类的成员对象,对于那些const成员和引用成员而言,对成员的初始式是必不可少的。也不存在对这些成员作初始化的其他方式,而且,不对这种成员作初始化就是错误。强烈建议使用初始式的语法形式,他不仅符合c++的设计而且使得程序员逻辑清晰。

10.4.6.2 成员常量

      对于类的静态整形(包括枚举)成员,可以给他的成员声明加上一个常量表达式作为初始式。其他任何形式的带有初始式的声明都是错误的。

10.4.6.3 成员的复制

10.4.7 数组

      对象数组与普通数组有所不同,数组中的对象必须初始化。定义数组有两种方式,一是形如Table tbl[10]仅给出数组的大小,这样将会采用Table的默认构造函数初始化这10个对象。还可以采用还有初始式的方式显式地为每一个数组对象调用构造函数,如Table tbl[3] = {Table(),Table(3),Table(19)};

       当一个数组被销毁时,它将对各个元素调用析构函数。这里插入点delete的东东:由于c++不区分指向数组的指针和指向元素的指针(指向数组的指针实际上指向了数组的第一个元素)故使用delete和delete[]作用与数组第一个元素分别是释放一个元素和释放了整个数组。对于其他的情况都是未定义的,也是应该避免的。

10.4.8 局部静态存储

10.4.9 非局部存储

      这一点与非局部变量一致。

10.4.10 临时对象

      临时对象经常作为算术表达式的结果出现。如求值x*y+z的中间结果x*y就是临时对象,必须存在某个地方。

      除非有一个临时对象被约束到某个引用或者被用于做命名对象的初始化,否则它将总在建立它的完整表达式结束时销毁。完整表达式是指不是其他表达式的子表达式的表达式。考虑如下函数,这是个常见的错误。       为了比避免这样的错误我们可以使用下面的方式。       也可以使用临时变量作为const引用或者命名对象的初始式,例如,       这样的临时变量在他的引用或者命名变量离开作用域时销。毁。故临时变量是一种匿名的局部变量,返回局部变量的引用是错误的。临时变量不是左值变量,不能约束到非cosnt引用。

10.4.11 对象的放置

      按照默认方式,new将在自由存储中创建对象,且对象的地址有系统决定。如果我们想在其他地方放置对象可以使用带参数的new运算符,其中的参数就是我们设定的放置对象的地址。释放这种对象需要显式地调用析构函数和free函数。由于不常用,这里就轻描淡写;用到时再详细讨论。

10.4.12 联合

      命名联合的定义方式同struct,联合的各个成员将具有想同的地址。联合可以有成员函数(也就是个函数指针嘛),但却不能有静态成员。编译器无法知道被使用的是联合的哪个成员,也就是说,无法知道存储在联合的对象类型。因此联合就不能包含带有构造函数或析构函数的成员。因为联合中对象的成员是共享同一地址,同一片内存。在联合初始化时或联合销毁时不能得知联合内部存储的是哪个类的对象,该调用哪个类的构造函数或析构函数。

原创粉丝点击