类和对象-对象的特性-构造函数和析构函数
发布日期:2021-11-20 10:17:43
浏览次数:10
分类:技术文章
本文共 2820 字,大约阅读时间需要 9 分钟。
**1.**对象的初始化和清理是两个非常重要的安全问题
一个对象或者变量没有初始状态,对其使用后果是未知的 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 **2.**构造函数和析构函数解决了上述问题,这两个函数将会被编译器自动调用,完成对象的初始化和清理工作。 对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构, 编译器会提供编译器提供编译器提供的构造函数和析构函数是空实现。3.构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器调用,无需手动调用
语法: 类名(){}
注意事项:
1.构造函数,没有void也没有返回值 2.函数名称与类名相同 3.构造函数可以有参数,因此可以发生重载 4.程序在调用对象时会自动调用构造,无需手动调用,而且只会调用一次**4.析构函数:**主要作用在于对象销毁前系统自动调用,执行一些清理工作
语法:~类名(){}
注意事项:
1.析构函数,没有void也没有返回值 2.函数名称与类名相同,在名称前加符号~ 3.析构函数可以不可以有参数,因此不可以发生重载 4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次#include "pch.h"#includeusing namespace std;//构造函数进行初始化操作class person { public: person() { /*1.构造函数,没有void也没有返回值 2.函数名称与类名相同 3.构造函数可以有参数,因此可以发生重载 4.程序在调用对象时会自动调用构造,无需手动调用,而且只会调用一次 */ cout << "构造函数字啊调用" << endl; } //析构函数进行清理操作 ~person() { cout << "析构函数字啊调用" << endl; }};void test01() { person p;//在栈上的数据,test01执行完毕,会释放这个对象,即释放前会调用析构函数}
5.构造函数的分类以及调用
两种分类方式: 按参数分为:有参构造和无参构造 按类型分为:普通构造和拷贝构造 三种调用方式: 括号法 显示法 隐式转换法#include "pch.h"#includeusing namespace std;class person { public://构造函数 person() { cout << "无参构造函数" << endl; } person(int a) { age = a; cout << "有参构造函数" << endl; }//拷贝构造函数 person(const person &p) { //将传入的人身上的所有属性,拷贝到我身上 age = p.age; cout << "拷贝构造函数" << endl; } ~person() { cout << "析构函数" << endl; } int age;};void test() { //1.括号法 person p2(10);//有参函数调用 person p3(p2);//拷贝构造函数调用 //注意事项:1.调用默认构造函数时候,不要加() // 2.不要利用拷贝构造函数 初始化匿名对象 //2.显示法 person p1; person p2 = person(10);//有参构造 person p3 = person(p2);//拷贝构造 //2.不要利用拷贝构造函数 初始化匿名对象 //编译器会认为person(p3)===person p3; //3.隐式转换法 person p4 = 10//相当于写了 person p4 = person(10)}
6.拷贝构造函数的调用时机
C++中拷贝构造函数调用时机通常有三种情况
1.使用一个已经创建完毕的对象来初始化一个新对象解释:
person a1(100); person b1=a1; 这里的用已有的a1对象来初始化b1对象时会调用 拷贝构造。2.值传递的方式给函数参数传值
3.以值方式返回局部对象
#include "pch.h"#includeusing namespace std;//1.使用一个已经创建完毕的对象来初始化一个新对象//2.值传递的方式给函数参数传值//3.以值方式返回局部对象class person { public: person() { cout << "无参构造函数" << endl; } person(int age) { cout << "有参构造函数" << endl; m_age = age; } person(const person &p) { cout << "拷贝构造函数" << endl; m_age = p.m_age; } ~person() { cout << "析构函数" << endl; } int m_age;};//1.使用一个已经创建完毕的对象来初始化一个新对象void test01() { person p1(20); person p2(p1);}//2.值传递的方式给函数参数传值void dowork(person p) { }void test02() { person p; dowork(p);}//3.以值方式返回局部对象person dowork1() { person p1; return p1;}void test03() { person p = dowork1();}int main(){ test01(); test02(); test03();}
.7构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体为空) 2.默认析构函数(无参,函数体为空) 3.默认拷贝构造函数(对属性进行值拷贝)调用规则如下:
1.如果用户定义有参构造函数,C++不在提供默认无参构造,但是会提供默认拷贝构造2.如果用户定义拷贝构造函数,C++不会再提供其他构造函数
转载地址:https://blog.csdn.net/weixin_43223362/article/details/102731373 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月01日 12时27分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
李笑来力作:《让时间陪你慢慢变富 定投改变命运》
2021-06-29
【李笑来BOX践行群】谁在控制比特币网络?
2021-06-29
VBS命令:关于以管理员身份运行程序的VBS命令
2021-06-29
【测试有效】【全网唯一,不夸张】不同VBS脚本之间传递参数的方法
2019-04-26
比特币的优势在哪里?
2019-04-26
比特币的劣势在哪里?
2019-04-26
BOX定投践行群介绍
2019-04-26
慢慢变富 | 一次财富自由的机会
2019-04-26
python 利用datetime模块转化excel数字日期为标准日期
2019-04-26
python下.ui转为.py文件,并用另一.py调用显示
2019-04-26
解决方案:使用pycharm安装第三方库失败-----更换下载地址镜像
2019-04-26
你跟大神程序员的差距,就在这8本内功心法
2019-04-26
制作PPT的7条黄金法则
2019-04-26
最新!全球学术排名出炉:22所中国大学位居世界100强
2019-04-26
终于有人把SaaS讲明白了
2019-04-26
吐血整理:关于机器学习不可不知的15个概念
2019-04-26