【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.…...
日志告警准确率从61%跃升至94.2%,MCP 2026增强版上线首周就该做的6项关键校准,晚配=漏控重大风险
更多请点击: https://intelliparadigm.com 第一章:MCP 2026日志分析增强版的核心架构演进 MCP 2026日志分析增强版摒弃了传统单体式日志管道设计,转向基于事件驱动与策略即代码(Policy-as-Code)的分层协同架构。该演…...
E-Hentai漫画下载器终极指南:如何免费批量下载完整漫画合集
E-Hentai漫画下载器终极指南:如何免费批量下载完整漫画合集 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 如果你是一位E-Hentai漫画爱好者,想…...
终极教程:用CoreELEC系统让老旧电视盒子变身专业4K播放器
终极教程:用CoreELEC系统让老旧电视盒子变身专业4K播放器 【免费下载链接】e900v22c-CoreELEC Build CoreELEC for Skyworth e900v22c 项目地址: https://gitcode.com/gh_mirrors/e9/e900v22c-CoreELEC 想让家中闲置的电视盒子焕发新生吗?e900v22…...
YoMo边缘流处理框架:基于QUIC协议实现毫秒级实时数据处理
1. 项目概述:当实时数据处理遇上边缘计算 如果你正在构建一个需要处理海量实时数据流的应用,比如物联网设备监控、实时金融交易分析或者在线游戏的状态同步,你肯定对“低延迟”这三个字有着近乎偏执的追求。传统的中心化数据处理架构…...
告别手机卡顿:Universal Android Debloater 让你的旧手机重获新生
告别手机卡顿:Universal Android Debloater 让你的旧手机重获新生 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of …...
2025黑苹果终极指南:从零开始构建稳定macOS系统的完整解决方案
2025黑苹果终极指南:从零开始构建稳定macOS系统的完整解决方案 【免费下载链接】Hackintosh Hackintosh long-term maintenance model EFI and installation tutorial 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintosh 对于想要在普通PC上体验macOS的…...
手机号码背后的地理密码:三分钟解锁位置信息的开源方案
手机号码背后的地理密码:三分钟解锁位置信息的开源方案 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mir…...
别再只会测距了!用Arduino+HC-SR04超声波模块做个智能防撞小车(附完整代码)
从测距到避障:用Arduino和HC-SR04打造智能防撞小车的完整指南 超声波测距模块在创客项目中一直扮演着重要角色,但大多数教程止步于基础的距离测量。今天,我们要将这个看似简单的传感器玩出新高度——打造一台能够自主避障的智能小车。这不仅是…...
MCP 2026多模态处理案例深度复盘(仅限首批认证架构师内部解密)
更多请点击: https://intelliparadigm.com 第一章:MCP 2026多模态处理案例深度复盘(仅限首批认证架构师内部解密) 在2024年Q3落地的MCP 2026基准验证中,某金融风控联合体首次将视觉、时序传感器与自然语言三模态数据统…...
工业5G网络安全实践:WireGuard轻量级方案解析
1. 工业5G网络中的轻量级安全实践:WireGuard深度解析在工业5G网络部署中,安全始终是核心挑战。传统IPsec方案虽然成熟,但其复杂的配置流程和较高的资源消耗让许多工程师头疼。最近我们在Adtran Terafactory的实际部署中,验证了Wir…...
