C++中对象的初始化和清理

news2024/12/26 19:44:52

一、.初始化:

对象的初始化使用构造函数

构造函数

构造函数:主要作用在于创造对时为对象的成员属性(成员变量)赋值,构造函数由编译器自动调用,无需手动调用

语法:类名(){}

1.构造函数没有返回值,函数名前也不用写void

2.函数名与类名相同

3.构造函数可以有参数,因此可以发生重载

4.程序在调用对象的时候会自动调用构造函数,无需手动调用,而且只会调用一次

5.当已经提供了有参构造时,程序不会提供无参构造(若此时调用无参构造,程序报错,须程序员手动提供无参构造)

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
class A {
	int* p;
public:
	A()//构造函数,函数名与类名相同,没有返回值,函数名前不用写void,
		//如果没有实现构造函数编译器会提供默认的构造函数
	{
		cout << "默认构造" << endl;
	}
	A(int n) {
		if (n != 0) {
			p = new int[n];
			cout << "使用构造函数在堆区申请了n个int类型的变量" << endl;
 }
	}
};
int main() {
	A p;//输出:默认构造。在创建对象时编译器会帮我们自动调用构造函数,无需手动调用
	A p1(2);//输出:使用构造函数在堆区申请了n个int类型的变量。调用有参构造创造对象
	A p2();//输出:  编译器会把它认为是函数声明,A是返回值类型,p2是函数名,()是函数参数
	return 0;
}

构造函数的分类及调用:

分类:

1.按照参数分:有参构造和无参构造

2.按照类型分:普通构造和拷贝构造

调用方式:

1.括号发

2.显示法

3.隐式转换法

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
class A {
	int* p;
public:
	A()
	{
		cout << "默认构造" << endl;
	}
	A(int n) {
 cout << "调用有参构造" << endl;
	if (n > 0)p = new int(n);//p指向一块int类型的内存,值为n
	else{
	p = NULL;
	cout << "数据不准确" << endl;
 }
	}
	void a(){
	 if (p) {
		cout << "打印p指向堆区内存值:" << *p << endl;
	 }
}
};
int main() {
	A t(1);//输出:调用有参构造。括号法相当于A t=A(1);
	A t1 = A(3);//输出:调用有参构造。显示法
	A t2 = 3;//输出:调用有参构造。隐式转换法,在此处会调用参数为int类型的构造函数,将3转换为A类型对象
	A t3();//不是括号发,编译器会把它认为是函数声明,A是返回值类型.t3是函数名,()是函数参数
	A t4;//输出:默认构造。调用无参构造
	return 0;
}

构造函数的调用规则

在默认情况下,C++至少会给一个类添加3个函数:

1.默认构造函数(无参,函数体为空)

2.默认析构函数(无参,函数体为空)

3.默认拷贝构造函数,对属性进行值拷贝。(简单的赋值)

构造函数调用规则:

1.如果用户定义有参构造,C++不再提供默认的无参构造,但会提供默认的拷贝构造

2.如果用户定义了拷贝构造,C++不再提供其他的任何构造函数(无参、有参、默认拷贝构造)

#include<iostream>
#include<vector>
using namespace std;
class Person {
	
public:
	int n;
	Person() {
		cout << "无参构造" << endl;
	}
	Person(int n) {
		this->n = n;
		cout << " 有参构造" << endl;
	}
	Person(const Person& other) {
		this->n = other.n;
		cout << " 拷贝构造" << endl;
	}
	~Person() {
		cout << "析构函数" << endl;
	}
};
void test1() {
	Person p1(18);
	
	Person p2(p1);//如果不写拷贝构造,编译器会自动添加默认的拷贝构造(浅拷贝)
	//此处的拷贝构造,相当于使用一个已经创建完毕的对象(已经存在的对象)初始化一个新对象
	cout << "p2为:" << p2.n << endl;
}
void test2() {
	//如果用户提供有参构造,编译器不会提供默认的无参构造,但会提供默认的拷贝构造
	Person p1;//此时如果用户没有提供默认构造,编译器会报错
	Person p2(10);//调用用户提供的有参构造
	Person p3(p2);//调用拷贝构造,如果此时用户没有提供拷贝构造,编译器会提供默认的拷贝构造
	
	//如果用户提供了拷贝构造,编译器不会提供其他任何的拷贝构造
	Person p4;//此时如果用户没有提供默认构造,编译器会报错
	Person p5(10);//调用用户提供的有参构造,此时如果用户没有提供有参构造,编译器会报错
	Person p6(p5);//调用拷贝构造
}
int main() {
	test1();
	return 0;
}

二、对象的清理

对象需要调用析构函数来清理

析构函数

主要作用在于对象销毁前系统自动调用,执行一些清理工作

语法:~( )类名{ }

1.析构函数没有返回值,也不用写void

2.函数名跟类名相同,在名称前加符号:~

3.析构函数不可以有参数,因此不能发生重载

4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次

#include<iostream>
using namespace std;
class Pointer {
	int* p=NULL;
public:
	Pointer() {
		cout << "默认构造" << endl;
	}
	Pointer(int n) {
		cout << "调用有参构造" << endl;
		if (n > 0) {
			p = new int[n];//使用构造函数在堆区申请了n个int类型的变量
		}
	}
	//析构函数用于帮助我们释放指针变量指向的堆区内存
	~Pointer() {
		if (p)delete[]p;
	}
};
void test() {
	Pointer p(2);
}
int main() {
	test();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五层网络协议(封装和分用)

目录 七层网络协议五层网络协议封装1.应用层2.传输层3.网络层4.数据链路层5.物理层 分用1. 物理层2.数据链路层3.网络层 IP 协议4.传输层 UDP 协议5.应用层 七层网络协议 网络通信过程中&#xff0c;需要涉及到的细节&#xff0c;其实是非常非常多的&#xff0c;如果要有一个协…

在鲲鹏麒麟服务器上部署MySQL主从集群

因项目需求需要部署主从MySQL集群&#xff0c;继续采用上次的部署的MySQL镜像arm64v8/mysql:latest&#xff0c;版本信息为v8.1.0。计划部署服务器192.168.31.100和192.168.31.101 部署MySQL主节点 在192.168.31.100上先创建好/data/docker/mysql/data和/data/docker/mysql/l…

一款支持80+语言,包括:拉丁文、中文、阿拉伯文、梵文等开源OCR库

大家好&#xff0c;今天给大家分享一个基于PyTorch的OCR库EasyOCR&#xff0c;它允许开发者通过简单的API调用来读取图片中的文本&#xff0c;无需复杂的模型训练过程。 项目介绍 EasyOCR 是一个基于Python的开源项目&#xff0c;它提供了一个简单易用的光学字符识别&#xff…

C++学习日记---第16天

笔记复习 1.C对象模型 在C中&#xff0c;类内的成员变量和成员函数分开存储 我们知道&#xff0c;C中的成员变量和成员函数均可分为两种&#xff0c;一种是普通的&#xff0c;一种是静态的&#xff0c;对于静态成员变量和静态成员函数&#xff0c;我们知道他们不属于类的对象…

如何搭建JMeter分布式集群环境来进行性能测试

在性能测试中&#xff0c;当面对海量用户请求的压力测试时&#xff0c;单机模式的JMeter往往力不从心。如何通过分布式集群环境&#xff0c;充分发挥JMeter的性能测试能力&#xff1f;这正是许多测试工程师在面临高并发、海量数据时最关注的问题。那么&#xff0c;如何轻松搭建…

人工智能-卷积神经网络(学习向)

一.概述&#xff1b; 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理具有类似网格结构的数据&#xff08;如图像&#xff09;的深度学习模型。 主要用于处理机器视觉任务。 主要功能&#xff1b; 1.图像分类 2.目标检测 3.图像分割…

一些基于宏基因组的巨型病毒研究

Introduction 上次已经介绍了巨型病毒的一些基本内容&#xff0c;也讲到了不依赖培养的方法是从环境样本中发现巨型病毒基因组成的不可或缺的工具。可以通过基因组解析宏基因组学来从环境序列数据中获取 NCLDV 基因组并进行深入研究如功能基因&#xff0c;宿主&#xff0c;进化…

【Django-xadmin】

时间长不用,会忘的系列 1、Django-xadmin后台字段显示处理 主要是修改每个模块下adminx.py文件 代码解释&#xff1a;第1行控制表单字段显示第2行控制列表字段显示第3行控制搜索条件第4行控制过滤条件第5行支持单个或多个字段信息修改第6行列表分页&#xff0c;每页显示多少行…

深入浅出体验AI生图产品Dall-E

DALL-E是由OpenAI开发的一种革命性的AI图像生成工具&#xff0c;能够根据文本描述生成图像。它的名字灵感来源于著名画家萨尔瓦多达利&#xff08;Salvador Dal&#xff09;和皮克斯动画电影中的角色瓦力&#xff08;WALL-E&#xff09;&#xff0c;这暗示了其在艺术创造力与技…

域名解析系统 DNS

1.域名系统概述 用户与互联网上某台主机通信时&#xff0c;必须要知道对方的IP地址。然而用户很难记住长达32 位的二进制主机地址。即使是点分十进制地址也并不太容易记忆。但在应用层为了便于用户记忆各种网络应用&#xff0c;连接在互联网上的主机不仅有P地址&#xff0c;而…

学习ASP.NET Core的身份认证(基于Session的身份认证3)

开源博客项目Blog中提供了另一种访问控制方式&#xff0c;其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式&#xff0c;测试程序中直接复用开源博客项目Blog中的相关类及接口定义&#xff0c;并在其上调整判断逻辑。   首先是接口A…

十六(AJAX3)、XMLHttpRequest、Promise、简易axios封装、案例天气预报、lodash-debounce防抖

1. XMLHttpRequest 1.1 XMLHttpRequest-基本使用 /* 定义&#xff1a;XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL&#xff0c;获取数据。这允许网页在不影响用户操作的情况下&#xff0c;更…

【QT】音乐播放器demo

1、使用设计师模式绘制ui界面 添加QPushButton并设置大小&#xff0c;ctrl鼠标拖动复制相同的组件。 添加icon //ps:icon下载网站 设置按钮无边框并设置鼠标悬停颜色&#xff1a; 修改QWidget样式表&#xff0c;添加&#xff1a; *{ border:none; } QPushBu…

「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器

本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择&#xff0c;或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。 关键词 UI互动应用颜色选择器状态管理用户输入界面动态更新 一、功能说明 颜色…

T620存储安全方案SoC芯片技术手册

系统资源 集成32位国产CPU CK803S&#xff1b;最高工作频率260Mhz CK803S内置16KB I/D Cache&#xff0c;内置32KB DTCM 32KB ROM&#xff1b;256KB SRAM&#xff1b;8KB SRAM&#xff08;系统专用&#xff09; 512KB/1MB 片内Flash 安全算法 支持SM4数据加密&#xff0c;加密性…

计算机光电成像理论基础

一、透过散射介质成像 1.1 光在散射介质中传输 光子携带物体信息并进行成像的过程是一个涉及光与物质相互作用的物理现象。这个过程可以分为几个步骤来理解&#xff1a; 1. **光的发射或反射**&#xff1a; - 自然界中的物体可以发射光&#xff08;如太阳&#xff09;&am…

C语言——自我介绍_Gitee的基本使用

自我介绍 一名信息安全技术应用专业的大学生&#xff0c;来到CSDN博客论坛已有两年。写博客的目的&#xff1a;第一点是为了学习到更多的知识&#xff0c;以便以后所需&#xff1b;第二点是为了读者&#xff0c;俺是一个初学者&#xff0c;希望可以和读者朋友共同进步&#xf…

Redis高阶集群搭建+集群读写

问题 容量不够&#xff0c;redis 如何进行扩容&#xff1f;并发写操作&#xff0c; redis 如何分摊&#xff1f;另外&#xff0c;主从模式&#xff0c;薪火相传模式&#xff0c;主机宕机&#xff0c;导致 ip 地址发生变化&#xff0c;应用程序中配置需要修改对应的主机地址、端…

windows下kafka初体验简易demo

这里提供了windows下的java1.8和kafka3.9.0版本汇总&#xff0c;可直接免费下载 【免费】java1.8kafka2.13版本汇总资源-CSDN文库 解压后可以得到一个文件夹 资料汇总内有一个kafka文件资料包.tgz&#xff0c;解压后可得到下述文件夹kafka_2.13-3.9.0&#xff0c;资料汇总内还…

深入理解 TCP 标志位(TCP Flags)

深入理解 TCP 标志位&#xff08;TCP Flags&#xff09; 1. 简介 在网络安全和网络分析领域&#xff0c;TCP标志位&#xff08;TCP Flags&#xff09;是理解网络行为和流量模式的关键概念。特别是在使用工具如Nmap进行端口扫描时&#xff0c;理解这些标志位的意义和用法至关重…