如果在构造函数中使用new来初始化对象的指针成员时必须特别小心。

1 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。

2 new和delete必须相互兼容。new对应于delete,new[ ]对应于delete[ ]。

2      如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。因为只有一个析构函数,所有的构造函数都必须与它兼容。可以再一个构造函数中使用new初始化指针,也可以在另一个构造函数中使指针为空。

3      应定义一个复制构造函数,通过深度复制将一个对象初始化为另一个对象。通常,这种构造函数与下面类似。

String::String(const String & st)

{

num_string++;

len = st.len;

str = new char [len+1];

std::strcpy(str, st.str);

}

4      应当定义一个赋值运算符,通过深度复制将一个对象复制给另一个对象

StringBad & StringBad::operator=(const StringBad & st)

{

if(this == &st)

return *this

delete [] str;

len = st.len;

str = new char [len+1];

std::strcpy(str, st.str);

return *this;

}

总之该函数应当完成一些操作:检查自我赋值的情况,释放成员指针以前指向的内存,赋值数据而不仅仅是数据的地址,并返回一个指向调用对象的引用。

应该和不应该

包含类成员的类的逐成员复制

class Magazine

{

private:

String title;

string publisher;

};

String和string都使用动态内存分配,这是否意味着需要为Magazine类编写复制构造函数和赋值运算符?不,至少对这个类本身来说不需要。默认的逐成员复制和赋值行为有一定的智能。如果您将一个Magazine对象复制或赋值给另一个Magazine对象,逐成员复制将使用成员类型定义的赋值构造函数和赋值运算符。也就是说,复制成员title时,将使用String的复制构造函数,而将成员title赋给另一个Magazine对象时,将使用String赋值运算符,以此类推。

然而,如果Magazine类因其他成员需要定义复制构造函数和赋值运算符,情况将更加复杂;在这种情况下,这些函数必须显式地调用String和string的复制构造函数和赋值运算符,这将在第13章中介绍。


显式调用。

隐式调用就是像正常使用内置类型那样初始化、赋值,符合传统习惯。

C++_类和动态内存分配3-构造函数中使用new的注意事项的更多相关文章

  1. C++_类和动态内存分配6-复习各种技术及队列模拟

    知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...

  2. C++_类和动态内存分配5-使用指向对象的指针

    再探new和delete new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的: 析构函数使用delete来释放这些内存. 字符串是一个字符数组,所以析构函数使用的是带中括号的de ...

  3. C++_类和动态内存分配1—动态内存和类

    静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...

  4. C++_类和动态内存分配2-改进后的String类

    添加前面介绍过的复制构造函数和赋值运算符,使类能够正确管理类对象使用的内存. 知道对象何时被创建和释放. =================================== 修订后的默认构造函数 ...

  5. C++_类和动态内存分配4-有关返回对象的说明

    返回方式: 返回指向对象的引用: 指向对象的const引用: const对象:  =============================================== 返回指向const对象 ...

  6. 《C++ Primer Plus》读书笔记之十—类和动态内存分配

    第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的 ...

  7. C++ primer plus读书笔记——第12章 类和动态内存分配

    第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化 ...

  8. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  9. 《C++ Primer Plus》第12章 类和动态内存分配 学习笔记

    本章介绍了定义和使用类的许多重要方面.其中的一些方面是非常微妙甚至很难理解的概念.如果其中的某些概念对于您来说过于复杂,也不用害怕——这些问题对于大多数C++的初学者来说都是很难的.通常,对于诸如复制 ...

随机推荐

  1. 我的笔记,有关 PhotoShop,给自己的记忆宫殿

    一直有心学习 PhotoShop ,各种教程也 download 了不少,什么祁连山.PS大师之路.Oeasy 等等.看了吗?丫蛋的只看了前面两集!还是在博客上写写坐下笔记,好记性不如烂笔头. 0.先 ...

  2. php 读取和下载execl

    最近用到php 对excel 的操作 下来 小弟为大家 先贴一下自己的代码  有什么补充的 大神们请指点下.感激不尽. 我用的是yii2   yii2中有类 phpexcel 先说说下载吧. 首先下载 ...

  3. opencv3读取视频并保存为图片

    #include <iostream> #include <vector> #include <opencv2/opencv.hpp> using namespac ...

  4. 2.Books

    Books示例说明了Qt中SQL类如何被Model/View框架使用,使用数据库中存储的信息,创建丰富的用户界面. 首先介绍使用SQL我们需要了解的类: 1.QSqlDatabase: QSqlDat ...

  5. Django框架 之 querySet详解

    Django框架 之 querySet详解 浏览目录 可切片 可迭代 惰性查询 缓存机制 exists()与iterator()方法 QuerySet 可切片 使用Python 的切片语法来限制查询集 ...

  6. poj 1988 Cube Stacking (并查集)

    题意:有N(N<=30,000)堆方块,开始每堆都是一个方块.方块编号1 – N. 有两种操作: M x y : 表示把方块x所在的堆,拿起来叠放到y所在的堆上. C x : 问方块x下面有多少 ...

  7. 2.8.3 并发下诡异的HashMap

    package 第二章.并发下诡异的HashMap; import org.junit.Test; import java.util.HashMap;import java.util.Map;impo ...

  8. 在IE11(Win8)中检查up6.2配置

      1.按F12,打开调试模式    2.打开调试程序选项卡 说明:在调试程序选项卡中可看到IE加载的脚本信息是否正确.因为IE有缓存,导致脚本有时不是最新的.    3.打开脚本,up6.js   ...

  9. clojure-emacs-autocomplete

    1. https://github.com/clojure-emacs/cider#keyboard-shortcuts 2. install emacs 24.5 3. http://clojure ...

  10. spring+hibernate工作流程文件名理解

    reg.jsp regsuccess.jsp User.java UserDAO.java UserDAOImpl.java User.hbm.xml Reg.java RegImpl.java Re ...