C++入门——构造函数和析构函数
参考链接
- https://www.bilibili.com/video/BV1et411b73Z?p=106
构造函数和析构函数
对象的初始化和清理是两个非常重要的安全问题:
- 一个对象或者变量没有初始状态,对其使用后果是未知
- 使用完一个对象或变量,没有及时清理,也会造成一定的安全问题
C++利用构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。如果不提供构造函数和析构函数,编译器会提供空实现的构造函数和析构函数。
构造函数
作用
主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
语法
类名(){}
- 构造函数,没有返回值也不写void
- 函数名称与类名相同
- 构造函数可以有参数,因此可以发生重载
- 程序在调用对象时候会自动调用构造,无需手动调用,而且只会调用一次
分类
- 按参数分为:有参构造和无参构造(默认构造)
例如:
class Person
{public:Person(){cout << "调用无参构造函数" << endl;}Person(int a){cout << "调用有参构造函数" << endl;}~Person(){cout << "调用析构函数" << endl;}
};
- 按类型分为:普通构造和拷贝构造
// 拷贝构造函数
Person(const Person &p)
{age = p.age;
}
调用方式
括号法
Person p1; // 默认构造函数调用
Person p2(10); // 有参构造函数调用
Person p3(p2); // 拷贝构造函数调用
注意事项
调用默认构造函数的时候,不要加()。因为这行代码,编译器会认为是函数声明。
显示法
Person p2 = Person(10);
Person p3 = Person(p2);
注意事项
Person(10);
// 匿名对象,当前行执行结束后,系统会立即回收掉匿名对象- 不要利用拷贝构造函数初始化匿名对象。如
Person(p3);
,编译器会认为Person(p3) === Person p3;
,对象重定义。
隐式转换法
Person p4 = 10; // 相当于写了Person p4 = Person(10);,有参构造
Person p5 = p4; // 拷贝构造
拷贝构造函数的调用时机
C++中拷贝构造函数调用时机通常有三种情况:
- 使用一个已经创建完毕的对象来初始化一个新对象
void test()
{Person p1(20);Person p2(p1);
}
- 值传递的方式给函数参数传值
void doWork(Person p){}
void test02()
{Person p;doWork(p);
}
- 以值方式返回局部对象
Person doWork2()
{Person p1;return p1;
}
void test03()
{Person p = doWork2();
}
构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数
- 默认构造函数(无参,函数体为空)
- 默认析构函数(无参,函数体为空)
- 默认拷贝函数,对属性进行值拷贝
构造函数调用规则如下:
- 如果用户定义有参构造函数,C++不再提供默认无参构造函数,但会提供默认拷贝函数
- 如果用户定义拷贝构造函数,C++不再提供其他构造函数
深拷贝与浅拷贝
浅拷贝
简单的赋值拷贝操作。
浅拷贝带来的问题就是堆区的内存重复释放
深拷贝
在堆区重新申请空间,进行拷贝操作
例如:
Person(const Person &p)
{cout << "Person拷贝构造函数调用" << endl;m_Age = p.m_Age;// m_Height = p.m_Height; 编译器默认实现// 深拷贝操作m_Height = new int(*p.m_Height);
}
初始化列表
C++ 提供了初始化列表语法,用来初始化属性
语法
构造函数(): 属性1(值1), 属性2(值2)...{}
例如:
Person(int a, int b, int c): m_A(a), m_B(b), m_C(c){}
析构函数
作用
主要作用在于对象销毁前系统自动调用,执行一些清理工作。
语法
~类名(){}
- 析构函数,没有返回值也不写void
- 函数名称与类名相同,在名称前加上符号~
- 析构函数不可以有参数,因此不可以发生重载
- 程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次
析构函数中,可以将堆区开辟数据做释放
例如:
~Person()
{if (m_Height != NULL){delete m_Height;m_Height = NULL;}
}
C++入门——构造函数和析构函数相关推荐
- C++编程入门系列之十四(类与对象:构造函数和析构函数)
C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...
- C++入门:构造函数,析构函数,拷贝构造函数,运算符重载详解
目录 类的6个默认成员函数 一.构造函数 1.概念 2.特征如下: (1) 函数名与类名相同. (2)无返回值. (3)对象实例化时编译器自动调用对应的构造函数. (4)构造函数可以重载. (5)如果 ...
- python在删除对象时会自动调用析构函数_Python面向对象程序设计构造函数和析构函数用法分析...
本文实例讲述了Python面向对象程序设计构造函数和析构函数用法.分享给大家供大家参考,具体如下: 构造函数和析构函数 1.构造方法的使用 很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名 ...
- C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)
1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...
- php构造和析构方法,php5构造函数与析构函数实例
自php5起,有了构造函数与析构函数. 这使得php更富有面向对象的魅力了. 在php4时,构造函数用的是与类同名的函数来进行构造这个动作. 例如: 复制代码 代码示例: /* * myclass.p ...
- 提高C++性能的编程技术笔记:构造函数和析构函数+测试代码
对象的创建和销毁往往会造成性能的损失.在继承层次中,对象的创建将引起其先辈的创建.对象的销毁也是如此.其次,对象相关的开销与对象本身的派生链的长度和复杂性相关.所创建的对象(以及其后销毁的对象)的数量 ...
- c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]
说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...
- C++中的构造函数VS析构函数
1.构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行.构造函数的名称与类的名称的完全相同的,并且不会返回任何数据类型,也不会返回void.构造函数用于为某些成员变量设置初 ...
最新文章
- Linux系统管理必备知识之查看系统用户和用户组
- DIV周边添加投影及背景固定
- 面板——卡片面板、常规折叠面板、手风琴折叠
- 【数据结构与算法】之深入解析“下一个更大元素I”的求解思路与算法示例
- delphi打开word文件(刚刚学会的嘿嘿~)
- linux同步数据库,Linux两台服务器mysql数据库同步
- ie6使用绝对定位position:absolute,box不显示
- [UIKit学习]00.关于前置知识(storyboard,UIViewController,类扩展,项目属性)
- Linux下连接SQL Server
- 开源电子海图和webGIS
- c++ 读取二进制bin文件
- 人工智能常用的编程语言
- 矩阵转置---c语言实现
- 千牛挂“虹(Rainbow)”,域和角色不胜数
- node ncc 打包
- jumpserver管理员账号被锁定
- 计算机音乐谱夜空中最亮的星歌词,夜空中最亮的星简谱及歌词
- 【Framework】透视Android中的Handler
- html怎么消除打印的进纸,打印机进纸打印故障解决秘方实例
- 大厂网络工程师面试题整理汇总