c++类和对象---下
文章目录
一、类的静态成员
1.1.静态成员变量:所有对象共享的成员变量。
1.2.静态成员函数:可以访问静态成员变量,但不能访问非静态成员变量。
二、类的继承2.1.继承:子类继承父类的成员变量和成员函数。
2.2.多态:基类指针或引用可以指向子类对象。
三、类的友元函数和友元类3.1友元函数:可以访问类的私有成员。
3.2友元类:可以访问类的私有成员。
四、类的封装和数据隐藏4.1封装:将数据和操作封装在一起,避免外部访问对象的内部细节。
4.2数据隐藏:隐藏类的成员变量,只允许通过类的接口访问。
五、类的重载5.1运算符重载:重定义运算符的行为。
5.2函数重载:定义多个同名函数,但参数类型或个数不同。
六、类的模板6.1模板:定义通用的类或函数,可以使用不同的数据类型。
七、类的异常处理7.1异常处理:捕获和处理程序运行过程中发生的异常。
前言
上一篇文章我们学习了c++类和对象的前半部分,接下来我们来看看类和对象剩下的内容吧
一、类的静态成员
静态成员变量:
在类中声明的静态成员变量是所有对象共享的。它们属于类本身,而不是类的某个对象。静态成员变量在类的所有对象中都具有相同的值,无论创建了多少个对象,静态成员变量只有一个副本。
静态成员变量的声明和定义通常在类的外部进行,像全局变量一样。在声明时需要使用 static 关键字。
静态成员变量可以通过类名加作用域运算符访问,也可以通过对象名加作用域运算符访问。静态成员变量可以在不创建类的对象的情况下访问和修改。
静态成员函数:
静态成员函数是属于类本身的,而不是类的某个对象。它们不依赖于任何对象的创建,可以直接通过类名调用。
静态成员函数可以访问和修改静态成员变量,但不能访问非静态成员变量。因为非静态成员变量的值是属于对象的,而静态成员函数没有对象的上下文。
静态成员函数通常用于执行与类相关的操作,而不需要通过对象来调用。它们可以在不创建类的对象的情况下访问和修改静态成员变量。静态成员函数通常声明和定义在类的内部,但也可以在类的外部定义。
代码演示:
class Counter {
private:static int count; // 静态成员变量public:static void increaseCount() { // 静态成员函数count++;}static int getCount() { // 静态成员函数return count;}
};int Counter::count = 0; // 静态成员变量初始化int main() {Counter::increaseCount();Counter::increaseCount();Counter::increaseCount();std::cout << "Count: " << Counter::getCount() << std::endl; // Output: Count: 3return 0;
}
在上面的例子中,count
是一个静态成员变量,所有Counter
对象共享同一个count
变量。通过increaseCount
静态成员函数可以增加count
的值,通过getCount
静态成员函数可以获取count
的值。
二、类的继承
C++中的类继承是一种机制,允许一个类继承另一个类的属性和方法。继承的类称为派生类或子类,被继承的类称为基类或父类。
代码演示:
#include <iostream>
using namespace std;// 基类
class Animal {
public:virtual void sound() {cout << "动物发出声音" << endl;}
};// 派生类
class Dog : public Animal {
public:void sound() {cout << "汪汪汪" << endl;}
};// 派生类
class Cat : public Animal {
public:void sound() {cout << "喵喵喵" << endl;}
};int main() {Animal* animal;Dog dog;Cat cat;animal = &dog; // 基类指针指向派生类对象animal->sound(); // 调用派生类的函数animal = &cat; // 基类指针指向派生类对象animal->sound(); // 调用派生类的函数return 0;
}
运行上述代码,输出结果为:
汪汪汪
喵喵喵
在上面的代码中,Animal是基类,Dog和Cat是派生类。Dog和Cat继承了Animal类的成员变量和成员函数。在主函数中,我们使用基类指针animal分别指向Dog和Cat对象,并通过调用sound()函数,输出了相应的声音。
这就是类的继承和多态的基本用法,通过继承,子类可以继承父类的特性,并且可以通过基类指针或引用来实现多态,即同一种操作可以作用于不同的对象。
三、类的友元函数和友元类
在C++中,友元函数和友元类是为了实现类的访问控制而引入的特殊机制。
友元函数是指在一个类中,如果把一个全局函数声明为这个类的友元函数,那么这个函数就可以访问该类的私有成员和保护成员,即使在类的外部也可以直接调用该函数来访问类的私有成员和保护成员。
友元类是指在一个类中,如果将另一个类声明为这个类的友元类,那么友元类就可以访问该类的私有成员和保护成员,即使在友元类的定义中也可以直接访问该类的私有成员和保护成员。
使用友元函数和友元类可以实现一些特殊的访问需求,但是需要注意的是,友元函数和友元类破坏了封装性原则,应该谨慎使用。
代码演示:
#include <iostream>class MyClass {
private:int privateMember;public:MyClass(int value) {privateMember = value;}friend void friendFunction(MyClass& object); // friend function declarationfriend class FriendClass; // friend class declaration
};void friendFunction(MyClass& object) {std::cout << "Friend function can access private member: " << object.privateMember << std::endl;
}class FriendClass {
public:void displayPrivateMember(MyClass& object) {std::cout << "Friend class can access private member: " << object.privateMember << std::endl;}
};int main() {MyClass obj(42);friendFunction(obj); // calling friend functionFriendClass friendObj;friendObj.displayPrivateMember(obj); // calling friend class methodreturn 0;
}
运行这段代码,输出是:
Friend function can access private member: 42
Friend class can access private member: 42
在上面的例子中,MyClass
类有一个私有成员privateMember
。friendFunction
是一个友元函数,它可以访问MyClass
类的私有成员。FriendClass
是一个友元类,它也可以访问MyClass
类的私有成员。
在main
函数中,我们创建了一个MyClass
对象obj
并传入一个值。然后,我们通过调用友元函数friendFunction
来访问privateMember
。接着,我们创建了一个FriendClass
对象friendObj
并调用它的displayPrivateMember
方法,它也可以访问privateMember
。
四、类的封装和数据隐藏
C++类的封装和数据隐藏是面向对象编程中的重要概念。
封装是指将数据和操作数据的函数捆绑在一起,形成一个类。通过封装,我们可以将类的实现细节隐藏起来,只暴露必要的接口给外部使用。这样做的好处是可以保护数据的完整性和安全性,同时也方便了代码的维护和重用。
数据隐藏是指将类的数据成员声明为私有(private)或受保护(protected),只允许通过类的公有(public)成员函数来访问和修改数据。这样做的目的是为了防止外部直接对数据进行非法访问或修改,从而确保数据的一致性和安全性。同时,数据隐藏也可以提高代码的可维护性,因为类的实现细节可以自由改变,而不会影响使用该类的其他代码。
下面是一个简单的示例代码,演示了封装和数据隐藏的使用:
代码演示:
class MyClass {
private:int privateVar; // 私有成员变量,外部无法直接访问public:void setPrivateVar(int value) {privateVar = value;}int getPrivateVar() {return privateVar;}
};int main() {MyClass obj;obj.setPrivateVar(10);int value = obj.getPrivateVar();cout << value << endl; // 输出10,通过类的接口访问私有成员变量return 0;
}
在上述示例中,私有成员变量privateVar
被隐藏起来,外部无法直接访问。我们通过公有的成员函数setPrivateVar
和getPrivateVar
来间接操作和获取私有成员变量的值。这样可以保护私有变量的完整性,同时实现数据隐藏和封装。
五、类的重载
C++中的重载(Overload)指的是在同一个作用域内定义多个同名的函数,但它们具有不同的参数列表。重载函数可以根据传递给它们的参数的不同来执行不同的操作。
运算符重载:重定义运算符的行为。
代码演示:
#include <iostream>
using namespace std;class Complex {
private:double real;double imag;
public:Complex(double r, double i):real(r), imag(i) {}Complex operator+(const Complex& c) {double r = this->real + c.real;double i = this->imag + c.imag;return Complex(r, i);}Complex operator-(const Complex& c) {double r = this->real - c.real;double i = this->imag - c.imag;return Complex(r, i);}friend ostream& operator<<(ostream& os, const Complex& c) {os << c.real << " + " << c.imag << "i";return os;}
};int main() {Complex c1(1.0, 2.0);Complex c2(3.0, 4.0);Complex c3 = c1 + c2;Complex c4 = c1 - c2;cout << "c3 = " << c3 << endl;cout << "c4 = " << c4 << endl;return 0;
}
函数重载:定义多个同名函数,但参数类型或个数不同
代码演示:
#include <iostream>
using namespace std;void print(int num) {cout << "The number is: " << num << endl;
}void print(double num) {cout << "The number is: " << num << endl;
}void print(string str) {cout << "The string is: " << str << endl;
}int main() {int num1 = 123;double num2 = 3.14;string str = "Hello World";print(num1);print(num2);print(str);return 0;
}
六、类的模板
C++中的类模板是一种泛型编程技术,用于创建通用的类。模板允许我们定义一种通用的类,然后可以根据不同的类型实例化多个具体的类。
代码演示:
template <typename T>
class MyClass {
private:T data;
public:MyClass(T d) : data(d) {}void printData() {std::cout << "Data: " << data << std::endl;}
};
int main() {MyClass<int> obj1(5);obj1.printData(); // 输出: Data: 5MyClass<std::string> obj2("Hello");obj2.printData(); // 输出: Data: Helloreturn 0;
}
在上面的示例中,MyClass
是一个模板类,<typename T>
表示T
是一个类型参数,在使用时可以根据需要指定具体类型。MyClass
的实例化有两种不同的类型:int
和 std::string
。每个实例都有自己的 data
成员和 printData()
方法,并且可以根据需要访问和操作这些成员和方法。
七、类的异常处理
C++中的异常处理使用try-catch块来捕获和处理异常。try块用于包含可能引发异常的代码,而catch块用于处理捕获的异常。
代码演示:
#include <iostream>int main() {try {int num1, num2;std::cout << "请输入两个整数:" << std::endl;std::cin >> num1 >> num2;if (num2 == 0) {throw "除数不能为0";}int result = num1 / num2;std::cout << "结果是:" << result << std::endl;} catch (const char* msg) {std::cout << "捕获到异常:" << msg << std::endl;}return 0;
}
上述代码中,try块包含用户输入两个整数的代码。如果第二个数为0,就会抛出一个字符串类型的异常。catch块会捕获到这个异常,并输出相应的错误信息。
注意:在C++中,异常的类型可以是任何类型,包括内置类型(如int、char等)、标准库类型(如std::string)或自定义类型。你可以根据自己的需要选择合适的异常类型。
另外,C++还提供了更多的异常处理机制,如try-catch-catch,用来捕获多个类型的异常;以及try-catch-finally,用来在无论异常是否发生都执行一些额外的代码等。
总结
以上就是类和对象的全部内容,后续我会带来更多实用的内容,感兴趣的可以点个赞支持一下!
相关文章:

c++类和对象---下
文章目录 一、类的静态成员 1.1.静态成员变量:所有对象共享的成员变量。 1.2.静态成员函数:可以访问静态成员变量,但不能访问非静态成员变量。 二、类的继承 2.1.继承:子类继承父类的成员变量和成员函数。 2.2.多态:基…...

组件中的Props
在项目开发中,在开发某些界面时,我们可以将一些代码封装成组件来简化代码。但是,如果某些情况下组件中的某些属性不是一成不变的(比如一个头像+姓名的组件,每次使用时都需要改变其图像src和姓名字符串),我们就可以使用Props。 我们要使用Props,我们需要先在组件中声明…...

并行服务、远程SSH无法下载conda,报错404
原下载代码无效,报错404 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 使用下面代码下载 wget --user-agent"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12…...

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件
bundle.json 文件内容如下所示: 下面是对各个字段的解释: 1. name: "ohos/demos" - 这是组件或项目的名称,这里表示它属于 OHOS(OpenHarmony OS)生态系统下的一个名为"demos"的组件。 2. descri…...

深度剖析RabbitMQ:从基础组件到管理页面详解
文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…...

usb通过hdc连接鸿蒙next的常用指令
参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…...

【落羽的落羽 C语言篇】文件操作
文章目录 一、文件的概念和分类1. 概念和分类2. 文件名3. 数据文件 三、文件操作1. 文件的打开和关闭1.1 流1.2 文件指针1.3 文件的打开和关闭 2. 文件的顺序读写3. 文件的随机读写4. 文件读取的判定5. 文件缓冲区 一、文件的概念和分类 1. 概念和分类 文件是用来保存数据的。…...

RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)
0.前言 递归!循环神经网络Recurrent Neural Network 循环神经网络(又称递归神经网络,Recurrent Neural Network,RNN)。是一种用于处理序列数据的神经网络结构,具有记忆功能,能够捕捉序列中的时…...

战略与规划方法——深入解析波士顿矩阵(BCG Matrix):分析产品组合的关键工具
深入解析波士顿矩阵(BCG Matrix):分析产品组合的关键工具 在现代商业管理中,合理地分析和管理产品组合对于企业的成功至关重要。波士顿矩阵(BCG Matrix),又称为成长份额矩阵,是一种由波士顿咨询集团(Boston Consulting Group)在20世纪70年代提出的战略工具,用于帮助…...

【记录52】el-table-column 添加fixed属性 滚动条无法滑动
问题: el-table-column 添加fixed属性 滚动条无法滑动 使用element UI组件,用到el-table的el-table-column的fixed属性时,当滚动条长度小于固定列时,滚动条无法通过鼠标去点击滑动操作 原因 fixed是用来固定列的属性,其…...

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

主链和Layer2之间资产转移
主链和Layer2之间资产转移 主链和Layer2之间资产转移是实现Layer2技术的关键环节,以下是资产转移的流程、流行解决方案及原理: 资产从主链转移到Layer2 用户在主链上发起一笔交易,将资产发送到一个特定的智能合约地址,这个合约是主链与Layer2之间的桥梁。智能合约会锁定用…...

麒麟操作系统服务架构保姆级教程(十)rewrite跳转
如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 我们访问一个网页的时候会遇到一些奇形怪状的url地址,想优化一下,看着顺眼一点,或者打开一个短视频软件想摸鱼刷一会视频,在打开界面的时候无意间按到…...

MySQL表的创建实验
创建并使用数据库mydb6_product 。 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec)mysql> use mydb6_product; Database changed 新建employees表。 对于gender,有默认值意味着不为空,在建表时可以选择不写not nul…...

【高可用自动化体系】自动化体系
架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景,需要实现自动化系统目标: 标准化。 流程自助化。 可视化:可观测系统各项指标、包括全链路跟踪。 自动化:ci/cd 自动化部署。 精细化:…...

总结SpringBoot项目中读取resource目录下的文件多种方法
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...

Java-KMP字符串匹配算法
给两个字符串s和t,如何很快的知道s是否包含t(即t是否是s的子串)。暴力的方法,我们依次以s每个位置为头,去匹配t。 public int find(String s, String t) {char[] ss s.toCharArray();char[] tt t.toCharArray();int …...

Vue3使用vue-count-to数字滚动模块报错解决方案
小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下: TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因,排查还得去看源码,所以我们来解决&a…...

【高阶数据结构】线段树加乘(维护序列)详细解释乘与加懒标记
文章目录 1.题目[AHOI2009] 维护序列 2.懒标记处理先加后乘的形式1. 先加后乘的操作 先乘后加的形式2. 先乘后加的操作**乘法操作****加法操作** 懒标记的下传 3.代码 1.题目 题目来源:https://www.luogu.com.cn/problem/P2023 [AHOI2009] 维护序列 题目背景 老师交给小可可…...

replaceState和vue的router.replace删除query参数的区别
使用history.replaceState /*** 替换当前的 history state和url* param {(searchParams:URLSearchParams)>any} cb*/ export const replaceUrlSearch (cb) > {// 获取当前 URLconst url new URL(window.location.href)// 获取 URL 的查询参数const searchParams new …...

[USACO14JAN] Ski Course Rating G
题目大意 滑雪场用一个 N ∗ M N*M N∗M 的整数矩阵表示海拔高度,每个整数表示一个范围在 1 0 9 10^9 109 的高度。每个格子都可以滑到相邻的格子,爱好者们将会在雪场种尽情享受。有些格子被指定为起点,每个起点都要进行评级以帮助爱好者选…...

初步认识 Neo4j 图数据库
Neo4j 是一种高性能的图数据库管理系统,基于图论设计,能够高效地存储和查询复杂的关系数据。以下是关于 Neo4j 的详细介绍: 核心特性 数据模型: Neo4j 使用图数据模型,将数据以节点(Node)、关系…...

Qt中容器 QVector、QList、QSet和QMap 性能与用途比较
表格汇总: 容器存储结构随机访问性能插入/删除性能主要用途QVector连续存储的动态数组 O ( 1 ) O(1) O(1)末尾: O ( 1 ) O(1) O(1),中间: O ( n ) O(n) O(n)频繁随机访问,末尾元素的添加/删除QList优化存储࿰…...

ASP.NET Core - 依赖注入(四)
ASP.NET Core - 依赖注入(四) 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件,实际上一个中间件要正常进行工作,通常需要许多的服务配合进行,而中间件中的服务自然也是通过 Ioc…...
数学用语中 up to 的含义
1. 问题 在数学用语中,常见到“up to”这种用法, 但这种用法与我们常规情况下的用法不同,常令人困惑。 2. “等价关系”说明 已知两个数学对象 a 和 b,以及实数域R, • 当 a 和 b是通过 R 关联的࿰…...

Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南
✅ Spring Boot MyBatis-Flex 配置 ProxySQL 的完整指南 下面是一个详细的教程,指导您如何在 Spring Boot 项目中使用 MyBatis-Flex 配置 ProxySQL 进行 读写分离 和 主从同步 的数据库访问。 🎯 目标 在 Spring Boot 中连接 ProxySQL。使用 MyBatis-…...

WEB攻防-通用漏洞_XSS跨站_权限维持_捆绑钓鱼_浏览器漏洞
目录 XSS的分类 XSS跨站-后台植入Cookie&表单劫持 【例1】:利用beef或xss平台实时监控Cookie等凭据实现权限维持 【例2】:XSS-Flash钓鱼配合MSF捆绑上线 【例3】:XSS-浏览器网马配合MSF访问上线 XSS的分类 反射型(非持久…...

人工智能任务20-利用LSTM和Attention机制相结合模型在交通流量预测中的应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务20-利用LSTM和Attention机制相结合模型在交通流量预测中的应用。交通流量预测在现代城市交通管理中是至关重要的一环,它对优化交通资源分配以及提升道路通行效率有着不可忽视的意义。在实际…...

Day04-后端Web基础——Maven基础
目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.2.1 构建生命周期/阶段(Build lifecycle & phases)2.2.2 项目对象模型 (Project Object Model)2.2.3 依赖管理模…...

Hive SQL必刷练习题:留存率问题
首次登录算作当天新增,第二天也登录了算作一日留存。可以理解为,在10月1号登陆了。在10月2号也登陆了,那这个人就可以算是在1号留存 今日留存率 (今日登录且明天也登录的用户数) / 今日登录的总用户数 * 100% 解决思…...