一、构造函数特点:

1、构造函数也是函数,其函数名和类名相同
2、构造函数无返回值
3、构造函数可以重载
4、构造函数创建对象时自动调用
注:当设计一个类时,如果没有手动实现一个构造函数,那么编译器会自动生成一个无参的构造函数。

二、拷贝构造函数

1、拷贝构造函数定义

它只有一个参数,参数类型是本类的引用。
如果设计类的人不写拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。
例子:

#include<iostream>
using namespace std;
class Complex{public:double real, imag;Complex(double r,double i){real = r; imag = i;}Complex(const Complex & c){real = c.real; imag = c.imag;cout<<"Copy Constructor called"<<endl ;}
};int main(){Complex cl(1, 2);Complex c2 (cl);  //调用拷贝构造函数cout<<c2.real<<","<<c2.imag;return 0;
}

输出结果:
Copy Constructor called
1,2

2、拷贝构造函数被调用的三种情况

(1)当用一个对象去初始化另一个对象时,会调用拷贝构造函数
例:

Complex c2(c1);
Complex c2 = c1;   //初始化语句,不是赋值语句

(2)如果函数F的参数是类A的对象,那么当F被调用时,类A的拷贝构造函数将被调用。

#include<iostream>
using namespace std;
class A{public:A(){};A(A & a){cout<<"Copy constructor called"<<endl;}
};
void F(A a){ }
int main(){A a;F(a);return 0;
}

程序输出结果:
Copy constructor called
这是因为F函数的形参a在初始化时调用了拷贝构造函数。
(3)如果函数的返回值是类A的对象,则函数返回时,类A的拷贝构造函数被调用

#include<iostream>
using namespace std;
class A {public:int v;A(int n) { v = n; };A(const A & a) {v = a.v;cout << "Copy constructor called" << endl;}
};
A Func() {A a(4);return a;
}
int main() {cout << Func().v << endl;return 0;
}

程序的输出结果是:
Copy constructor called
4

4、深拷贝与浅拷贝

(1)浅拷贝
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一内存空间。

浅拷贝后果
1、在进行堆空间释放时,会导致多次释放,即:调用析构函数时,会造成同一份资源析构两次。也就是同一块内存delete两次,会导致内存泄露。
2、浅拷贝两个指针指向同一块内存,任何一方变动都会影响 另一方
3、

int main()
{Test t1;Test t2 = t1; //调用默认的拷贝构造函数t1.freeP();t2.freeP(); //浅拷贝在进行堆空间释放时,会导致多次释放return 0;
}

(2)深拷贝
深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经拷贝后的指针是指向两个不同地址的指针。

深拷贝实现

 //深拷贝
Test(const Test& other){_x = other._x;//深拷贝p = new int;*p = *(other.p);}

结论:
如果一个类成员变量没有指针,不需要申请堆空间时,那么直接使用默认的拷贝构造函数,反之,则要手动进行深拷贝实现。

三、析构函数

在C++中,为了更好在对象被销毁时,做好清理和释放的工作,引入析构函数。
特点:
1、析构函数名与类名相同
2、析构函数不能重载,一个类只能有一个析构函数
3、析构函数无参
4、析构函数在对象被销毁时,自动调用
5、每一个对象被销毁时,就会自动调用一次析构函数
6、如果类设计者没有实现析构函数,编译器会提供一个默认的析构函数。

参考:
http://c.biancheng.net/view/151.html

简述构造函数、拷贝构造函数、深拷贝浅拷贝、析构函数相关推荐

  1. 什么是拷贝构造函数?拷贝构造函数何时被调用

    1.什么是拷贝构造函数: CA(const CA& C)就是我们自定义的拷贝构造函数.可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变 ...

  2. 【C++】构造函数 无参构造函数 有参构造函数 拷贝构造函数内联函数

    文章目录 函数的定义 函数的的使用方法 函数的返回值 值传递 指针传递 引用传递 C++引用作为函数返回值 函数重载(Function Overloading) 运算符重载(Operator Over ...

  3. C++编程思想 第1卷 第11章 引用和拷贝构造函数 拷贝构造函数 拷贝构造函数

    编译器对如何从现有的对象产生新的对象进行了假定. 当通过按值传递的方式传递一个对象时,就创立了一个新对象,函数体内的 对象是由函数体外的原来存在的对象传递的 编译器假定我们想使用位拷贝来创建对象 每当 ...

  4. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

  5. C++ 类和对象(二):构造函数、析构函数、拷贝构造函数、运算符重载

    构造函数 析构函数 拷贝构造函数 运算符重载 class Date {}; 可以看到,上面那个类没有任何成员,是一个空类,但是它真的什么都没有吗?其实一个类在我们不写的情况下,都会生成6个默认的成员函 ...

  6. C++拷贝构造函数和浅拷及深拷贝详解

    目录 拷贝构造函数 1,使用一个已经创建完毕的对象来初始化一个对象 2,值传递的方式给函数参数传值 3,值方式返回局部对象 深拷贝和浅拷贝 什么是浅拷贝和深拷贝 浅拷贝带来的问题 深拷贝 拷贝构造函数 ...

  7. 详解析构函数、拷贝构造函数

    目录 一.析构函数(析构器) (一).使用方式及注意事项 1.使用方式 2.注意事项 (二).默认析构函数 二.拷贝构造函数 (一).使用方式及注意事项 1.使用方式 2.注意事项 (二).默认拷贝构 ...

  8. String 的普通构造函数、拷贝构造函数、析构函数、赋值函数

    转自:http://blog.csdn.net/xiaoxiangzhu660810/article/details/8149398 题目:编写类String的构造函数.析构函数和赋值函数,已知类St ...

  9. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

    构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由"底层向上"开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达 ...

  10. 构造函数,拷贝构造函数,赋值函数

        C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...

最新文章

  1. mysql 存储过程 格式化_转 mysql 存储过程初探
  2. Freescale 基于IMX536处理器的Dialog DA9053电源管理参考设计
  3. 一道SQL面试题(行列互换)
  4. Try to create new xs project in AG3
  5. 在线压缩html,JS代码压缩 - javascript代码压缩 - jsmin在线js压缩工具
  6. 克莱因瓶为何永远无法装满?科学家发现:宇宙或许就是克莱因瓶!
  7. python语法学习第十一天--迭代器
  8. springMvc--接受日期类型参数处理
  9. Unicode 入门详解(V14.0版本)
  10. android webview 百度地图,Android WebView显示地图
  11. 软件测试的底层逻辑是什么?
  12. grub4dos 制作WIN7、WINPE2003、Ubuntu、dos工具箱多启动U盘 (不量产)
  13. php 删除服务器指定目录图片
  14. c语言if的作用,c语言if语句的用法
  15. 极寒天气肆虐美国中西部地区
  16. 如何在Vue引入静态图片?
  17. 终端服务器安全层在协议流中检测到错误,智能卡远程登录AD域环境下win7/2008,返回STATUS_LOGON_TYPE_NOT_GRANTED错误...
  18. matlab分组形式条形图,Matplotlib带标签的分组条形图
  19. 函数强凸 strong convexity
  20. HNU小学期实训课设

热门文章

  1. python 类中的那些小技巧,滚雪球第四季收尾篇
  2. 【艾琪出品】-【网页设计与网站建设 】测试题系列三
  3. 兴业银行企业网银预处理软件
  4. 安卓复杂滑动案例 自定义behavior源码分析 实现头布局图片的缩放透明度变化,RecycleView的滑动布局,坐标变化
  5. 使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)
  6. PC寄存器/程序计数器(Program Counter Register)
  7. 修改协议栈内容来同时使用两个串口
  8. 一个纸牌发牌的完整类
  9. mongodb创建2ds索引语句
  10. Unity 垂直同步(V Sync)