news 2026/8/16 22:35:45

C++ 类与对象(二)(1.构造析构函数)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 类与对象(二)(1.构造析构函数)

目录

类的默认成员函数

构造析构函数

1.构造函数

2.拷贝构造函数

3.析构函数


类的默认成员函数

在书写构造类的时候,除了我们所写的成员函数之外,如果没有编写对应的默认函数,编译器会默认生成对应的6个默认函数,比较重要的前4个函数。

补充:在C++11以后多了2个默认函数,移动构造和移值构造

为什么要写默认成员函数?

原因:编译器的提供的默认成员函数,对于我们程序员来说可能不是想要的,不同情况编译器提供的默认成员函数不适配,需要进行修改。

构造析构函数

1.构造函数

在原先用C语言写Stack等数据结构中每次都需要Init函数,来进行初始化,在每次都有可能我们忘记进行初始化,导致系统报错的可能,所以在C++中构造函数就为了解决这个问题的,在每次实例化对象的时候都会进行调用构造函数进行初始化。

构造函数的特点及要求:

  1. 函数名与类名同名。
  2. 无返回值。(在C++ 中构造函数可以不用写void)
  3. 对象实例化后自动调用构造函数。
  4. 构造函数可以重载,遵循重载规则。
  5. 用户没有构造函数,编译器自动生成,如果有就不会生成,就用用户自己的构造函数。
  6. 无参构造或者、全缺省构造函、编译自动生成的构造函数,都叫构造函数。三个函数只能存在一个,不能同时出现。前两存在的时候会导致无参和缺省构造导致分歧。

日期类的构造函数(全缺省写法):

//Date.h #pragma once #include <iostream> #include <stdlib.h> #include <stdbool.h> #include <assert.h> using namespace std; class Date { public: Date(int year = 1, int month = 1, int day = 1); void Print(); private: int _year; int _month; int _day; };
//Date.cpp #define _CRT_SECURE_NO_WARNINGS #include "Data.h" Date::Date(int year, int month, int day) { _year = year; _month = month; _day = day; } void Date::Print() { cout << _year << "/" << _month << "/" << _day << endl; } int main() { Date adt(2026, 8, 8); adt.Print(); return 0; }

无参和带参写法:

Date() { _year = 1; _month = 1; _day = 1; } Date(int year, int month, int day) { _year = year; _month = month; _day = day; }

很明显的看到全缺省的优势就体现出来了,而却这种带参写法还是有问题,如果只写年份,不写其他的内容一样会导致报错。

2.拷贝构造函数

定义:如果已经有一个相同类的实例化对象,可以通过拷贝该对象实例化一个所以成员变量一致的对象,这就是拷贝构造函数,也就是是一个特殊的狗制造函数。

拷贝构造函数要求及其特点:

  • 拷贝构造函数是构造函数的重载。
  • 拷贝构造函数必须第一个类型是类类型的对象的引用,如果使用的是类类型,会导无限递归报错,拷贝构造函数也可以多个参数,但第一个一定是类类型的引用,后面必须有缺省参数。
  • C++规定了自定义类型对象进行时必须用拷贝构造,所以这里的自定义类型传参值和返回值都会调用拷贝构造完成。
  • 若没有拷贝构造函数编译器也会自动生成对于的拷贝构造函数。与我们所写的拷贝构造不同编译器默认拷贝构造是通过一个字节一个字节经行的拷贝。
  • 学习拷贝构造的原因:
  • 像Date 类这种内存偏简单的类,编译器默认的拷贝构造就够用,但是 Stack 栈这种需要申请空间等复杂的内容,编译器生成的默认拷贝构造就不能满足我们的需求,所以需要自定义拷贝构造,自己需要自己搞。
  • 为什么要拷贝构一定第一个是类类型的应用:
  • 传值会产生临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(应用),没有产生拷贝。
Data::Data(const Data& data) { _year = data._year; _month = data._month; _day = data._day; } Date::Date(const Date* d) { _year = d->_year; _month = d->_month; _day = d->_day; }

3.析构函数

析构函数就是在实例化对象在生命周期末的时候会调用,通常析构函数会使用在空间销毁上,像Stack栈的空间释放就可以使用到析构函数,代替Destory函数的作用,防止在我们忘记对空间释放时自动调用,与构造函数的特点一致,除了只会在生命周期结束时会使用,也不需要 void 做返回值,与构造不同就是在原先类名之前加一个“ ~ ”

Date::~Date() { //... };
typedef int STDataType; class Stack { public: // 构造函数 Stack(int n = 4) { _a = (STDataType*)malloc(sizeof(STDataType) * n); if (nullptr == _a) { perror("malloc"); exit(1); } _capacity = n; _top = 0; } // 拷贝构造函数 Stack(Stack& s) { _a = (STDataType*)malloc(sizeof(STDataType) * s._capacity); if (nullptr == _a) { perror("malloc"); exit(1);; } memcpy(_a,s._a,sizeof(STDataType)*s._top); _capacity = s._capacity; _top = s.top; } // 析构函数 ~Stack() { cout << "~Stack()" << endl; free(_a); _a = nullptr; _top = _capacity = 0; } private: STDataType* _a; // 动态数组 size_t _capacity; // 容量 size_t _top; // 栈顶下标,0代表空栈 };

析构函数调用顺序

在初始化多个实例化对象析构函数的调用也是有顺序的,析构函数调用顺序类似栈,会先调用最后实例化对象。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 22:30:54

【项目篇】EmailAgent汇总

一.项目 1.1 项目定位 EmailAgent&#xff08;MailFriend&#xff09;是一个基于 LangGraph AgentMiddleware 的智能邮件助手系统&#xff0c;核心目标是&#xff1a; 通过自然语言对话完成邮箱认证、收件检查、邮件发送 演示 LangGraph 中间件机制&#xff08;动态工具选择…

作者头像 李华
网站建设 2026/8/16 22:28:28

个人博客建站

为什么改用 Astro 原本的博客基于 Vue 3 FastAPI&#xff0c;有完整的后台管理、评论系统、GitHub OAuth 登录。随着功能的添加&#xff0c;维护成本变高&#xff1a;服务器成本、数据库备份、依赖升级……于是决定改造成纯静态站。 核心改造点 内容源&#xff1a;从 MySQL…

作者头像 李华
网站建设 2026/8/16 22:26:24

Failed to take /etc/passwd lock: Invalid argument解决方案

在 x86 宿主机上构建 ARM64 Ubuntu 24.04 rootfs 时遇到 Failed to take /etc/passwd lock: Invalid argument 的完整解决记录 一、问题现象 环境&#xff1a; 宿主机&#xff1a;VMware Ubuntu 20.04&#xff08;x86_64&#xff0c;内核 6.6&#xff09; 构建方式&#xff…

作者头像 李华
网站建设 2026/8/16 22:24:40

Go语言AI Agent极致压缩:从编译优化到容器化部署的工程实践

1. 项目缘起&#xff1a;为什么我们需要一个“极致压缩”的AI Agent&#xff1f;最近在折腾AI Agent&#xff0c;发现一个挺有意思的现象&#xff1a;很多开源项目&#xff0c;功能确实强大&#xff0c;但一上手&#xff0c;资源占用就让人头疼。动辄几个G的内存&#xff0c;启…

作者头像 李华
网站建设 2026/8/16 22:21:13

题解:AtCoder AT_awc0125_a Warehouse Package Inspection

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来&#xff0c;并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构&#xff0c;旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

作者头像 李华