【c++】类和对象详解

news2024/9/25 9:33:46

✅博客主页:爆打维c-CSDN博客​​​​​​ 🐾

🔹分享c语言知识及代码

来都来了! 点个赞给博主个支持再走吧~!


一.类的定义

(1)类定义格式

class为类定义的关键字,定义一个类格式如下:

class 类名{

      //代码块(类的主体)

};  //注意分号不能省略

需要注意的是:

1.类体中的内容称为类的成员,类中的变量称为类的成员变量,类中的函数为类的成员函数 

2.为了区分成员变量,我们常在成员变量前加一个 _ ,以此来区分,例如我们创造一个日期类Date,其中有年月日三个成员,那么我们可以这样定义:

class Date{
	
public:
	//成员函数代码块...
private:

	int _year;

	int _month;

	int _day;

};

3.C++中也可以用struct定义类,C++兼容C,明显的变化是struct里面也能定义函数,不过我们这里还是推荐用class定义类

4.定义在类里的成员函数默认为内联函数inline

(2)访问限定符

1.通过访问限定符实现封装

C++⼀种实现封装的方式,⽤类将对象的属性与方法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

2.public protected private的区别

其实就字面意思上来看,已经体现出它们的特点了:

• public公有的,protected保护的,private私有的

public修饰的成员在类外可以直接被访问

protected和private修饰的成员在类外不能直接被访问

protected和private是⼀样的,以后继承章节才能体现出他们的区别

• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
• ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。

(3)类域

  • 类定义了⼀个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
  • 类域影响的是编译的查找规则让程序能找到类中的声明的函数或成员变量

二.实例化对象

就像我们想要一个整型变量a,那么int a=...,类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出对象时,才会分配空间。

类实例化出的每个对象,都有独立的数据空间,那么它们的大小是多少呢?

它们的存储符合以下规则,成员函数是不存储到每个具体对象里的,它们被放在公共代码区

C++规定类实例化的对象要符合内存对齐的规则

不懂内存对齐规则的小伙伴可以看看我的这篇文章【C语言】结构体内存对齐_c struct 内存对齐-CSDN博客


三.this指针

1. 编译器编译后,类的成员函数默认都会在形参第一个位置,增加⼀个当前类类型的指针,

叫做this指针

比如Date类的Add的真实原型为, void Add(Date* const this, const Date& d2);

2. 类的成员函数中访问成员变量,本质都是通过this指针访问的,

    如Init函数中给_year赋值, this->_year = year;

3 .注意: C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

4. this指针存在内存的栈区


四.类的默认成员函数

(1)类的默认成员函数有6个,我们不写的情况下编译器会默认生成6个成员函数(但不一定能实现我们需要的功能)所以为了实现具体的功能,我们需要根据要求写出部分成员函数。

下面我们来介绍前四种比较重要的成员函数(后两个取地址基本不需要我们自己实现,编译器生成的已经够用):

重点来了!!!!

1.构造函数

构造函数是特殊的成员函数,构造函数虽然叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。

🔶构造函数的特点:

  • 函数名与类名相同
  • ⽆返回值 (返回值啥都不需要给,也不需要写void,C++规定)
  • 对象实例化时系统会自动动调用对应的构造函数。
  • 构造函数可以重载。
  • 如果类中没有显式定义构造函数,则C++编译器会⾃动生成⼀个⽆参的默认构造函数,⼀旦显式定义编译器将不再⽣成。
  • 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有⼀个存在,不能同时存在。⽆参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意⽆参构造函数、全缺省构造函数也是默认构造,总结⼀下就是不传实参就可以调用的构造就叫默认构造

大家可以看看下面这个Date类的定义,就明白不同构造函数的特点了

class Date {
  public:
// 1.⽆参构造函数
    Date() {
        _year = 1;
        _month = 1;
        _day = 1;
    }
// 2.带参构造函数
    Date(int year, int month, int day) {
        _year = year;
        _month = month;
        _day = day;
    }
// 3.全缺省构造函数
    /*Date(int year = 1, int month = 1, int day = 1)
    {
    _year = year;
    _month = month;
    _day = day;
    }*/

  private:
    int _year;
    int _month;
    int _day;
};

2.析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放工作。

🔶析构函数的特点:

  • 析构函数名是在类名前加上字符 ~
  • ⽆参数⽆返回值。 (这⾥跟构造类似,也不需要加void)
  • ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数。
  • 对象⽣命周期结束时,系统会⾃动调⽤析构函数。
  • 跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会调⽤他的析构函数。
  • ⾃定义类型成员⽆论什么情况都会⾃动调⽤析构函数,跟我们自己写不写无关。
  • ⼀个局部域的多个对象,C++规定后定义的先析构

像我们上面写的Date类没有资源需要释放,那么就不需要写析构函数。

3.拷贝构造

构造函数的第⼀个参数是⾃⾝类类型的引⽤且任何额外的参数都有默认值,那么此构造函数也叫做拷⻉构造函数,拷⻉构造是⼀个特殊的构造函数。

  • 🔶拷⻉构造的特点:
  • 拷⻉构造函数是构造函数的⼀个重载
  • 拷⻉构造函数的参数只有⼀个且必须是类类型对象的引用,使⽤传值⽅式编译器直接报错,因为语法逻辑上会引发⽆穷递归调⽤。
  • C++规定⾃定义类型对象进行拷贝行为必须调用拷贝构造,所以这⾥⾃定义类型传值传参和传值返回都会调⽤拷⻉构造完成。
  • 若未显式定义拷贝构造,编译器会自动生成拷贝构造函数。⾃动⽣成的拷⻉构造对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的拷⻉构造。
  • 传值返回会产生一个临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(引用),没有产生拷贝。但是如果返回对象是⼀个当前函数局部域的局部对象,函数结束就销毁了,那么使⽤引⽤返回是有问题的,这时的引⽤相当于⼀个野引⽤,类似⼀个野指针⼀样。传引用返回可以减少拷贝,但是一定要确保返回对象,在当前函数结束后还在,才能⽤引⽤返回。

下面实现的是对Date类的拷贝构造函数

Date::Date(const Date& d) {
	_year = d._year;
	_month = d._month;
	_day = d._day;
}

对深拷贝浅拷贝不懂的同学可以去看我的这篇文章

深拷贝与浅拷贝-CSDN博客

4.赋值重载

赋值重载很容易跟拷贝构造弄混淆,大家一定要注意区分!

二者的区别在于,拷贝构造是给一个未初始化的对象初始化,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。而赋值重载是这两个对象均存在且已经初始化,把其中一个的值赋给另外一个!

🔶赋值运算符重载的特点:

  1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成const当前类类型引⽤,否则会传值传参会有拷⻉
  2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋值场景
  3. 没有显式实现时,编译器会⾃动⽣成⼀个默认赋值运算符重载,默认赋值运算符重载⾏为跟默认构造函数类似,对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的拷⻉构造。
  4. 像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成的赋值运算符重载就可以完成需要的拷⻉,所以不需要我们显⽰实现赋值运算符重载。当编译器⾃动⽣成的赋值运算符重载完成的值拷⻉/浅拷⻉不符合我们的需求时,需要我们自己实现深拷贝(对指向的资源也进行拷贝)。小技巧:如果⼀个类显⽰实现了析构并释放资源,那么他就需要显⽰写赋值运算符重载,否则就不需要。

下面给出Date类的赋值重载代码

/ 赋值运算符重载
// d2 = d3    d2.operator=(&d3)
Date& Date::operator=(const Date& d){
	_year = d._year;
	_month = d._month;
	_day = d._day;
	return *this;  //返回d2
}

如果这篇文章对你有帮助的话,请给博主一个免费的赞鼓励一下吧~ 💓

本文仅简单介绍了有关类和对象的一些基本概念和相关代码实现,以上个人拙见,若有错误之处,希望各位能提出宝贵的建议和更正,感谢您的观看!

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

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

相关文章

kubelet 探针

目录 1 k8s中kubelet 探针的介绍 1.1 探针是由 kubelet 对容器执行的定期诊断: 1.2 Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应: 1.3 ReadinessProbe 与 LivenessProbe 的区别 1.4 StartupProbe 与 ReadinessProbe、LivenessProbe 的区别 2 实…

CCRC-DSA数据安全评估师:网络安全风险评估

1.网络安全风险评估概述 1.1概念 在当今信息化时代,网络安全成为了组织不可或缺的一部分。 风险评估作为一种科学方法,其目的是对网络系统的保密性、完整性、可控性和可用性这四个核心安全属性进行深入分析。 这一过程不仅包括识别网络系统中存在的脆…

Snipaste无法使用F1、F3等快捷键的保姆级解决方法

在Snipaste中按F1、F3等快捷键无效的可能原因: 1. 软件设置: 检查Snipaste的设置,确保F1被正确设置为截屏热键,并确认没有其他软件占用或冲突。 2. 热键冲突: 笔记本电脑的功能键(F1-F12)通常…

MySQL 数据库:原理、应用与发展

摘要:本文深入探讨了 MySQL 数据库相关内容。首先介绍了 MySQL 作为开源关系型数据库管理系统的显著特点,包括易用性、跨平台性、高性能、可扩展性、开源免费以及数据安全性等方面。接着详细阐述了其安装与配置过程,涵盖在不同操作系统上的安…

STM32使用 :串口的接收与发送

一、串口 在 STM32 中,串口(UART,通用异步收发传输器)是用于串行通信的外设。它在嵌入式系统中的作用非常广泛,主要包括几个方面 数据通信 串口用于微控制器与其他设备之间的数据传输。这些设备可以是其他微控制器、…

F12抓包08:查看网站Cookie

课程大纲 1、查看Cookie 1. 应用界面查看:按F12进入浏览器的开发者模式 - “应用”(Application) - Cookie,可查看Cookie并进行增、删、改、查操作。 2. 控制台命令行查看:按F12进入浏览器的开发者模式 - “控制台”&…

【无标题】nginx服务器代码信息、数据库连接信息、敏感文件的路径、服务器版本信息发起有针对性的攻击

Nginx敏感文件的路径、服务器版本信息 Nginx 403、404、500等错误时,返回详细错误信息。报错信息中可能会包含服务器代码信息、数据库连接信息、敏感文件的路径、服务器版本信息等,攻击者可以利用这些信息来寻找已知的漏洞,从而发起有针对性…

『功能项目』管理器基类【38】

我们打开上一篇37单例模式框架的项目&#xff0c; 本章要做的事情是编写管理器基类 首先创建脚本&#xff1a;ManagerBase.cs using UnityEngine; public abstract class ManagerBase : MonoBehaviour{public virtual void Init() { } } public class ManagerBase<T> : …

【Qt系列样式表】探索Qt Widget的艺术化设计与应用(Macos风格)(持续更新中...)

✨✨ Rqtz 个人主页 : 点击✨✨ &#x1f308;Qt系列专栏:点击 &#x1f388;PyQt系列专栏:点击&#x1f388; &#x1f388;Qt智能车上位机专栏: 点击&#x1f388; &#x1f388;Qt串口助手专栏:点击&#x1f388; &#x1f4ab;宗旨:共享IT之美,共创机器未来 目录 界面…

毕业论文word页眉页脚和页码的问题

多找B站视频查看视频操作方法。 问题1&#xff1a; 不同章节的页眉显示不同内容。 解决办法&#xff1a; “布局”里面插入分节符 &#xff08;非 分页符。&#xff09; 问题2&#xff1a; 页眉需要奇偶页内容不同 解决办法&#xff0c;编辑页眉部分&#xff0c;设置 奇偶页…

Qt (15)【Qt窗口 —— 字体对话框 QFontDialog | 输入对话框 QInputDialog】

阅读导航 引言一、字体对话框 QFontDialog1. 简介2. 基本用法3. 示例代码 二、输入对话框 QInputDialog1. 简介2. 基本用法&#xff08;1&#xff09;双精度浮点型输入数据对话框&#xff08;2&#xff09;整型输入数据对话框&#xff08;3&#xff09;选择条目型输入数据框 3.…

李沐对大模型趋势的几点判断

李沐是上海交通大学 2011 届计算机科学与工程系本硕系友。他曾担任亚马逊资深首席科学家&#xff0c;加州大学伯克利分校和斯坦福大学的访问助理教授&#xff0c;是前 Marianas Labs 联合创始人&#xff0c;深度学习框架 Apache MXNet 的创始人之一。目前是 BosonAI 联合创始人…

【数据分析】标准误差与标准差的区别

标准误差&#xff08;Standard Error, SE&#xff09;和标准差&#xff08;Standard Deviation, SD&#xff09;是两个在统计学中非常重要的概念&#xff0c;但它们的含义和用途有所不同。以下是它们之间的主要区别&#xff1a; 定义&#xff1a; 标准差&#xff1a;衡量单个数…

【mybatis】使用模糊查询时报错:Encountered unexpected token: “?“ “?“

报错信息如下&#xff1a; Mapper.xml报错代码&#xff1a; AND HILIST_NAME like %#{hilistName}% 解决方案&#xff1a; 把模糊查询的 sql 语句改为使用 CONCAT 命令拼接, 就不会报错了。 AND HILIST_NAME like CONCAT(%, #{hilistName},%)

深入探讨-JavaScript-逻辑赋值运算符

null && 100**2 // null undefined && 100**2 // undefined 逻辑赋值运算符 && || ?? 这个运算符将赋值与条件逻辑运算符结合在一起&#xff0c;因此命名为**“逻辑赋值”** 。它们只是一种简写&#xff0c; 例如&#xff0c;x && y是x …

Windows本地部署ollama并实现无公网IP远程运行qwen大语言模型

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并安装Open WebUI结合cpolar内网穿透软…

打造智能数据分析平台:基于 Flask 的数据处理与模型精度验证系统

数据分析和机器学习已成为企业和科研中不可或缺的核心技术。在这个数据驱动的时代&#xff0c;能够快速处理海量数据&#xff0c;并通过智能算法提取出有用信息&#xff0c;成为了提升竞争力的关键。为了解决这些需求&#xff0c;我基于 Flask 开发了一款功能强大、模块化的数据…

【蓝桥杯单片机-0.基于定时器的时钟程序设计】

蓝桥杯单片机-0.基于定时器的时钟程序设计 题目小注意点按键三行矩形按键按键功能时间更新显示界面的小数点LED灯闪烁其他功能 完整代码 链接: 视频搭配视频&#xff0c;这里只是一些笔记&#xff0c;并不完整 题目 小注意点 按键三行 Key_Val Key_Read();//实时读取键码值…

JDBC知识点总结概括(day29)

1 学习目标 了解JDBC的概念重点掌握JDBC的CRUD重点掌握JDBC的各个对象的使用 2 GIT 查看安装手册 3 JDBC概述 3.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持…

【人工智能学习笔记】5 计算机视觉基础

计算机视觉概述 定义&#xff1a;计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何使机器“看”的科学&#xff0c;也可以看作是研究如何使人工系统从图像活多维数据中“感知”的科学终极目标&#xff1a;计算机视觉成为机器认知世界的基础&#xff0c;终极目…