创建类时编译器自动生成以下成员函数(如果用户没有定义):

1、默认构造函数

2、拷贝构造函数

3、赋值操作符

4、默认析构函数

5、地址操作符

以下一一说明:

构造函数

构造函数在创建对象时被调用。

在用户没有提供构造函数时,编译器将创建一个默认构造函数,这个构造函数不接受任何参数,也不执行任何操作,使类的值在初始化的时候是未知的。

用户创建的构造函数在所有参数都有默认值的情况下也是默认构造函数。

只有在构造函数上才能使用初始化列表,可以用初始化列表初始化const常量成员的值。

拷贝构造函数

拷贝构造函数用于初始化过程中。

拷贝构造函数不能重载,它有固定的参数。

1、每当程序产生对象副本的时候,编译器就会使用拷贝构造函数,如:函数按值传递对象时;函数返回对象时。

2、编译器产生临时对象时也会使用拷贝构造函数,具体时机因编译器不同而异。

默认的拷贝构造函数复制每一个非静态成员的值。若成员本身就是一个类对象,则使用该类的拷贝构造函数。

深拷贝与浅拷贝:

浅拷贝:一些类成员是使用new初始化的、指向数据的指针,默认的拷贝构造函数只会复制数据本身的值,这会导致拷贝之后的对象中同一指针指向相同的地址,在析构函数中使用 delete 时会发生错误。

深拷贝:用户自己定义的显式的拷贝构造函数,复制一个指针引用的数据结构的一个副本,并将副本的地址赋给新对象的成员。

赋值操作符

将已有对象赋给另一个对象时,使用赋值操作符。另外:初始化对象时使用 = 符号不一定会使用赋值操作符,但是一定会使用拷贝构造函数。

默认的赋值操作符接受并返回一个类对象的引用。

赋值操作符的功能与拷贝构造函数类似,同时也有浅拷贝和深拷贝的问题。

在解决深拷贝的问题时,要注意以下几点:

1、因为接受赋值的对象可能有以前分配了的数据,所以要先delete一遍。

2、用this指针检查并避免自我复制。(否则会导致上一步delete错误)

3、函数要返回一个指向调用对象的引用,即*this。

特别注意:赋值操作不会产生新的对象。

析构函数

无参数,不能重载。

在对象过期时调用。分为以下几种情况:

1、如果创建的是静态存储类对象,程序结束时调用。

2、如果创建的是自动存储类对象,在执行完代码块时被调用。

3、如果通过new创建的对象,对象会驻留在堆中,使用delete释放内存时调用。

4、如果创建的是临时对象,在结束对该临时对象的使用时调用。

地址操作符

默认的地址操作符返回this指针。

C++拾遗(九)类与动态内存分配(1)的更多相关文章

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

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

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

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

  3. C++_类和动态内存分配3-构造函数中使用new的注意事项

    如果在构造函数中使用new来初始化对象的指针成员时必须特别小心. 1 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete. 2 new和delete必须相互兼容.new对应于 ...

  4. 【C语言天天练(九)】动态内存分配

    引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化. ...

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

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

  6. C++拾遗(十)类与动态内存分配(2)

    静态成员函数 声明时包含关键字static.注意以下两点: 1.使用静态成员函数时不能通过对象或者this指针来调用,只能使用类名+作用域解析符来调用. 2.静态成员函数只能使用静态成员. new操作 ...

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

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

  8. 《C++ Primer Plus》12.6 复习各种(类和动态内存分配的)技术 笔记

    12.6.1 重载<<运算符要重新定义<<运算符,以便将它和cout一起用来显示对象的内容,请定义下面的友元运算符函数:ostream & operator<&l ...

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

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

随机推荐

  1. C语言学习笔记--类型定义&联合

    一.类型定义 C语言自定义数据类型 (typedef) C语言提供一个叫做typedef的功能来声明一个已有的数据类型的新名字. typedef int Length; 使得Length成为int类型 ...

  2. 获取机器本地的公网ip地址

    1. ipecho.net/plain

  3. Redis需要你来做的算法优化

    阅读一个优秀的Server内核实现,早期的代码比后期的代码要好得多.因为在早期的代码里,你可以学习到一个黑客级别的程序猿到底在思考什么.同时,你能看到他哪里写得差劲,以及后来是怎么优化的. 如果你一心 ...

  4. node.js环境配置(angularjs高级程序设计中出现的错误)

    一:npm install connect会出现错误:解决方法 1:$ npm install connect@2.X.X 2:$ npm install serve-static: 建立server ...

  5. 斐波那契数列 51nod

    1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) ...

  6. js给页面加style

    今天做项目时遇到一个问题,我的a.jsp引入了b.jsp,c.jsp也引入了b.jsp,而b.jsp里面的style是根据引入的不同动态改变的(在a.jsp.c.jsp中写js改变).网上找了好多代码 ...

  7. Android Framework 记录之二

    接着上次的记录,续写. 23.services文件夹 文件 描写叙述 class AlarmManagerService extends IAlarmManager.Stub { //定时管理服务 p ...

  8. hdu 3631 Shortest Path(Floyd)

    题目链接:pid=3631" style="font-size:18px">http://acm.hdu.edu.cn/showproblem.php?pid=36 ...

  9. hdu 3037 Saving Beans(组合数学)

    hdu 3037 Saving Beans 题目大意:n个数,和不大于m的情况,结果模掉p,p保证为素数. 解题思路:隔板法,C(nn+m)多选的一块保证了n个数的和小于等于m.可是n,m非常大,所以 ...

  10. Java 编程的动态性,第3部分: 应用反射--转载

    在 上个月的文章中,我介绍了Java Reflection API,并简要地讲述了它的一些基本功能.我还仔细研究了反射的性能,并且在文章的最后给出了一些指导方针,告诉读者在一个应用程序中何时应该使用反 ...