12.1 动态内存和类
静态类成员:类的所有对象共享一个静态类成员。不能在类声明中初始化静态成员变量,因为声明只是描述如何分配内存但是并不分配内存。(如果静态成员是整型或枚举型const,则可以在类声明中初始化)。静态类成员可以在类声明之外使用单独的语句进行初始化,因为静态类成员是单独存储的,而不是对象的组成部分。此外,初始化要在方法文件中进行而不在头文件中。
在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放内存。如果使用new[]来分配内存,则应使用delete[]来释放内存。
默认构造函数:如果没有任何构造函数,C++将创建默认构造函数,编译器将提供一个不接受任何参数,也不执行任何操作的构造函数,那么它的值在初始化是未知的。
复制构造函数:将一个对象复制到新创建的对象中。新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。默认的复制构造函数逐个复制非静态成员(浅复制),复制的是成员的值。如果类中包含其值在新对象被创建时发生变化的静态数据成员,则应该提供一个显式复制构造函数来处理计数问题。另外,在复制指针时会使变量指向同一个地址。
深度复制是在复制完地址后在新对象中创建了一个地址副本。如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针。
类对象赋值:接受并返回一个指向类对象的引用。将已有对象赋值给另一个对象(与复制构造函数类似,不过复制构造函数是创建新对象,赋值是赋值给已存在对象)
函数应当避免将对象赋给自身,否则,给对象重新赋值时,释放内存操作可能删除对象的内容。
12.2 改进后的新String类
空指针:nullptr
对于静态成员函数,不能通过对象调用静态成员函数,实际上,静态成员函数甚至不能使用this指针。如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算符来调用它。另外,由于静态成员函数不与特定的对象相关联,因此只能使用静态数据函数。
12.3 在构造函数中使用new时应注意的事项
12.4 有关返回对象的说明
返回指向const对象的引用:如果函数返回(通过调用对象的方法或将对象作为参数)传递给它的对象,可以通过返回引用来提高其效率。返回对象将调用复制构造函数,但返回引用不会。引用指向的对象应该在调用函数执行时存在,引用对象和调用对象的类型应该相同(都是const)。
返回指向非const对象的引用:重载赋值运算符以及重载cout一起使用的<<运算符。
返回对象:如果返回对象是被调用函数的局部变量,则不应该按引用方式返回。
返回const对象
12.5 使用指向对象的指针