第12章 类和动态内存分配

1.静态类成员

     

      上面是静态成员的创建方式。无论创建了多少对象,程序都只创建一个静态类变量副本。不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。静态类成员可以在类声明之外使用单独的语句来进行初始化,因为静态类成员是单独存储的,而不是对象的组成部分。

      静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域操作符来指出静态成员所属的类。但如果静态成员是整型或枚举型const,则可以在类声明中初始化。

2.复制构造函数

       复制构造函数用于将一个对象复制到新创建的对象中,它用于初始化过程中,而不是常规的赋值过程中。将新对象显式地初始化为现有的对象时,复制构造函数都将被调用。下面4种声明都将调用复制构造函数:

      中间的2个声明可能会使用复制构造函数直接创建metoo和also,也可能使用复制构造函数生成一个临时对象,然后将临时对象的内容赋给metoo和also,这取决于具体的实现。最后一种声明使用motto初始化一个匿名对象,并将新对象的地址赋给pStringbad指针。

      每当程序生成了对象副本时,编译器都将使用复制构造函数。具体地说,当函数按值传递对象或函数返回对象时,都会使用。

      下述情况,将使用复制构造函数:将新的对象初始化为一个同类对象;将值按对象传递给函数;函数按值返回对象;编译器生成临时对象。

      默认的复制构造函数逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值。如果类中包含的静态数据成员在新对象被创建时发生变化,则应该提供一个显式构造函数来处理该变化问题。如果类中包含了使用new初始化的指针成员,也应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。浅复制仅浅浅地复制指针信息,而不会深入“挖掘”来复制指针引用的结构。

3.赋值操作符

      C++允许类对象赋值,这是通过自动为类重载赋值操作符实现的。它的隐式实现也对成员进行逐个复制,但静态数据成员不受影响。原型如下:Class_name & Class_name::operator= (const Class_name &);

      由于默认赋值操作符不合适而导致的问题,解决办法是提供赋值操作符(进行深度复制)定义。其实现与复制构造函数相似,但也有一些差别:

      1)由于目标对象可能引用了以前分配的数据,所以函数应使用deletep[]来释放这些数据。

      2)函数应当避免将对象赋给自身;否则,给对象重新赋值之前,释放内存操作可能删除对象的内容。

      3)函数返回一个指向调用对象的引用。

      注意,赋值操作符只能由类的成员函数重载。

4.静态类成员函数

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/1.jpg

5.构造函数中使用new时应注意的事项

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/2.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/3.jpg

下面是3个构造函数范例:

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/4.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/5.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/6.jpg

6.有关返回对象的说明

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/7.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/8.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/9.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/10.jpg

https://p-blog.csdn.net/images/p_blog_csdn_net/xuanya0214/EntryImages/20091013/11.jpg

7.再谈布局new操作符

      系统不会为使用布局new操作符创建的对象调用析构函数。所以必须显示使用布局new操作符创建对象的析构函数。

8.在类中嵌套结构或类声明

      在类声明中声明的结构、类或枚举被称为是被嵌套在类中,其作用域为整个类。这种声明不会创建数据对象,而只是指定了可以在类中使用的类型。如果声明是在类的私有部分进行的,则只能在这个类使用被声明的类型;如果声明是在公有部分进行的,则可以在类的外部通过作用域解析操作符使用被声明的类型。如果Node是在Queue类的公有部分声明的,则可以在类的外面声明Queue::Node类型的变量。

      下面是队列的类声明:

9.成员初始化列表法

     如果Classy是一个类,而mem1、mem2和mem3都是这个类的数据成员,则类构造函数可以使用如下的句法来初始化数据成员:

    从概念上说,这些初始化工作都是在对象创建时完成,此时还未执行括号中的任何代码。注意:

    1)这种格式只能用于构造函数;

    2)必须用这种格式来初始化非静态const数据成员,如第8点中的qsize成员。

    3)必须用这种格式来初始化引用数据成员。如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值