【C++ Primer Plus(第六版)】第十二章 类的动态内存分配

【C++ Primer Plus(第六版)】第十二章 类的动态内存分配,第1张

第十二章 类的动态内存分配

总结一下,这一章讲的这件事:会使用new和delete对空间的分配。
day34实现了string类例子,来完成对整个章节的总结。

12.1 动态内存和类

在类中不能确定字符串长度时,比如姓名,要定义一个指针,然后通过动态内存方式分配内存。在统计类中new的数量时,应该使用一个static静态变量,这样无论创建了多少次对象,程序只创建一个静态类变量。书中举了一个stringbad类的例子,说明了这些问题。
C++类自动提供了如下几种特殊成员函数:

  • 默认构造函数
  • 默认析构函数
  • 复制构造函数(深拷贝)
    string str1;
    string str2(str1); // 调用复制构造
    string str3 = str1; // 调用复制构造
    string *str4 = new string(str1) // 调用复制构造
  • 赋值运算符=
    需要重载等号运算符
    str2 = str1 ; 赋值=运算符
  • 地址运算符
12.2 改进后的string类(见day33每日编程,实现了string的类)
  • C++11 新增的nullptr指针
    以前C++语言中使用NULL和(void*)0来表示空指针,NULL是C定义的一个宏。C++11引入了nullptr指针。以后写代码就用nullptr指向空指针了。
  • 关于类的静态成员和静态函数的描述:
    静态成员不能使用this指针,因为静态成员存放在另一个内存区。静态方法可以访问静态成员(见day33每日编程,静态成员函数中使用静态变量)。
12.3 在构造函数中使用new时应该注意的事项
  • 如果在new初始化指针成员,则在构造函数中使用delete。
  • 使用类型要一样,要使用new [] , 也要使用delete[]。
  • 在类中应该定义一个深度复制构造函数。
  • 定义一个赋值运算符,深度复制。
12.4 有关返回对象的说明

返回指向const对象的引用。 下面是一个例子,说明了通过返回const 引用,程序更高效。如果返回引用,将调用了复制构造函数,而返回引用不会。

12.5 使用指向对象的指针

下面这行代码:

string * st = new string(“aaa”);  指针st指向了无名对象。
12.6 12.7 举了一个模拟对队列的例子

这个代码在每日编程day32,太长了,没理解完这个程序。

  • 这里注意类的初始化方式:初始化列表
    类的构造函数应该一共类成员的值。但是,如果类中定义的const成员,则不能在构造函数中直接通过赋值进行初始化,原因:调用构造函数时,对象将在括号中的代码执行之前被创建。因此,调用Queue(int qs)构造函数之前就给Queue类中的4个成员变量分配了内存,然后程序流程进入Queue(int qs)括号中,使用常规的赋值方式将值存在对应的内存中。因此对于const成员必须在执行构造函数之前对其进行初始化。C++提供了一种特殊的语法来完成上面const变量的初始化赋值,语法如下:



    也可以对所有的变量使用这种方式初始化:

    C++·11提供了类內初始化,如下图,这与初始化列表等价。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1295646.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存