10.类和对象

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

C++中定义类(结构体)的语法:

class className
{// 类体:由成员函数和成员变量组成};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。(也可以使用struct定义类,但是有一点区别,下面会说到)

类的两种定义方式:

1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

为方便书写这里使用第一种,工程中使用第二种较好。

类的访问限定符及封装

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

说明:

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

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4. 如果后面没有访问限定符,作用域就到 } 即类结束。

5. class的默认访问权限为private,struct为public(因为struct要兼容C)如下:struct的函数都是公有的,class从{开始到public之前的函数都是私有的。

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别(主波没理解,后续理解了再更新)

如何计算类对象的大小

如下面这个日期类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算 一个类的大小?

只保存成员变量,成员函数存放在公共的代码段

从下图可以得知,只计算成员变量的内存(按照内存对齐的方式计算:写文章-CSDN创作中心),注意空类,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

11.this指针

先观察下面这个代码,d1和d2是如何调用Init和print函数完成初始化和打印的呢?

其实是存在一个隐藏的this指针,如下代码的注释:

class Date
{
public:void print();   // ==>void Date::print(Date *this)void Init(int year,int month,int day);// ==>void Date::Init(Date *this,int year=0, int month=1, int day=1)private:int _year;int _month;int _day;
};void Date::print()   // void Date::print()==void Date::print(Date *this)
{// ==cout <<this->_year << '-' <<this->_month << '-' << this->_day << endl;cout << _year << '-' << _month << '-' << _day << endl;
}void Date::Init(int year=0, int month=1, int day=1) // ==>void Date::Init(Date *this,int year=0, int month=1, int day=1)
{_year = year;_month = month;_day = day;//this->_year = year;//this->_month = month;//this->_day = day;
}int main()
{Date d1, d2;d1.Init(2025, 8, 9); // ==> d1.Init(&d1,2025, 8, 9);d2.Init(2025, 8, 10);// ==> d2.Init(&d2,2025, 8, 10);d1.print();    // ==> d1.print(&d1);d2.print();    // ==> d2.print(&d2);return 0;
}

12.构造函数

构造函数是一个特殊的成员函数(作用是初始化对象的成员变量),名字与类名相同,创建对象时由编译器自动调用,以保证每个成员变量都有一个合适的初始值,并且在对象整个生命周期内只调用一次。前面写的日期类是使用了 Init 函数进行初始化,但是每创建一个对象就得调用这个函数才能初始化,现在使用构造函数就不需要自己手动调用函数初始化创建的对象。

特性:

1. 函数名与类名相同。

2. 无返回值。

3. 创建对象时编译器自动调用对应的构造函数。

4. 构造函数可以重载。

如下日期类作为例子:

class Date
{
public:// 1.无参构造函数Date(){_year = 0;_month = 1;_day = 1;}// 2.带参构造函数Date(int year, int month, int day) {_year = year;_month = month;_day = day;}// 参数可以全缺省//Date(int year=0, int month=1, int day=1) //{//   _year = year;// _month = month;// _day = day;//}void print()   // void Date::print()==void Date::print(Date *this){cout << _year << '-' << _month << '-' << _day << endl;}private:int _year;int _month;int _day;
};void TestDate()
{Date d1;             // 调用无参构造函数// Date d1();不能加括号,否则就成了函数声明d1.print();Date d2(2015, 1, 1); // 调用带参的构造函数d2.print();
}
int main()
{TestDate();return 0;
}

13.析构函数

与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。比如:在栈中我们在申请了堆上面申请了空间存储栈的元素,此时调析构函数就是清理这部分空间,不在像栈那样需要写一个销毁函数destro()。

特性:

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值类型。

3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。(后创建的对象,在程序结束时会先调用它的析构函数)下图A类先创建两个对象接着B类创建两个对象,main函数结束时,先调用B类对象的析构函数在调用A类对象的析构函数。

如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 A,B类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。(注意下图打印的指针的地址,证明了特性的第四点)

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

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

相关文章

奇偶校验码原理与FPGA实现

奇偶校验原理与FPGA实现写在前面一、基础原理2.1 奇校验2.2 偶校验2.3 缺点二、举个例子3.1 奇校验例子3.2 偶校验例子3.3 检测出错例子三、FPGA实现写在后面写在前面 奇偶校验码是一种简单的检错码&#xff0c;主要用于数据传输或存储过程中检测奇数个比特错误或者偶数个比特错…

Python中的Lambda函数详解

Lambda函数&#xff08;匿名函数&#xff09;是Python中一种简洁的函数定义方式&#xff0c;它允许你快速创建小型、一次性的函数对象而无需使用标准的def关键字。1. Lambda函数的基本语法lambda arguments: expressionlambda&#xff1a;定义匿名函数的关键字arguments&#x…

进阶向:Python编写网页爬虫抓取数据

Python网页爬虫入门指南&#xff1a;从零开始抓取数据在当今数据驱动的时代&#xff0c;网络爬虫已成为获取公开信息的重要工具。Python凭借其丰富的库和简洁的语法&#xff0c;成为编写网络爬虫的首选语言。本文将详细介绍如何使用Python编写一个基础的网页爬虫。什么是网页爬…

客服Agent革命:智能客服系统的技术实现与效果评估

客服Agent革命&#xff1a;智能客服系统的技术实现与效果评估 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是我…

C++-红黑树

1、红黑树的概念红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;…

在Python中避免使用`None`表示特殊情况:函数返回值与异常处理的最佳实践 (Effective Python 第20条)

在Python编程中&#xff0c;函数的设计与实现直接影响代码的可读性、可维护性和健壮性。一个常见的问题是如何处理函数的返回值&#xff0c;尤其是在需要表示某种特殊或异常情况时。许多开发者习惯性地使用None来表示这些特殊情况&#xff0c;但这种方法往往会导致意想不到的错…

从反射到方法句柄:深入探索Java动态编程的终极解决方案

&#x1f31f; 你好&#xff0c;我是 励志成为糕手 &#xff01; &#x1f30c; 在代码的宇宙中&#xff0c;我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光&#xff0c;在逻辑的土壤里生长成璀璨的银河&#xff1b; &#x1f6e0;️ 每一个算法都是我绘制…

算法_python_学习记录_01

人心的成见是一座大山。一旦有山挡在面前&#xff0c;则很难到达下一站。所需要做的&#xff0c;是穿过这座山。 偶然间看了一个视频&#xff0c;说的是EMASMA的自动交易策略&#xff0c;这个视频做的很用心&#xff0c;在入场的时间不仅要看EMA的金叉&#xff0c;还需要看其他…

机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)

文章目录一、语法&#xff08;Grammar&#xff09;&#xff1a;语言规则的底层框架1.1 传统语法理论的应用1.2 生成语法&#xff08;Generative Grammar&#xff09;1.3 依存语法&#xff08;Dependency Grammar&#xff09;二、句法&#xff08;Syntax&#xff09;&#xff1a…

MQTT:Dashboard访问授权

目录一、认证1.1 创建认证器1.2 多认证器二、授权2.1 ACL文件授权配置2.2 使用内置数据库授权配置一、认证 认证&#xff1a;就是验证客户端的身份。 1.1 创建认证器 选择认证方式配置数据源配置数据源的相关参数 认证器创建之后&#xff0c;在使用客户端连接Dashboard时&am…

Serper注册无反应

google邮箱才行&#xff0c;163邮箱注册无反应&#xff0c;其他邮箱没试过 在尝试websailor系列的时候&#xff0c;需要注册serper&#xff0c;获取Google Search Key serper.dev/dashboard

聊聊经常用的微服务

聊聊微服务 架构演变 单体架构&#xff1a; All in One&#xff0c;所有的功能模块都在一个工程里。 SOA架构&#xff1a; 这个架构当不当正不正&#xff0c;对于现在来说&#xff0c;有点老&#xff0c;甚至需要ESB&#xff0c;WebService之类的&#xff0c;基本不会使用了。…

第十四届蓝桥杯青少年组省赛 编程题真题题解

明天我就要考蓝桥杯省赛了&#xff0c;本蒟蒻已瑟瑟发抖&#xff0c;所以现在写一篇文章。 题目分别为&#xff1a; 1.​​​​​​B4270 [蓝桥杯青少年组省赛 2023] 特殊运算符 2.B4271 [蓝桥杯青少年组省赛 2023] 四叶玫瑰数 3.B4272 [蓝桥杯青少年组省赛 2023] 质因数的…

HTML全景效果实现

我将为您创建一个精美的360度全景效果页面&#xff0c;使用Three.js库实现沉浸式全景体验&#xff0c;并提供用户友好的控制界面&#xff0c;完整代码看文章末尾。 设计思路 使用Three.js创建全景球体 添加控制面板用于切换不同场景 实现自动旋转和手动控制选项 添加加载状…

Python 属性描述符(描述符用法建议)

描述符用法建议 下面根据刚刚论述的描述符特征给出一些实用的结论。 使用特性以保持简单 内置的 property 类创建的其实是覆盖型描述符&#xff0c;__set__ 方法和 __get__ 方法都实现了&#xff0c;即便不定义设值方法也是如此。特性的 __set__ 方法默认抛出 AttributeError: …

Milvus 向量数据库内存使用相关了解

1、支持 MMap 的数据存储在 Milvus 中&#xff0c;内存映射文件允许将文件内容直接映射到内存中。这一功能提高了内存效率&#xff0c;尤其是在可用内存稀缺但完全加载数据不可行的情况下。这种优化机制可以增加数据容量&#xff0c;同时在一定限度内确保性能&#xff1b;但当数…

C++编程之旅-- -- --默认成员函数(全详解)

目录前言构造函数构造函数形式&#xff1a;构造函数的特性&#xff1a;explicit关键字析构函数析构函数的概念析构函数的特性含有类类型的成员变量的类析构函数的调用拷贝构造函数拷贝构造函数的概念拷贝构造函数的特性浅拷贝和深拷贝&#xff1a;拷贝构造函数典型调用场景&…

Linux网络编程:TCP的远程多线程命令执行

目录 前言&#xff1a; 一、前文补充 二、服务端的修改 三、Command类的新增 前言&#xff1a; 好久不见&#xff0c;最近忙于其他事情&#xff0c;就耽误了咱们的Linux的网络部分的学习。 今天咱们先来给之前所学的TCP的部分进行一个首尾工作&#xff0c;主要是给大家介绍…

重学React(三):状态管理

背景&#xff1a; 继续跟着官网的流程往后学&#xff0c;之前已经整理了描述UI以及添加交互两个模块&#xff0c;总体来说还是收获不小的&#xff0c;至少我一个表面上用了四五年React的前端小卡拉米对React的使用都有了新的认知。接下来就到了状态管理&#xff08;React特地加…

java web项目入门了解

目录一、项目流程1. 使用servle2. 使用框架二、了解java web项目构造1. 项目目录结构2. 查看页面访问顺序3. 发起请求&#xff1a;jqueryajax4. 接受参数5. JSONJSON 数组三、get和post请求区别一、项目流程 1. 使用servle 有客户端和服务端&#xff0c;客户端和服务端进行交…