【C++面向对象】2.构造函数、析构函数
文章目录
- 【 1. 构造函数 】
- 1.1 带参构造函数--传入数据
- 1.2 无参构造函数--不传入数据
- 1.3 实例
- 1.4 拷贝构造函数
- 【 2. 析构函数 】
【 1. 构造函数 】
- 类的构造函数是类的一种特殊的成员函数,它会 在每次创建类的新对象时执行。
- 构造函数的名称与类的名称是完全相同的,并且 不会返回任何类型,也不会返回 void。构造函数可 用于为某些成员变量设置初始值。
1.1 带参构造函数–传入数据
- 法1
class Complex
{private: double x;double y;public:Complex(); //无参构造函数Complex(double, double); //带参构造函数void Complex_Printf(void); //输出函数
};//带参构造函数--形式1
Complex::Complex(double a, double b)
{x = a;y = b;
}
- 法2
class Complex
{private: double x;double y;public:Complex(); //无参构造函数Complex(double, double); //带参构造函数void Complex_Printf(void); //输出函数
};
//带参构造函数--形式2
Complex::Complex(double a,double b) :x(a), y(b) { };
1.2 无参构造函数–不传入数据
- 法1
class Complex
{private: double x;double y;public:Complex(); //无参构造函数Complex(double, double); //带参构造函数void Complex_Printf(void); //输出函数
};
//无参构造函数:默认值x=2,y=1
Complex::Complex()
{x=2;y=1;
};
- 法2
class Complex
{private: double x;double y;public:Complex(); //无参构造函数Complex(double, double); //带参构造函数void Complex_Printf(void); //输出函数
};
//无参构造函数:默认值x=2,y=1
Complex::Complex() :x(2), y(1) { };
1.3 实例
// 【Complex.h】
#pragma onceclass Complex
{private: double x;double y;public:Complex(); //无参构造函数Complex(double, double); //带参构造函数void Complex_Printf(void); //输出函数
};
// 【 Complex.cpp 】
#include "Complex.h"
#include <iostream>
using namespace std;//无参构造函数:默认值x=2,y=1
Complex::Complex() :x(2), y(1) {};//带参构造函数:赋初值
Complex::Complex(double a, double b)
{x = a;y = b;
}//输出函数,根据实部x和虚部y,输出对应的复数
void Complex:: Complex_Printf(void)
{if (!x && !y) cout << '0' << endl; //{0} {0} :0else if (x && !y) cout << x << endl; //{≠0}{0} :xelse if (!x && y == -1) cout << '-i' << endl; //{0} {-1} :-ielse if (!x && y == 1) cout << 'i' << endl; //{0} {1} :ielse if (!x) cout<<y<<'i'<<endl; //{0} {else}:yielse if (x && y == 1) cout << x << "+i" << endl; //{≠0}{1} :x+ielse if (x && y == -1) cout << x << "-i" << endl; //{≠0}{-1} :x-ielse if (y > 0) cout << x << '+' << y << 'i'<<endl;//{≠0}{>0} :x+yi ,y>0else cout << x <<y << 'i' << endl; //{≠0}{<0} :x-yi ,y<0
}
// 【 Main.cpp 】
#include <iostream>
#include "Complex.h"
using namespace std;int main(void)
{Complex a;Complex b(0, 0);Complex c(0.2, 3.7);Complex d(0, 1);Complex e(2, 0);Complex f(3, -5);a.Complex_Printf();b.Complex_Printf();c.Complex_Printf();d.Complex_Printf();e.Complex_Printf();f.Complex_Printf();return 0;
}

1.4 拷贝构造函数
- 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是 使用同一类中之前创建的对象来初始化新创建的对象。
- 如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
- 拷贝构造函数通常用于:
- 通过 使用另一个同类型的对象来初始化新创建的对象。
- 复制对象把它作为参数传递给函数。
- 复制对象,并从函数返回这个对象。
- 拷贝构造函数的常见形式:
classname (const classname &obj)
{// 构造函数的主体
}
- 实例1:
- Line line(10); // 创建一个Line类的对象line,会调用构造函数,输出 “调用构造函数”
- display(line); // 使用 line 作为参数传入display函数中时,系统首先会调用拷贝构造函数为 line 进行复制创建得到一个临时副本,输出 “调用拷贝构造函数并为指针 ptr 分配内存”
系统使用该副本在 display 函数中 进行操作,输出 “line 大小 :10”,display 函数结束后该副本作为局部变量被回收,输出 “释放内存”- 对象 Line 在主程序结束前 也将被回收,输出 “释放内存”
#include <iostream>using namespace std;class Line
{public:int getLength( void );Line( int len ); // 简单的构造函数Line( const Line &obj); // 拷贝构造函数~Line(); // 析构函数private:int *ptr;
};// 构造函数
Line::Line(int len)
{cout << "调用构造函数" << endl;// 为指针分配内存ptr = new int;*ptr = len;
}// 拷贝构造函数
Line::Line(const Line &obj)
{cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;ptr = new int;*ptr = *obj.ptr; // 拷贝值
}// 析构函数
Line::~Line(void)
{cout << "释放内存" << endl;delete ptr;
}// 成员函数
int Line::getLength( void )
{return *ptr;
}// 外部函数
void display(Line obj); // 程序的主函数
int main( )
{Line line(10);display(line);return 0;
}// 一个外部函数
void display(Line obj)
{cout << "line 大小 : " << obj.getLength() <<endl;
}

- 实例2:
- Line line1(10); // 创建一个Line类的对象line1,会调用构造函数,输出 “调用构造函数”
- Line line2 = line1; // 创建一个Line类的对象line2 且 lin2 是由 lin1 复制得到,即调用了拷贝构造函数,输出 “调用拷贝构造函数并为指针 ptr 分配内存”
- display(line1); // 使用 line1 作为参数传入display函数中时,系统首先会调用拷贝构造函数为 line1 进行复制创建得到一个临时副本,输出 “调用拷贝构造函数并为指针 ptr 分配内存”
系统使用该副本在 display 函数中 进行操作,输出 “line 大小 :10”
display 函数结束后该副本作为局部变量被回收,输出 “释放内存”- 同样地, display(line2); // 使用 line2 作为参数传入display函数中时,系统首先会调用拷贝构造函数为 line2 进行复制创建得到一个临时副本,输出 “调用拷贝构造函数并为指针 ptr 分配内存”
系统使用该副本在 display 函数中 进行操作,输出 “line 大小 :10”
display 函数结束后该副本作为局部变量被回收,输出 “释放内存”- 对象 Line1 和Line2 在主程序结束前 也将被回收,分别输出 “释放内存”
#include <iostream>using namespace std;class Line
{public:int getLength( void );Line( int len ); // 简单的构造函数Line( const Line &obj); // 拷贝构造函数~Line(); // 析构函数private:int *ptr;
};// 构造函数
Line::Line(int len)
{cout << "调用构造函数" << endl;// 为指针分配内存ptr = new int;*ptr = len;
}// 拷贝构造函数
Line::Line(const Line &obj)
{cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;ptr = new int;*ptr = *obj.ptr; // 拷贝值
}// 析构函数
Line::~Line(void)
{cout << "释放内存" << endl;delete ptr;
}// 成员函数
int Line::getLength( void )
{return *ptr;
}void display(Line obj); // 程序的主函数
int main( )
{Line line1(10);Line line2 = line1; // 这里也调用了拷贝构造函数display(line1);display(line2);return 0;
}// 外部函数
void display(Line obj)
{cout << "line 大小 : " << obj.getLength() <<endl;
}

【 2. 析构函数 】
-
类的析构函数是类的一种特殊的成员函数, 类的析构函数会在每次删除所创建的对象时执行。
-
析构函数的 名称与类的名称是完全相同的,只是在前面加了个 波浪号(~) 作为前缀,它 不会返回任何值,也 不能带有任何参数。
-
析构函数 有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
-
如果程序里没有构造函数和析构函数,编译器在编译的时候会自动生成构造函数和析构函数,只是函数内没有任何操作。
-
实例
#include <iostream>using namespace std;class Line
{public:void setLength( double len );double getLength( void );Line(); // 这是构造函数声明~Line(); // 这是析构函数声明private:double length;
};// 成员函数定义,包括构造函数
Line::Line(void)
{cout << "Object is being created" << endl;
}
Line::~Line(void)
{cout << "Object is being deleted" << endl;
}void Line::setLength( double len )
{length = len;
}double Line::getLength( void )
{return length;
}
// 程序的主函数
int main( )
{Line line;// 设置长度line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl;return 0;
}

相关文章:
【C++面向对象】2.构造函数、析构函数
文章目录 【 1. 构造函数 】1.1 带参构造函数--传入数据1.2 无参构造函数--不传入数据1.3 实例1.4 拷贝构造函数 【 2. 析构函数 】 【 1. 构造函数 】 类的构造函数是类的一种特殊的成员函数,它会 在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同…...
uniapp:使用subNVue原生子窗体在map上层添加自定义组件
我们想要在地图上层添加自定义组件,比如一个数据提示框,点一下会展开,再点一下收起,在h5段显示正常,但是到app端真机测试发现组件显示不出来,这是因为map是内置原生组件,层级最高,自…...
Flutter开发GridView控件详解
GridView跟ListView很类似,Listview主要以列表形式显示数据,GridView则是以网格形式显示数据,掌握ListView使用方法后,会很轻松的掌握GridView的使用方法。 在某种界面设计中,如果需要很多个类似的控件整齐的排列&…...
Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?
一、Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 通过defineProperty 两个属性,get及set get 属性的 getter 函…...
pytest利用request fixture实现个性化测试需求详解
这篇文章主要为大家详细介绍了pytest如何利用request fixture实现个性化测试需求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下− 前言 在深入理解 pytest-repeat 插件的工作原理这篇文章中,我们看到pytest_repeat源码中有这样一段 import pyt…...
算法练习16——O(1) 时间插入、删除和获取随机元素
LeetCode 380 O(1) 时间插入、删除和获取随机元素 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象 bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。 …...
实时数据更新与Apollo:探索GraphQL订阅
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
VMware Workstation里面安装ubuntu20.04的流程
文章目录 前言一、获取 desktop ubuntu20.04 安装镜像二、VMware Workstation下安装ubuntu20.041. VMware Workstation 创建一个新的虚拟机2. ubuntu20.04的安装过程3. 登录ubuntu20.044. 移除 ubuntu20.04 安装镜像总结参考资料前言 本文主要介绍如何在PC上的虚拟机(VMware W…...
pnpm的环境安装以及安装成功后无法使用的问题
文章目录 前言1、使用npm 安装2、安装后的注意点3、遇到问题4、配置path的环境变量(1)找到环境变量(2)找到并双击path的系统变量(3)复制第1步中使用npm安装的红框部分的路径(4)将第&…...
华为eNSP配置专题-浮动路由及BFD的配置
文章目录 华为eNSP配置专题-浮动路由及BFD的配置0、参考文档1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、基本终端配置 3、浮动路由配置3.1、浮动路由的基本配置3.2、浮动路由的负载均衡问题3.3、浮动路由的优先级调整 4、BFD的配置4.1…...
光储并网直流微电网simulink仿真模型,光伏采用mppt实现最大功率输出研究
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
面试题-React(十六):理解Redux及其工作原理
在现代前端开发中,状态管理是一个关键的问题。Redux是一个广泛使用的状态管理库,可以帮助开发者更有效地管理应用的状态。 一、什么是Redux? Redux是一个JavaScript状态管理库,用于管理应用中的状态(state࿰…...
Crypto(4)NewStarCTF 2023 week2 Crypto Rotate Xor
题目代码: # 导入所需的库和从secret模块加载"flag" from secret import flag from os import urandom from pwn import xor from Cryptodome.Util.number import *# 生成两个随机的 64 位素数,分别存储在变量 k1 和 k2 中 k1 getPrime(64) k2 getPrim…...
小程序-uni-app:将页面(html+css)生成图片/海报/名片,进行下载 保存到手机
一、需要描述 本文实现,uniapp微信小程序,把页面内容保存为图片,并且下载到手机上。 说实话网上找了很多资料,但是效果不理想,直到看了一个开源项目,我知道可以实现了。 本文以开源项目uniapp-wxml-to-can…...
Vue非单文件组件
组件就是用来实现局部特定功能效果的代码集合,为的就是复用编码,简化项目编码,提高运行效率。 组件分为非单文件组件和单文件组件,这里介绍的是非单文件组件。 一、创建组件 创建组件的语法格式如下: const 组件名 …...
批量xls转换为xlsx
import win32com.client as win32 import os# 另存为xlsx的文件路径 xlsx_file r"F:\志丹\1020Excel汇总\成果表备份\xlsx" xls_file r"F:\志丹\1020Excel汇总\成果表备份" for file in os.scandir(xls_file):suffix file.name.split(".")[-1…...
行情分析——加密货币市场大盘走势(10.20)
大饼昨日迅猛上涨,并在今日依然上涨,目前处在蓝色上涨趋势线,上涨趋势依然在。中长线可以考虑过几天止损或者继续持有。目前MACD日线呈现绿色实心5天,预计明后天可能会绿色空心,注意后续空头的到来,注意多单…...
https证书配置(nginx)
HTTPS 是什么 HTTPS 是一种应用层协议,是一种透过计算机网络进行安全通信的传输协议,HTTPS 经由 HTTP 进行通信,但是在 HTTP 的基础上引入了一个加密层,使用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是…...
Go方法特性详解:简单性和高效性的充分体现
一、简介 在软件开发的世界里,理解并掌握编程语言的各种特性是至关重要的。Go(又称Golang)作为一种现代的编程语言,以其简洁的语法和出色的性能吸引了大量的开发者。然而,Go的方法(Methods)这一…...
Cesium Vue(四)— 物体(Entity)的添加与配置
1. 添加标签和广告牌 // 添加文字标签和广告牌var label viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(113.3191, 23.109, 750),label: {text: "广州塔",font: "24px sans-serif",fillColor: Cesium.Color.WHITE,outlineColor: Cesium.…...
嵌入式开发方法
嵌入式开发方法:构建智能世界的技术基石 在当今智能化浪潮中,嵌入式系统作为连接物理世界与数字世界的桥梁,已广泛应用于智能家居、工业控制、医疗设备等领域。嵌入式开发方法的核心在于通过软硬件协同设计,实现资源受限环境下的…...
告别版本混乱:在Ubuntu上用Tar包管理多版本TensorRT(附CUDA 11.0+cuDNN 8.0.5环境)
告别版本混乱:在Ubuntu上用Tar包管理多版本TensorRT(附CUDA 11.0cuDNN 8.0.5环境) 深度学习工程师经常面临一个棘手问题:如何在单台开发机上同时维护多个TensorRT版本?当项目A需要TensorRT 7.x而项目B依赖TensorRT 8.x…...
为什么通达信用户需要ChanlunX缠论插件?从手动分析到智能可视化的转变
为什么通达信用户需要ChanlunX缠论插件?从手动分析到智能可视化的转变 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 在技术分析的世界里,缠论以其严谨的逻辑结构和精确的走势分解…...
终极Bebas Neue字体指南:免费开源标题字体完整解决方案
终极Bebas Neue字体指南:免费开源标题字体完整解决方案 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 还在为设计项目寻找专业、免费且视觉冲击力强的标题字体吗?Bebas Neue字体正是你需…...
如何在macOS上让Xbox手柄重获新生:360Controller驱动深度解析
如何在macOS上让Xbox手柄重获新生:360Controller驱动深度解析 【免费下载链接】360Controller TattieBogle Xbox 360 Driver (with improvements) 项目地址: https://gitcode.com/gh_mirrors/36/360Controller 还在为Xbox手柄在macOS上"水土不服"而…...
D2DX宽屏补丁:5分钟让暗黑破坏神2在现代PC上流畅运行的终极指南
D2DX宽屏补丁:5分钟让暗黑破坏神2在现代PC上流畅运行的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx …...
保姆级教程:在QEMU Vexpress-A9上从零搭建Linux 6.0驱动开发环境并验证platform_driver
从零构建QEMU Vexpress-A9上的Linux 6.0驱动开发实战指南 在嵌入式Linux开发领域,理解驱动模型的核心机制是每个工程师的必修课。而platform_driver作为Linux设备驱动框架中的重要组成部分,其设计理念体现了现代内核开发的抽象与分层思想。本文将带您从…...
RWKV7-1.5B-World的Java后端集成指南:SpringBoot API服务开发
RWKV7-1.5B-World的Java后端集成指南:SpringBoot API服务开发 1. 前言:为什么选择RWKV7-1.5B-World RWKV7-1.5B-World作为新一代开源大语言模型,以其高效的推理性能和适中的模型尺寸,成为企业级应用的热门选择。对于Java开发者而…...
蓝桥杯单片机省赛拿分秘籍:手把手教你搞定第十一届的电压阈值计数与无效按键检测
蓝桥杯单片机省赛实战精要:电压阈值计数与无效按键检测的工程化实现 在蓝桥杯单片机设计与开发组的竞赛中,电压阈值计数和无效按键检测是检验选手嵌入式系统设计能力的重要考点。这两个看似独立的功能模块,实际上共同构成了一个完整的嵌入式系…...
LinkSwift:八大网盘直链下载助手终极指南 - 免费获取高速下载链接的完整教程
LinkSwift:八大网盘直链下载助手终极指南 - 免费获取高速下载链接的完整教程 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 …...
