当前位置: 首页 > news >正文

C++简明教程(10)(初识类)

类的教程


C++ 类的完整教程

C++ 中,类(class)是面向对象编程的核心概念,用于定义对象的属性(数据成员)和行为(成员函数)。本教程将带你从零开始,循序渐进地学习如何定义和使用类。


1. 类的基本定义

类类似于结构体(struct),但功能更加强大。以下是类的基本定义方法:

#include <iostream>
using namespace std;class Person {
public: // 公有访问修饰符string name; // 数据成员int age;void introduce() { // 成员函数cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;}
};

注意事项

  1. 类中可以包含数据成员和成员函数。
  2. class 定义的成员默认是 private,而 struct 定义的成员默认是 public

2. 类和对象

类是模板或蓝图,而对象是基于类创建的具体实例。

int main() {Person p; // 创建对象p.name = "Alice";p.age = 25;p.introduce(); // 调用成员函数return 0;
}

运行结果:

Hello, my name is Alice and I am 25 years old.

3. 访问修饰符:public, private, protected

访问修饰符控制类成员的访问权限:

  • public: 公有成员,可被外部访问。
  • private: 私有成员,仅类内部可以访问。
  • protected: 保护成员,通常与继承相关,本教程中不讨论。

示例:

class Person {
private:string secret; // 私有成员public:string name; // 公有成员void setSecret(string s) { // 公有函数secret = s;}void showSecret() {cout << "Secret: " << secret << endl;}
};int main() {Person p;p.name = "Bob";p.setSecret("I love coding."); // 使用公有函数访问私有成员p.showSecret();return 0;
}

运行结果:

Secret: I love coding.

注意事项

  1. 尽量将数据成员声明为 private,通过公有函数访问。
  2. 保护数据成员可以提高代码的安全性。

4. 构造函数

构造函数用于在创建对象时初始化数据成员。它的名字与类名相同,无返回值。

示例代码

class Person {
public:string name;int age;// 构造函数Person(string n, int a) {name = n;age = a;}void introduce() {cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;}
};int main() {Person p("Charlie", 30); // 调用构造函数p.introduce();return 0;
}

运行结果:

Hello, my name is Charlie and I am 30 years old.

注意事项

  1. 构造函数没有返回值。
  2. 构造函数可以有多个参数。

5. 多种构造函数(构造函数重载)

可以定义多个构造函数以适应不同的初始化需求。

class Person {
public:string name;int age;// 无参构造函数Person() {name = "Unknown";age = 0;}// 带参构造函数Person(string n, int a) {name = n;age = a;}void introduce() {cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;}
};int main() {Person p1; // 调用无参构造函数Person p2("David", 40); // 调用带参构造函数p1.introduce();p2.introduce();return 0;
}

运行结果:

Hello, my name is Unknown and I am 0 years old.
Hello, my name is David and I am 40 years old.

6. 析构函数

析构函数用于销毁对象时执行清理操作。名字为 ~类名(),无参数和返回值。

class Person {
public:Person() {cout << "Constructor called." << endl;}~Person() {cout << "Destructor called." << endl;}
};int main() {Person p;return 0;
}

运行结果:

Constructor called.
Destructor called.

注意事项

  1. 析构函数在对象生命周期结束时自动调用。
  2. 通常用于释放资源(如动态内存、文件等)。

7. 拷贝构造函数

拷贝构造函数用于用一个对象初始化另一个对象。

class Person {
public:string name;int age;// 构造函数Person(string n, int a) : name(n), age(a) {}// 拷贝构造函数Person(const Person &p) {name = p.name;age = p.age;cout << "Copy constructor called." << endl;}void introduce() {cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;}
};int main() {Person p1("Eve", 35);Person p2 = p1; // 调用拷贝构造函数p2.introduce();return 0;
}

运行结果:

Copy constructor called.
Hello, my name is Eve and I am 35 years old.

好的,我们继续完成本教程!


8. 运算符重载

运算符重载允许我们为类定义如何使用运算符(如 =< 等)。接下来我们将学习如何重载等号(=)和小于号(<)。

重载等号运算符(=

等号运算符通常用于赋值操作,我们需要重载它以确保正确复制对象的内容。

class Person {
private:string name;int age;public:// 构造函数Person(string n, int a) : name(n), age(a) {}// 重载等号运算符Person& operator=(const Person& p) {if (this == &p) {return *this; // 检查是否是自我赋值}name = p.name;age = p.age;cout << "Assignment operator called." << endl;return *this;}void introduce() {cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;}
};int main() {Person p1("Alice", 25);Person p2("Bob", 30);p2 = p1; // 调用赋值运算符p2.introduce();return 0;
}

运行结果:

Assignment operator called.
Hello, my name is Alice and I am 25 years old.

重载小于号运算符(<

通常用于比较对象。例如,比较两个对象的某个属性。

class Person {
public:string name;int age;// 构造函数Person(string n, int a) : name(n), age(a) {}// 重载小于号运算符bool operator<(const Person& p) const {return age < p.age; // 按年龄比较}
};int main() {Person p1("Alice", 25);Person p2("Bob", 30);if (p1 < p2) {cout << p1.name << " is younger than " << p2.name << "." << endl;} else {cout << p1.name << " is not younger than " << p2.name << "." << endl;}return 0;
}

运行结果:

Alice is younger than Bob.

9. 成员函数

成员函数是定义在类中的函数,用于操作数据成员。分为 公有成员函数私有成员函数

公有成员函数

公有成员函数可以被类外部调用。

class Person {
public:string name;void introduce() { // 公有成员函数cout << "My name is " << name << "." << endl;}
};

私有成员函数

私有成员函数只能在类内部调用。

class Person {
private:void privateFunction() {cout << "This is a private function." << endl;}public:void callPrivateFunction() {privateFunction(); // 内部调用私有函数}
};int main() {Person p;p.callPrivateFunction();return 0;
}

运行结果:

This is a private function.

10. 静态函数与静态数据成员

静态数据成员

静态数据成员是类的所有对象共享的变量。

class Person {
public:static int population; // 静态数据成员Person() {population++;}~Person() {population--;}static void showPopulation() { // 静态成员函数cout << "Current population: " << population << endl;}
};// 静态数据成员初始化
int Person::population = 0;int main() {Person::showPopulation(); // 访问静态成员函数Person p1, p2;Person::showPopulation();return 0;
}

运行结果:

Current population: 0
Current population: 2

注意事项

  1. 静态数据成员需要在类外初始化。
  2. 静态成员函数只能访问静态数据成员。

11. this 指针

this 指针指向当前对象,用于区分成员变量与形参重名的情况。

class Person {
private:string name;public:void setName(string name) {this->name = name; // 使用 this 指针区分成员变量和参数}void introduce() {cout << "My name is " << this->name << "." << endl;}
};int main() {Person p;p.setName("Alice");p.introduce();return 0;
}

运行结果:

My name is Alice.

12. 总结与注意事项

  1. 类是一种封装机制,通过访问修饰符控制成员访问权限。
  2. 构造函数和析构函数用于管理对象生命周期,特别是动态分配资源时。
  3. 运算符重载使对象更具灵活性,但需要小心处理自我赋值。
  4. 静态成员共享数据,对整个类有效。
  5. this 指针是成员函数内部隐含的指针,指向当前对象。

相关文章:

C++简明教程(10)(初识类)

类的教程 C 类的完整教程 C 中&#xff0c;类&#xff08;class&#xff09;是面向对象编程的核心概念&#xff0c;用于定义对象的属性&#xff08;数据成员&#xff09;和行为&#xff08;成员函数&#xff09;。本教程将带你从零开始&#xff0c;循序渐进地学习如何定义和使…...

光谱相机的工作原理

光谱相机的工作原理主要基于不同物质对不同波长光的吸收、反射和透射特性存在差异&#xff0c;以下是其具体工作过程&#xff1a; 一、光的收集 目标物体在光源照射下&#xff0c;其表面会对光产生吸收、反射和透射等相互作用。光谱相机的光学系统&#xff08;如透镜、反射镜…...

【Linux进程】基于管道实现进程池

目录 前言 1. 进程池 1.1 基本结构&#xff1a; 1.2. 池化技术 1.3. 思路分析 1.4. 代码实现 总结 前言 上篇文章介绍了管道及其使用&#xff0c;本文在管道的基础上&#xff0c;通过匿名管道来实现一个进程池&#xff1b; 1. 进程池 父进程创建一组子进程&#xff0c;子进…...

软件测试之单元测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、何为单测 测试有黑盒测试和白盒测试之分&#xff0c;黑盒测试顾名思义就是我们不了解盒子的内部结构&#xff0c;我们通过文档或者对该功能的理解&#xff0c…...

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…...

007-spring-bean的相关配置(重要)

spring-bean的相关配置...

【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现

引言 排序算法是计算机科学中的基础问题&#xff0c;而交换排序作为其中一类经典的排序方法&#xff0c;因其简单直观的思想和易于实现的特点&#xff0c;在初学者中广受欢迎。交换排序的核心思想是通过不断交换相邻元素来达到排序的目的。本文将深入探讨两种典型的交换排序算…...

合并 Python 中的字典

合并 Python 中的字典 如何在 Python 中合并字典&#xff1f; 这取决于你对“合并”一词的具体定义。 在 Python 中使用 | 操作符合并字典 首先&#xff0c;让我们讨论合并字典的最简单方法&#xff0c;这通常已经足够满足你的需求。 以下是两个字典&#xff1a; >>…...

使用Python实现自动化文档生成工具:提升文档编写效率的利器

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

uniapp使用live-pusher实现模拟人脸识别效果

需求&#xff1a; 1、前端实现模拟用户人脸识别&#xff0c;识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口&#xff0c;验证前端传递的人脸是否存在&#xff0c;把认证结果反馈给前端。 3、前端根据服务端返回的状态&#xff0c;显示在…...

【JavaSE】【网络原理】初识网络

目录 一、网络互联二、局域网与广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 网络协议3.4 五元组 四、协议分层4.1 OSI七层网络模型4.2 TCP/IP五层(四层)网络模型4.3 网络设备 五、网络数据通信基本流程。5.1 封装和分用5.2 简述过程 一、网络互联 网络互联&#xff1a; 网…...

鸿蒙之路的坑

1、系统 Windows 10 家庭版不可用模拟器 对应的解决方案【坑】 升级系统版本 直接更改密钥可自动升级系统 密钥找对应系统的&#xff08;例&#xff1a;windows 10专业版&#xff09; 升级完之后要激活 坑1、升级完后事先创建好的模拟器还是无法启动 解决&#xff1a;删除模拟…...

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…...

Ubuntu环境 nginx.conf详解(二)

1、nginx.conf 结构详解&#xff1a; http 块&#xff1a;用于配置 HTTP 服务器的相关设置&#xff0c;包括处理 HTTP 和 HTTPS。 stream 块&#xff1a;用于配置 TCP/UDP 代理服务器&#xff0c;适用于需要进行四层负载均衡的情况。 ... # 全局块 events {...} …...

shardingsphere分库分表项目实践4-sql解析sql改写

为什么要sql解析重写&#xff1f; 如果我们的系统数据库实现了分表&#xff0c;那么我们的sql中表名需要根据参数动态确定&#xff0c;那么代码怎么写&#xff1f; 方案1&#xff1a; 自己手动拼接&#xff0c; 比如 update t_user_${suffix} , ${suffix} 作为一个变量传递…...

mysql数据库中,一棵3层的B+树,假如数据节点大小是1k,那这棵B+可以存多少条记录(2100万的由来)

在MySQL中&#xff0c;3层的B树可以存储的数据量取决于多个因素&#xff0c;包括页大小、每行数据的大小以及索引项的大小。以下是一个详细的计算过程&#xff1a; 一、假设条件 页大小&#xff1a;在InnoDB存储引擎中&#xff0c;B树的每个节点&#xff08;页&#xff09;大…...

Git 操作全解:从基础命令到高级操作的实用指南

文章目录 1.基本命令1.初始化仓库2.克隆远程仓库3.查看当前仓库状态4.查看提交日志5.添加文件到暂存区6.提交更改7.查看仓库的配置信息 2.分支操作1.查看所有分支2.创建新分支3.切换名称4.创建并切换到新分支5.删除分支6.查看当前分支 3.合并分支1.合并分支2.解决合并冲突 4.远…...

华院计算参与项目再次被《新闻联播》报道

12月17日&#xff0c;央视《新闻联播》播出我国推进乡村振兴取得积极进展。其中&#xff0c;华院计算参与的江西省防止返贫监测帮扶大数据系统被报道&#xff0c;该系统实现了由原来的“人找人”向“数据找人”的转变&#xff0c;有效提升监测帮扶及时性和有效性&#xff0c;守…...

从一次线上故障聊聊接口自动化测试

1、背景 3月初&#xff0c;运营同事配置了个还未上线的页面到网站首页 banner&#xff0c;导致用户点了报错。尽管这次很明确是运营人为操作失误引起的故障&#xff0c;但过往此类核心页面的访问异常&#xff0c;我们已不是第一次遇见。 从平台整体利益触发&#xff0c;我们各…...

Element-ui的使用教程 基于HBuilder X

文章目录 1.Element-ui简介2.使用HBuilderX 创建一个基于Vue3的项目 &#xff08;由于是使用的基于Vue3的Element-ui&#xff09;3.安装element-ui4.在项目里完全引用element-ui5.引用组件6.运行项目 1.Element-ui简介 Element&#xff0c;一套为开发者、设计师和产品经理准备…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...