文章目录

  • 前言
  • 一、基本概念
    • 1 构造函数
    • 2 析构函数
  • 二、示例
    • 1. 构造函数和析构函数的简单使用
    • 2. 拷贝构造函数的调用
    • 3. 浅拷贝和深拷贝

前言

本文讲述了构造函数和析构函数的概念以及对应的示例,以便加深理解。


一、基本概念

1 构造函数

构造函数用于初始化类的对象,可以由程序员自己定义,也可以由编译器定义(构造函数内为空)。
其特点:
1.没有返回类型。
2.函数名和类名相同。
3.可以有参数,也可以没有。
4.可以重载。
5.程序会自动调用。
按照参数分类
1.无参构造函数
2.有参构造函数(包括拷贝构造函数)
3种构造方法
1.括号法
2.显示法
3.隐式转换法
调用规则
1.编译器会给类添加至少三个构造函数:1,默认构造函数;2,析构函数(空);3,拷贝构造函数(值拷贝):如果不写拷贝构造,编译器会自动生成一个拷贝构造函数,Name = c.Name;。
2.如果自己写了有参构造函数,编译器不会再提供默认构造函数,但还是会提供拷贝构造函数。
3.如果自己写了拷贝构造函数,编译器其他两种构造函数都不会再提供。

2 析构函数

析构函数用于销毁之前声明的类对象,系统自动调用,用~+类名声明。
1.析构函数不可以有参数。
2.析构函数无法重载。

二、示例

1. 构造函数和析构函数的简单使用

class Cat
{public:Cat(){cout << "喵是无参构造函数" << endl;}Cat(string name){Name = name;cout << "喵是有参构造函数" << endl;}//用于拷贝c的属性值,用常量引用的方式进行Cat(const Cat &c){Name = c.Name;cout<< "喵是拷贝构造函数" << endl;}~Cat(){cout << "喵是析构函数" << endl;}string Name;//咪咪名字
};void FindName()
{//括号法Cat cat1;//用默认构造函数时,不能加括号,否则编译器会当作函数声明。Cat cat2(cat1);//拷贝构造函数调用Cat cat3("小300");//有参构造函数调用。Cat cat4(cat3);//拷贝构造函数调用cout << "第一个猫的名字是:" << cat1.Name << endl;cout << "第二个猫的名字是:" << cat2.Name << endl;cout << "第三个猫的名字是:" << cat3.Name << endl;cout << "第四个猫的名字是:" << cat4.Name << endl;//显示法Cat cat5;//默认构造函数Cat cat6 = Cat("三号楼");//有参构造函数调用。Cat cat7 = Cat(cat6);//拷贝构造函数调用Cat("蹭铁棍");//匿名对象,会直接调用构造函数和析构函数,再去执行后面的内容。//Cat(cat7);不要匿名初始化拷贝构造函数cout << "第五个猫的名字是:" << cat5.Name << endl;cout << "第六个猫的名字是:" << cat6.Name << endl;cout << "第七个猫的名字是:" << cat7.Name << endl;//隐式调用string name8 = "来两根";Cat cat8 = name8;cout << "第八个猫的名字是:" << cat8.Name << endl;
}int main()
{FindName();
}
喵是拷贝构造函数
喵是普通有参构造函数
喵是拷贝构造函数
第一个猫的名字是:
第二个猫的名字是:
第三个猫的名字是:小300
第四个猫的名字是:小300
喵是无参构造函数
喵是普通有参构造函数
喵是拷贝构造函数
喵是普通有参构造函数
喵是析构函数
第五个猫的名字是:
第六个猫的名字是:三号楼
第七个猫的名字是:三号楼
喵是普通有参构造函数
第八个猫的名字是:来两根
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数

2. 拷贝构造函数的调用

void eat1(Cat cat)
{cout << cat.Name << "吃猫粮" << endl;
}Cat eat2()
{Cat cat("炸糊的栗子");cout << cat.Name << "吃骨头" << endl;return cat;
}
void FindName()
{//使用一个已经创建的对象来初始化新的对象Cat cat1("小300");//有参构造函数调用。Cat cat2(cat1);//拷贝构造函数调用cout << "第一个猫的名字是:" << cat1.Name << endl;cout << "第二个猫的名字是:" << cat2.Name << endl;//值传递传值      Cat cat3("烤糊的栗子");eat1(cat3);cout << "第三个猫的名字是:" << cat3.Name << endl;//值方式返回局部对象Cat cat4 = eat2();cout << "第四个猫的名字是:" << cat4.Name << endl;
}
喵是普通有参构造函数
喵是拷贝构造函数
第一个猫的名字是:小300
第二个猫的名字是:小300
喵是普通有参构造函数
喵是拷贝构造函数
烤糊的栗子吃猫粮
喵是析构函数
第三个猫的名字是:烤糊的栗子
喵是普通有参构造函数
炸糊的栗子吃骨头
喵是拷贝构造函数
喵是析构函数
第四个猫的名字是:炸糊的栗子
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数

3. 浅拷贝和深拷贝

深拷贝:在堆区开辟空间,完成拷贝。
浅拷贝:简单赋值拷贝的方式就属于浅拷贝,比如默认的拷贝构造函数。

class Cat
{public:Cat(){cout << "喵是无参构造函数" << endl;}//Cat(string name)//{//  Name = name;// cout << "喵是普通有参构造函数" << endl;//}Cat(string name, int age){Name = name;Age = new int(age);cout << "喵是普通有参构造函数" << endl;}Cat(const Cat &c){Name = c.Name;//深拷贝,用new将传入Age的地址解引用然后在堆区重新创建一个空间,与cat3所指向的新内存空间就不一样了,不会发生析构函数重复释放报错的问题。Age = new int(*c.Age);cout<< "喵是拷贝构造函数" << endl;}~Cat(){if (Age != NULL){delete Age;Age = NULL;}cout << "喵是析构函数" << endl;}string Name;//咪咪名字int *Age;//咪咪年龄
};void FindName()
{浅拷贝,仅发生值传递//Cat cat1("小300");//Cat cat2(cat1);////cout << "第一个猫的名字是:" << cat1.Name << endl;//cout << "第二个猫的名字是:" << cat2.Name << endl;//深拷贝,用new在内存中开辟新空间Cat cat3("小300",2);Cat cat4(cat3);cout << "第三个猫的名字是:" << cat3.Name << endl;cout << "第三个猫的年龄是:" << *cat3.Age << endl;cout << "第四个猫的名字是:" << cat4.Name << endl;cout << "第四个猫的年龄是:" << *cat4.Age << endl;
}int main()
{FindName();
}
喵是普通有参构造函数
喵是拷贝构造函数
第三个猫的名字是:小300
第三个猫的年龄是:2
第四个猫的名字是:小300
第四个猫的年龄是:2
喵是析构函数
喵是析构函数

C++总结笔记(五)——构造函数和析构函数相关推荐

  1. 实验五 构造函数和析构函数

    实验五 构造函数和析构函数 A. Point(类与构造) 题目描述 输入 输出 输入样例 输出样例 参考代码 B. Date(类与构造) 题目描述 输入 输出 输入样例 输出样例 参考代码 C. 分数 ...

  2. 提高C++性能的编程技术笔记:构造函数和析构函数+测试代码

    对象的创建和销毁往往会造成性能的损失.在继承层次中,对象的创建将引起其先辈的创建.对象的销毁也是如此.其次,对象相关的开销与对象本身的派生链的长度和复杂性相关.所创建的对象(以及其后销毁的对象)的数量 ...

  3. 【C++学习笔记2】构造函数、析构函数、函数多态、抽象类、函数模板

    这次笔记介绍构造函数.析构函数.函数多态.抽象类.函数模板 一.构造函数 1.在定义对象,构造函数程序将自动执行,他的类型跟类名一致 函数声明最好放在自己的类里面,这样才符合类的封装,也可以像下面一样 ...

  4. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

  5. Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数

    一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...

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

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

  7. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  8. 《C++ Primer Plus》10.3 类的构造函数和析构函数 学习笔记

    10.3.1 声明和定义构造函数 构造函数原型: // constructor prototype with some default arguments Stock(const string &am ...

  9. php中的构造函数和析构函数,php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...

最新文章

  1. 节能信标组比赛过程中直流电源设置
  2. hdu3037 Saving Beans
  3. 详解为什么32位系统只能用4G内存.
  4. 【转载】Apache Ranger剖析:Hadoop生态圈的安全管家
  5. 14、utf8和UTF-8在使用中的区别
  6. 基于Jupyter Notebook从头学习机器学习 | 入门资料分享
  7. 制作JD的手动和自动轮播图片板块
  8. 2021年网络工程师备考心得
  9. 广电光猫超级管理员账号及光猫改桥接模式教程
  10. 机器人运动学轨迹跟踪控制(Matlab实现)
  11. macOS调整分辨率与HiDPI
  12. 贪吃蛇python游戏
  13. 一语道破项目管理知识体系42个过程
  14. html5首字母大小写,css中如何设置英文首字母大写
  15. increment java_Java LongAdder increment()用法及代码示例
  16. 百度BML飞桨训练营(十)面部表情迁移PaddleGAN--蒙娜丽莎在微笑
  17. 背光尺寸怎么设计才合理?
  18. 斯坦福 机器学习-第四章学习理论
  19. 【马修笔记】大波段顶底反转的节奏交易.
  20. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

热门文章

  1. 【求助】小系统组成大系统所遇到的问题
  2. MSN Messenger终于好使了
  3. 区别 (function($){...})(jQuery)、$(function(){ })和$.fn
  4. java 线程之线程状态
  5. 160-PHP 文本替换函数str_replace(一)
  6. Java微信公众号开发(五)—— SVN版本控制工具
  7. At least one JPA metamodel must be present!
  8. Playground
  9. hibernate继承映射之每个具体类一张表
  10. 大前端完整学习路线(完整版),路线完整版