C++对象的初始化和处理

生活中我们买的电子产品都基本会有出厂设置!在某一天我们不用时候也会删除一些自己信息数据保证安全。
C++中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置。

构造函数和析构函数

对象的初始化和清理也是两个非常重要的安全问题

一个对象或者变量没有初始状态,对其使用后果是未知
同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。

c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作,对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。

构造函数: 主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
析构函数: 主要作用在于对象销毁前系统自动调用,执行一些清理工作。

构造函数语法: 类名 () {}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
示例:

#include <iostream>
using namespace std;class person
{public:person()//构造函数调用{cout<<"hello world"<<endl;}
};void test()
{person p;
}int main()
{test();return 0;
}

析构函数语法: ~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号~
3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次

#include <iostream>
using namespace std;class person
{public:~person()//析构函数调用{cout<<"hello world"<<endl;}
};void test()
{person p;//在栈上的数据,该函数执行完后会释放掉
}int main()
{test();return 0;
}

构造函数的分类及调用:

两种分类方式
按参数分为: 有参构造和无参构造
按类型分为: 普通构造和拷贝构造

三种调用方式:
括号法
显示法
隐式转换法

示例:

#include <iostream>
using namespace std;class person
{
public:person()//无参构造函数调用{cout<<"无参构造函数调用"<<endl;}person(int a)//有参构造函数调用{age=a;cout<<"有参构造函数调用"<<endl;}person(const person &p)//拷贝函数,除了括号里面这样写的都是普通函数{age=p.age;cout<<"拷贝函数构造调用"<<endl;}int age;~person(){cout<<"析构函数调用"<<endl;}
};//调用
void test()
{//1.括号法person p1;//默认构造函数,注意不要加()person p2(10);//有参构造函数person p3(p2);//拷贝构造函数//2.显示法person p4;person p5=person(10);person p6=person(p5);//person(10);//匿名对象 特点:当前行执行结束时,系统会立即回收掉匿名对象//person(p5);//错误的,不能利用拷贝构造函数来初始化匿名对象,编译器会认为这是对象的声明//编译器会认为person(p5)==person p5;//3.隐式转换法person p7=10;//相当于写了person p7(10)person p8=p7;//相当于写了person p8=person(p7)
}int main()
{test();return 0;
}

拷贝构造函数调用时机

C++中拷贝构造函数调用时机通常有三种情况:

使用一个已经创建完毕的对象来初始化一个新对象;
值传递的方式给函数参数传值;
以值方式返回局部对象。

构造函数调用规则

默认情况下,c++编译器至少给一个类添加3个函数:
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则如下:
如果用户定义有参构造函数,C++不在提供默认无参构造,但是会提供默认拷贝构造;
如果用户定义拷贝构造函数,C++不会再提供其他构造函数

深拷贝和浅拷贝

深浅拷贝是面试经典问题,也是常见的一个坑
浅拷贝: 简单的赋值拷贝操作
深拷贝: 在堆区重新申请空间,进行拷贝操作

浅拷贝带来的问题就是堆区的内存重复释放

示例:

#include <iostream>
using namespace std;class person
{
public:person(){cout<<"无参构造函数调用"<<endl;}person(int a,int shengao){age=a;height=new int(shengao);cout<<"有参构造函数调用"<<endl;}person(const person &p1){cout<<"拷贝函数构造调用"<<endl;age=p1.age;height=new int(*p1.height);}int age;int* height;~person(){cout<<"析构函数调用"<<endl;}
};//调用
void test()
{person p1(10,170);cout<<"p1年龄为"<<p1.age<<endl;cout<<"p1身高为"<<*p1.height<<endl;person p2(p1);cout<<"p2年龄为"<<p2.age<<endl;cout<<"p2身高为"<<*p2.height<<endl;
}int main()
{test();return 0;
}

在这里插入图片描述

深拷贝对于指针的属性会重新拷贝一块空间最后释放掉,否则对于同一块空间也拷贝过来就只能释放一次(栈区先进后出,所以先释放掉p2,再释放p1会报错)

在这里插入图片描述

初始化列表

作用:
C++提供了初始化列表语法,用来初始化属性
语法: 构造函数( ): 属性1(值1),属性2(值2)…{ }

示例:

#include <iostream>
using namespace std;class person
{
public:
/*    person():A(10),B(20)//这种写法会写死A和B,只能是A10,B20{}
*/person(int a,int b):A(a),B(b)//这种写法更加灵活,可以改值{}int A;int B;
};//调用
void test()
{person p(55,14);cout<<p.A<<endl;cout<<p.B<<endl;
}int main()
{test();return 0;
}

类对象作为类成员

C++类中的成员可以是另一个类的对象,我们称该成员为对象成员

当其他类对象作为本类成员,构造时候先构造类对象,再构造自身,注意析构的顺序与构造相反

示例:

#include <iostream>
#include <string>
using namespace std;//手机类
class phone
{
public:phone(string pin){ping=pin;}//手机品牌string ping;
};//人类
class person
{
public:person(string ming,string pin):name(ming),myphone(pin){}//姓名string name;//手机phone myphone;};//调用
void test()
{person p("张三","诺基亚");cout<<p.name<<endl;cout<<p.myphone.ping<<endl;
}int main()
{test();return 0;
}

静态成员

静态成员变量:
所有对象共享同一份数据
在编译阶段分配内存
类内声明,类外初始化

静态成员函数:
所有对象共享同一个函数
静态成员函数只能访问静态成员变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/651278.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中设置透明度的2个属性:opacity,RGBA以及它们的区别

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

什么是停车场车牌识别系统,停车场车牌识别系统工作原理是什么

在现代城市中&#xff0c;随着机动车辆数量的急剧增加&#xff0c;停车场道闸系统的智能化管理变得尤为重要。传统的人工管理方式不仅效率低下&#xff0c;而且容易出错&#xff0c;无法满足日益增长的车辆管理需求。车牌识别技术的引入&#xff0c;为停车场道闸系统带来了革命…

python 编程小技巧:# type: 类型注释语法

# type: 是 Python 3.5 引入的一种类型注释语法&#xff0c;用于在代码中指定变量、函数、方法等对象的类型信息&#xff0c;以便 IDE 和类型检查工具等工具能够更好地理解和分析代码。具体来说&#xff0c;# type: 后面可以跟一个类型注释&#xff0c;用于指定对象的类型&…

小程序变更主体还要重新备案吗?

小程序迁移变更主体有什么作用&#xff1f;小程序迁移变更主体的作用可不止变更主体这一个哦&#xff01;还可以解决一些历史遗留问题&#xff0c;比如小程序申请时主体不准确&#xff0c;或者主体发生合并、分立或业务调整等情况。这样一来&#xff0c;账号在认证或年审时就不…

42-巩固练习(二)

42-1 函数的递归 1、问&#xff1a;关于递归的描述错误的是&#xff08;&#xff09; A.存在限制条件&#xff0c;当满足这个限制条件的时候。递归便不再维续 B.每次递归调用之后越来越接近这个限制条件 C.递归可以无限递归下去 D.递归层次太深&#xff0c;会出现栈溢出现…

看完这个视频,发誓再也不当榜一大哥了

最近在AI界有个视频很火&#xff0c;网友看完之后表示&#xff1a;十年前担心网友是抠脚大汉&#xff0c;十年后担心网友是抠脸大汉。 软件简介 该视频使用的软件为DeepFacelive,一个可以在直播过程和视频通话时进行实时换脸的本地工具。DeepFaceLive 建立在 DeepFaceLab 的基…

以太网口硬件知识分享

一、了解网口通信基本原理 实现网络通信实质上是PHY与MAC及RJ45接口实现信号传输。MAC 就是以太网控制器&#xff0c;MAC属于数据链路层&#xff0c;主要负责把数据封装成帧&#xff0c;对帧进行界定实现帧同步。对MAC地址和源MAC地址及逆行相应的处理并对错误帧进行处理。PHY…

Linux vi\vim编辑器

vi/vim编辑器 一、vi\vim 编辑器的三种工作模式1.命令模式&#xff08;Command mode&#xff09;2.输入模式&#xff08;Insert mode&#xff09;3.底线命令模式&#xff08;Last line mode&#xff09; 二、参考 vi\vim 是 visual interface 的简称&#xff0c;是 Linux 中最经…

免费预约即将截止,5月7日上海TCT亚洲3D打印展参观指南,收藏!

进入TCT亚洲展官网&#xff08;网页搜索TCT亚洲展&#xff09;&#xff0c;免费登记预约 2024年TCT亚洲展作为推动增材制造在亚洲市场的业务交流的重要平台&#xff0c;将于2024年5月7日至9日在国家会展中心&#xff08;上海&#xff09;7.1&8.1馆举办&#xff0c;与海内外…

2023 年全国网络安全行业职业技能大赛电子数据取证分析师总决赛wp

第一部分&#xff1a;电子数据提取与固定 任务 1:检材 1.rar 上的任务 检材是一个手机备份&#xff0c;请通过技术手段提取以下信息。 1.提取名称为“陈伦国”的联系人的手机号码&#xff0c;以此作为flag 提交。(答案格式如&#xff1a;13012345678) (2 分) 13800620796 …

python-excel自动化-openpyxl

openpyxl学习笔记 创建或打开表格存储和遍历数据设置单元格风格过滤器和排序更改工作表的背景颜色合并单元格冻结窗口数字格式公式图像图表条形图折线图散点图 创建或打开表格 # 创建 import datetime from openpyxl import Workbook # 实例化 wb Workbook() # 激活 work…

【元启发式算法】学生心理学优化算法 SPBO算法【Matlab代码#88】

文章目录 【获取资源请见文章第4节&#xff1a;资源获取】1. 学生心理学优化算法&#xff08;SPBO&#xff09;1.1 最好的学生1.2 次好的学生1.3 一般的学生1.4 随机提高成绩的学生 2. 部分代码展示3. 仿真结果展示4. 资源获取说明 【获取资源请见文章第4节&#xff1a;资源获取…