C++ Primer Plus第六版

您所在的位置:网站首页 c静态类作用 C++ Primer Plus第六版

C++ Primer Plus第六版

2023-05-31 08:01| 来源: 网络整理| 查看: 265

第12章 类和动态内存分配

静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态变量副本

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

在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放内存。如果使用new[](包括中括号)来分配内存,则应使用delete[](包括中括号)来释放内存。

特殊成员函数

C++提供了下面这些函数:

默认构造函数,如果没有定义构造函数;默认析构函数,如果没有定义;复制构造函数,如果没有定义;赋值运算符,如果没有定义;地址运算符,如果没有定义。 复制构造函数

复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程。

Class_name(const Class_name&);

它接受一个指向类对象的常量引用作为参数

何时调用复制构造函数

最常见的情况是将新对象显示转化为现有对象 每当程序生成了对象副本时,编译器都将使用复制构造函数。(当函数按值传递对象或函数返回对象时,都将使用复制构造函数)

默认复制构造函数

默认的复制构造函数逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值。

如果类中包含使用了new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。 StringBad::StringBad(const StringBad& st) { num_strings++; //handle static member update len = st.len; //same length str = new char[len + 1]; //allot space std::strcpy(str, st.str); //copy sting to new location cout ~JustTesting(); // destory object pointed to by pc3 pc1->~JustTesting(); //对于使用定位运算符创建的对象,应以与创建顺序相反的顺序进行删除。 复习各种技术 转换函数

要将单个值转换为类类型时,需要创建原型如下所示的类构造函数:

c_name(type_name value); 其中c_name为类名,type_name是要转换的类型的名称。

要将类转换为其他类型,需要创建原型如下的类成员函数值:

operator type_name(); //应返回所需类型的值 其构造函数使用new的类

如果使用new运算符来分配类成员指向的内存

对于指向的内存是由new分配的所有类成员,都应在类的析构函数中对其使用delete,该运算符将释放分配的内存。如果析构函数通过对指针类成员使用delete来释放内存,则每个构造函数都应当使用new来初始化指针,或将它设置为空指针。构造函数中要么使用new[],要么使用new,而不能混用。如果构造函数使用的是new[],则析构函数应使用delete[];如果构造函数使用new,则析构函数使用delete。应定义一个分配内存(而不是指针指向已有内存)的复制构造函数。这样程序将能够将类对象初始化为另一个类对象。这种构造函数的原型通常如下: className(const className&) 应定义一个重载赋值运算符的类成员函数,其函数定义如下: c_name& c_name::operator=(const c_name& cn) { if (this == &cn) return *this; delete[] c_pointer; c_pointer = new type_name[size]; ... return *this; 成员初始化列表的语法

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

Classy::Classy(int n, int m) :mem1(n), mem2(0), mem3(n*m + 2) { //... }

上述代码将mem1初始化为n,将mem2初始化为0,将mem3初始化为n*m + 2。从概念上说,这些初始化工作是在对象创建时完成的,此时还未执行括号中的任何代码。

这种格式只能用于构造函数;必须用这种格式来初始化非静态const数据成员必须用这种格式来初始化引用数据成员。 数据成员被初始化的顺序与它们出现在类声明中的顺序相同,与初始化器中的排列顺序无关。 不能将成员初始化列表语法用于构造函数之外的其他类方法。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3