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类有一个私有成员privateMemberfriendFunction是一个友元函数,它可以访问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被隐藏起来,外部无法直接访问。我们通过公有的成员函数setPrivateVargetPrivateVar来间接操作和获取私有成员变量的值。这样可以保护私有变量的完整性,同时实现数据隐藏和封装。

五、类的重载

       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,用来在无论异常是否发生都执行一些额外的代码等。


总结

以上就是类和对象的全部内容,后续我会带来更多实用的内容,感兴趣的可以点个赞支持一下!

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

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

相关文章

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

代码随想录算法训练营day02| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977. 有序数组的平方 双指针&#xff0c;新数组用k&#xff1b; 由于已经排序&#xff0c;所以比较两侧数据即可&#xff1b; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans(nums.size());int k nums.siz…

Unity 语音转文字 Vosk 离线库

市场有很多语音库&#xff0c;这里介绍Vosk SDK 除了支持untiy外还有原生开发服务器等 目录 安装unity示例demo下载语音训练文件运行demo结尾一键三联 注意事项 有可能debug出来的文本是空的&#xff0c;&#xff08;确保麦克风正常&#xff0c;且索引正确&#xff09;分大…

网络网络层ICMP协议

网络网络层ICMP协议 1. ICMP 协议介绍 ICMP&#xff08;Internet Control Message Protocol&#xff09;是 TCP/IP 协议簇中的网络层控制报文协议。用于在 IP 主机、路由器之间传递控制消息&#xff0c;提供可能有关通信问题的反馈信息。 以及用于网络诊断或调试&#xff08;…

Lianwei 安全周报|2025.1.13

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 美国国土安全部发布《公共部门生成式人工智能部署手…

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…

卷积神经02-CUDA+Pytorch环境安装

卷积神经02-CUDAPytorch环境安装 在使用Python进行pytorch的使用过程中遇到各种各样的版本冲突问题&#xff0c;在此进行记录 0-核心知识脉络 1&#xff09;根据自己电脑的CUDA版本安装对应版本的Pytorch&#xff0c;充分的使用GPU性能2&#xff09;电脑要先安装【CUDA ToolKi…

shell 脚本基本练习

一、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 1. 创建ex1.sh文件 [rootopenEuler mnt]# vim ex1.sh创建如下&#xff1a; 2. 根据题目编写脚本 n"/tmp/siz.log"if [ -f "$n" ] thenc…

CNN-GRU-MATT加入贝叶斯超参数优化,多输入单输出回归模型

CNN-GRU-MATT加入贝叶斯超参数优化&#xff0c;多输入单输出回归模型 目录 CNN-GRU-MATT加入贝叶斯超参数优化&#xff0c;多输入单输出回归模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现贝叶斯优化CNN-GRU融合多头注意力机制多变量回归预测&#xff…

Oracle 分区索引简介

目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引&#xff08;Local Partitioned Index&#xff09;2.2 全局分区索引&#xff08;Global Partitioned Index&#xff09; 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…

​HPM6700——以太网通信lwip_udpecho_freertos_socket

1. 概述 本示例展示在FreeRTOS系统下的UDP回送通讯 PC 通过以太网发送UDP数据帧至MCU&#xff0c;MCU将接收的数据帧回发至PC 2. 硬件设置 使用USB Type-C线缆连接PC USB端口和PWR DEBUG端口 使用以太网线缆连接PC以太网端口和开发板RGMII或RMII端口 3. 工程配置 以太网端…

STC的51单片机LED点灯基于KEIL

前言&#xff1a; 该文源于回答一个朋友的问题&#xff0c;代码为该朋友上传&#xff0c;略作修改&#xff0c;在此说明问题以及解决问题的思路&#xff0c;以减少新手错误。 电路图&#xff1a; 该位朋友未上传电路图&#xff0c;说明如下&#xff1a; stc8g1k08a-sop8控制…

[leetcode]链表基础回顾

一.创建带头节点的链表 #include <iostream> #include <string> #include <algorithm> using namespace std; typedef struct Node { char ch; Node* next; }*LinkList,ListNode; void printLinkList(LinkList& head) { LinkList p head…

Cesium在vue3中的简单使用

目录 一、介绍 二、创建和基础配置 2.1 使用vite创建vue3项目 2.2 安装所需依赖 2.3 修改配置文件vite.config.js 2.4 配置路由文件 2.5 使用路由文件 三、使用cesium原本的进行渲染 3.1 渲染效果 3.2 代码实现 3.2.1 默认效果代码 3.2.2 空白地图效果代码 3.2.3 修改默…

【Uniapp-Vue3】使用defineExpose暴露子组件的属性及方法

如果我们想要让父组件访问到子组件中的变量和方法&#xff0c;就需要使用defineExpose暴露&#xff1a; defineExpose({ 变量 }) 子组件配置 父组件配置 父组件要通过onMounted获取到子组件的DOM 传递多个属性和方法 子组件 父组件

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

1.15寒假作业

web&#xff1a;nss靶场ez_ez_php 打开环境&#xff0c;理解代码 使用个体传参的方法&#xff0c;首先代码会检查file参数的前三个字符是不是php&#xff0c;如果是就输出nice&#xff0c;然后用include函数包含file&#xff0c;绕过不是则输出hacker&#xff0c;如果没有file…

openharmony display

https://github.com/openharmony/drivers_peripheral/blob/master/display/README_zh.md 源码路径&#xff0c;这里是对rk3588的display层适配 device/soc/rockchip/rk3588/hardware/display ├── include └── src ├── display_device &#xff08;代码量最大的部分&…

如何在linux系统上完成定时任务

任务背景 1.需要每小时更新一次github的host端口&#xff1b; 2.需要每天早上七点半准时启动电脑。 更新github的host端口 在/past/to/路径里新建一个host_update.sh文件&#xff0c;运行以下命令获得访问&#xff0c;运行和修改这个文件路径的权限&#xff1a; sudo chmod…

osg中实现模型的大小、颜色、透明度的动态变化

以博饼状模型为对象,实现了模型大小、颜色、透明度的动态变化。 需要注意的是一点: // 创建材质对象osg::ref_ptr<osg::Material> material = new osg::Material;material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0, 1.0, 0.0, 0.5));// 获取模型的…