C++中类的默认成员函数

默认成员函数

  • 1.构造函数
  • 2.析构函数
  • 3.拷贝构造函数
  • 4.赋值运算符重载
    • 4.1运算符重载
    • 4.2赋值运算符重载

开始
初始化和清理
拷贝复制
取地址重载
构造函数
主要完成出初始化
析构函数
主要完成清理工作
拷贝构造函数
使用同类对象初始化创建对象
赋值运算符重载
把一个对象赋值给另一个对象

1.构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。

构造函数的特点:

  1. 函数名与类名相同。
  2. ⽆返回值。 (返回值啥都不需要给,也不需要写void)
  3. 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。
  4. 构造函数可以重载。
  5. ⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数,都叫做默认构造函数。但是这三个函数有且只有⼀个存在,不能同时存在。
  6. 我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。
    无参的构造函数
class Person//建一个关于人的类
{
public:Person(){_name = 'x';_height = 190;_weight = 80;}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person h;;//这就是调用无参构造函数Person h1()//这是错误的return 0;
}

main函数中h1是错误的,不能这样调用,这样写与函数的声明区分。

有参的构造函数:

class Person//建一个关于人的类
{
public:Person(char name,int height,int weight)
{_name = name;_height = height;_weight = weight;
}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person h2('x', 190, 90);return 0;
}

全缺参和半缺省的构造函数:

class Person//建一个关于人的类
{
public:Person(){_name = 'x';_height = 190;_weight = 80;}Person(char name='x', int height=190, int weight=150){_name = name;_height = height;_weight = weight;}Person(char name, int height=190, int weight=190){_name = name;_height = height;_weight = weight;}void Print()//打印函数{cout << _name << "/" << _height << "/" << _weight << endl;}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person p;Person p1('x', 190, 90);Person p2('z');p.Print();return 0;
}

2.析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放⼯作。析构函数的功能类⽐我们之前Stack实现的Destroy功能,⽽像Person没有Destroy,其实就是没有资源需要释放,所以严格说Person是不需要析构函数的。
析造函数的特点:

  1. 析构函数名是在类名前加上字符 ~。。
  2. ⽆返回值。 (返回值啥都不需要给,也不需要写void)
  3. ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数。
  4. ⼀个局部域的多个对象,C++规定后定义的先析构。
  5. 对象⽣命周期结束时,系统会⾃动调⽤析构函数。

3.拷贝构造函数

如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。
拷贝构造函数的特点:

  1. 拷⻉构造函数是构造函数的⼀个重载。
  2. 拷⻉构造函数的参数只有⼀个且必须是类类型对象的引⽤,使⽤传值⽅式编译器直接报错,因为语法逻辑上会引发⽆穷递归调⽤
  3. C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传值传参和传值返回都会调⽤拷⻉构造完成。
  4. 像日期类这样的类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成的拷⻉构造就可以完成需要的拷⻉,所以不需要我们显⽰实现拷⻉构造。如果⼀个类显示实现了析构并释放资源,那么他就需要显示写拷贝构造,否则就不需要。
class Person//建一个关于人的类
{
public:Person(){_name = 'x';_height = 190;_weight = 80;}Person(const Person& p){_name = p._name;_weight = p._weight;_height = p._height;}Person(const Person* p){_name = p->_name;_weight = p->_weight;_height = p->_height;}void Print(){cout << _name << "/" << _height << "/" << _weight << endl;}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person p;Person p1('x', 190, 90);Person p2(&p1);// 这⾥可以完成拷⻉,但是不是拷⻉构造,只是⼀个普通的构造Person p3(p1);//这样写才是拷⻉构造,通过同类型的对象初始化构造,⽽不是指针Person p4 = p1; // 也可以这样写,这⾥也是拷⻉构造return 0;
}

4.赋值运算符重载

4.1运算符重载

  1. 当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。

  2. 运算符重载是具有特名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体
    3.重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。

  3. 注意这5个运算符不能重载在这里插入图片描述

  4. 重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,⽆法很好的区分。C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。

4.2赋值运算符重载

赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。
赋值运算符重载的特点:

  1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成const 当前类类型引⽤,否则会传值传参会有拷贝
  2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋值场景。

拷贝构造函数和赋值运算符重载的区别

  • 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,这个新对象是另一个同类对象的副本。在以下情况会被调用:用一个已存在的对象初始化一个新对象,如 ClassA newObj(oldObj); 。
  • 复制运算符重载是对赋值运算符( = )的重新定义。用于将一个对象的值复制到另一个已存在的对象中,像 obj1 = obj2; 这种情况会调用复制运算符重载。

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

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

相关文章

游戏引擎学习第一天

视频参考: https://www.bilibili.com/video/BV1zGDCYHErA/ 创建一个保存项目的路径 VS的安装略过&#xff0c;个人自行百度 1. vs 创建第一个CMAKE的窗口项目 game.cpp 修改如下的代码 到https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain 去…

视频播放相关的杂记

基于QT FFMPEG设计一款 RTMP协议推流、视频录制软件 实现的功能&#xff1a; &#xff08;1&#xff09;将摄像头视频流 麦克风音频流合并&#xff0c;并推到流媒体服务器 &#xff08;2&#xff09;将摄像头视频流 麦克风音频流保存到本地磁盘 基于QtFFMPEG设计一款RTM…

Neo4j Cypher WHERE子句详解 - 初学者指南

Neo4j Cypher WHERE子句详解 - 初学者指南 前言1. WHERE子句基础1.1 WHERE子句的本质1.2 示例数据 2. 基本用法2.1 节点属性过滤2.2 关系属性过滤 3. 高级过滤技巧3.1 字符串匹配3.2 正则表达式3.3 属性存在性检查 4. 列表和范围操作4.1 IN操作符4.2 范围查询 5. 空值处理5.1 默…

【鸿蒙】开发者攻略:借力鸿蒙生态,打造全场景应用新体验

在当前智能操作系统竞争日益激烈的环境中&#xff0c;鸿蒙系统以其独特的分布式特性和跨平台能力&#xff0c;逐渐在多个领域展现出强大的竞争力。对于开发者而言&#xff0c;以下是抓住鸿蒙生态崛起机遇、应对开发挑战、创造优质应用体验的策略&#xff1a; 一、深入挖掘鸿蒙…

2024年将尽,我们开始为ESG的未来感到担忧 | 深度

2024已经接近尾声了&#xff0c;今年ESG的发展状况非常两级分化。最极端者&#xff0c;有人觉得ESG要在2024年起飞的&#xff0c;毕竟今年三大交易所出台了《上市公司可持续发展报告指引》&#xff0c;“A股公司进入ESG信披新纪元”。而在另一个极端&#xff0c;有人认为ESG“将…

【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(1)

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 本章是去答案版本。带答案的版本在下…

windows中docker安装redis和redisinsight记录

创建一个Redis运行容器&#xff0c;命令如下 docker run -it -d --name redis -p 6379:6379 redis --bind 0.0.0.0 --protected-mode no -d 代表Redis容器后台运行 --name redis 给创建好的容器起名叫redis -p 6379:6379 将容器的6379端口映射到宿主机的6379端口&#xff0c;注…

atcoder解题

#include <iostream> #include <vector>using namespace std;int main() {long long N, M;cin >> N >> M;vector<long long> X(M), A(M);long long totalStones 0;// 读入 X 和 Afor (int i 0; i < M; i) {cin >> X[i];}for (int i …

C#-密封类、密封方法

一&#xff1a;密封类 关键字&#xff1a;sealed 密封类&#xff1a; sealed class Enemy{} 密封方法&#xff1a;密封方法必须是被重写的方法 public sealed override void Move(){...} 密封类不能被继承&#xff0c;密封方法不能被重写 → 让类无法再被继承 加强面向对象…

onnx-runner:使用ORT运行YOLO的ONNX模型

onnx-runner onnx-runner使用 ORT 运行 ONNX 模型&#xff0c;使用Rust构建。 目前仅支持 YOLO 模型&#xff0c;未来可能会支持其他 ONNX 模型 安装 要求 如果您想使用 CPU 运行 onnx-runner&#xff0c;则无需安装如果您想使用 GPU 运行 onnx-runner&#xff0c;则需要安…

Vue:侦听属性

Vue&#xff1a;侦听属性 watch深度侦听异步任务 watch 在Vue中&#xff0c;允许用户在数据改变时&#xff0c;做出一定的处理。 语法&#xff1a; new Vue({watch:{属性名:{handler(newValue, oldValue){// 函数体} }} })当一个属性被写入watch中&#xff0c;每当这个属性…

朴素贝叶斯分类器基于iris及Python手写实现

数据来源为sklean.datasets中的load_iris&#xff0c;代码如下&#xff1a; # -*- coding:utf-8 -*- import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import ac…

SwiftUI开发教程系列 - 第1章:简介与环境配置

1.1 SwiftUI简介 SwiftUI 是 Apple 于 2019 年推出的声明式用户界面框架&#xff0c;旨在简化 iOS、macOS、watchOS 和 tvOS 应用的 UI 开发。与 UIKit 的命令式编程方式不同&#xff0c;SwiftUI 提供了一种声明式语法&#xff0c;让开发者可以以更加直观、简洁的方式构建 UI。…

Flutter 中 Provider 的使用指南

目录 1.什么是 Provider 2.如何安装 Provider 3.基本使用方式 1.使用ChangeNotifierProvider提供状态 2.使用 Provider.of 手动读取状态 3.多Provider 的使用 4.常见的 Provider 类型 在 Flutter 开发中&#xff0c;状态管理是一个常见的需求。Provider 是 Flutter 官方…

《计算机原理与系统结构》学习系列——存储器(上)

系列文章目录 目录 存储器技术概要存储器层次cache&#xff0c;内存辅存存储器技术SRAM技术DRAM技术闪存磁盘存储器 局部性原理 高速缓存cache访存性能概念命中与缺失访存阻塞的周期数 cache基础&#xff1a;直接映射块号内存地址字段缺失缺失处理和写策略 全相联映射组相连映…

lua入门教程:type函数

在Lua中&#xff0c;type 函数是一个内置函数&#xff0c;用于返回给定值的类型。Lua 支持多种数据类型&#xff0c;包括 nil&#xff08;空值&#xff09;、boolean&#xff08;布尔值&#xff09;、number&#xff08;数字&#xff09;、string&#xff08;字符串&#xff09…

Centos 7离线安装ntpd服务

本文涉及一次Centos 7系统中离线安装ntpd对时服务的过程&#xff0c;其目的是为了在服务器运行过程中能够实时同步时间。 问题提出 某服务器需部署业务程序&#xff0c;这些程序的部署脚本是我初创的&#xff0c;后因其它事转交给其他人&#xff0c;后再因其它事又兜兜转转到了…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

A021基于Spring Boot的自习室管理和预约系统设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【GPT使用技巧】用AI出一门课

提问 我想做一个ChatGPT的课程&#xff0c;针对小白&#xff0c;解决从0到1的问题。按照小白的通点&#xff0c;列出大家最关心的问题&#xff0c;做一个课程大纲给我。避免生涩语言&#xff0c;用小白理解和关心的方式展示。 GPT的回答结果 课程大纲&#xff1a;ChatGPT入门…