大话C++:第11篇 类的定义与封装

news/2024/9/21 20:03:34/

1 的定义

在C++中,的定义通常使用class关键字开始,后面紧跟的名称。可以包含数据成员(变量)和成员函数(方法)。

在C++中,可以更加详细地展开,包括数据成员(变量)的声明、成员函数的声明与定义、构造函数、析构函数、内联成员函数、静态成员、友元函数等。定义的语法格式

// ClassName名
class ClassName 
{
public:// 公共构造函数ClassName();                      // 默认构造函数ClassName(const ClassName& other); // 拷贝构造函数~ClassName();                     // 析构函数// 公共成员函数(包括内联函数)void publicFunction();void anotherPublicFunction() const; // const成员函数static void staticPublicFunction(); // 静态成员函数// 公共成员变量(通常不推荐,因为破坏了封装性)int publicVariable;// 友元函数和友元friend void friendFunction(ClassName& obj);friend class FriendClass;protected:// 受保护成员函数void protectedFunction();// 受保护成员变量int protectedVariable;private:// 私有成员函数void privateFunction();// 私有成员变量int privateVariable;// 私有静态成员变量static int privateStaticVariable;// 私有静态成员函数static void privateStaticFunction();// 内定义成员函数(内联函数)inline void inlineFunction() {// 函数体}// 的嵌套class NestedClass {// NestedClass 的定义};
};

其中,

  • 构造函数和析构函数用于对象的初始化和清理。

  • 成员函数可以是公共的、受保护的或私有的。

  • 静态成员(函数和变量)属于本身,而不是的任何特定对象。

  • 友元函数和友元可以访问的私有和保护成员。

  • 内联函数通过在调用点插入函数体的复制品来提高执行速度,适合函数体简短且调用频繁的情况。

  • 嵌套是在另一个内部定义的

的定义通常放在头文件中,的实现放在源码文件cpp。例如,学生的定义与实现

  • student.h学生的定义

// student.h
#ifndef __STUDENT_H__
#define __STUDENT_H__#include <string>class Student 
{
public:// 构造函数Student(const std::string& name, int age, int num);// 析构函数~Student();// 公共成员函数void DisplayInfo() const;// 获取成员变量的函数// 获取姓名inline std::string GetName() const;// 获取年龄inline int GetAge() const;// 获取学号inline int GetNum() const;// 设置成员变量的函数// 设置姓名inline void SetName(const std::string& name);// 设置年龄inline void SetAge(const int age);// 设置学号inline void SetNum(const int num);private:// 私有成员变量std::string _name;	// 姓名int _age;			// 年龄int _num;			// 学号
};#endif // __STUDENT_H__
  • student.cpp学生的实现

// student.cpp
#include "student.h"
#include <iostream>// 构造函数
Student::Student(const std::string& name, int age, int num) : _name(name), _age(age), _num(num)
{std::cout << "Student构造函数" << std::endl;
}// 析构函数(在这个简单的例子中,析构函数是空的)
Student::~Student() 
{std::cout << "Student析构函数" << std::endl;
}// 显示学生信息
void Student::DisplayInfo() const 
{std::cout << "该学生姓名:" << _name << ",年龄:" << _age << ",学号:" << _num << std::endl;
}// 获取学生姓名
std::string Student::GetName() const
{return _name;
}// 获取年龄
int Student::GetAge() const
{return _age;    
}// 获取学号
int Student::GetNum() const
{return _num;
}// 设置姓名
void Student::SetName(const std::string& name)
{_name = name;
} // 设置年龄
void Student::SetAge(const int age)
{_age = age;
}// 设置学号
void Student::SetNum(const int num)
{_num = num;
}
  • main.cpp学生对象的定义及使用

// main.cpp
#include <iostream>
#include "student.h"int main()
{// 创建学生对象Student student("Jack", 25);// 调用成员函数student.DisplayInfo();std::cout << "该学生对象的名字: " << student.GetName() << std::endl;// 修改学生年龄student.SetAge(22);// 再次调用成员函数student.DisplayInfo();return 0;
}

2 封装

C++ 封装面向对象编程中的一个核心概念,它指的是将数据(成员变量)和行为(成员函数)结合在一起的机制,并隐藏内部实现细节,只暴露出一个可以被外界访问和使用的接口。封装可以提高安全性和易于维护,因为它限制了对内部数据的直接访问,只允许通过提供的成员函数来操作数据。

为了实现封装,C++提供了访问修饰符publicprivateprotected)来控制成员的访问权限。访问修饰符、派生及对象具有不同的访问权限,如下表所示:

访问修饰符内部派生内部对象(外部)示例
public可访问可访问可访问成员在的外部和内部都可以被访问。
private可访问不可访问不可访问成员只能在的内部被访问,对象和派生都无法直接访问
protected可访问可访问不可访问成员在的内部和派生中可以被访问,但对象无法直接访问
#include <iostream>class Person 
{
public:void SetName(const std::string& name) { // 公有成员函数_name = name;}std::string GetName() const { // 公有成员函数return _name;}protected:// 受保护成员函数void SetAge(int age) {_age = age;}    protected:// 受保护成员变量int _age; private:// 私有成员变量 std::string _name;    
};int main()
{Person person;// 对象无法直接访问私有成员// person._name = "Alice";// 对象可以访问公有成员函数person.SetName("Jack");std::cout << person.GetName() << std::endl;// 对象无法直接访问受保护成员// person._age = 10; // 错误:受保护成员无法访问return 0;
}

3 访问修饰符

在C++中,访问修饰符主要用于控制成员(包括数据成员和成员函数)的访问权限。这些修饰符主要有四种:publicprotectedprivate和默认的default。其中,

  • public(公共访问修饰符

    • 访问权限:最高级别的访问权限。

    • 作用:允许的任何对象以及任何其他代码访问该的成员(无论是数据成员还是成员函数)。

    • 使用场景:通常用于提供的外部接口,即允许外部代码调用的成员函数或访问的数据成员。

  • protected(受保护的访问修饰符

    • 访问权限:次高级别的访问权限。

    • 作用:允许的对象、派生(子)以及的内部代码访问该的成员。

    • 使用场景:通常用于实现继承时,在基中定义一些需要被子访问但不需要被外界访问的成员。

  • private(私有的访问修饰符

    • 访问权限:最低级别的访问权限。

    • 作用:只允许的内部代码访问该的成员。

    • 使用场景:通常用于隐藏的内部实现细节,确保数据的封装性。

  • default(默认访问修饰符

    • 访问权限:包(package)级别的访问权限。

    • 作用:允许同一包(package)中的其他访问该的成员,但不允许包外的访问。

表格形式总结一下,详见下表:

访问修饰符访问权限内部派生内部的对象同包其他说明
public公有可访问可访问可访问可访问允许外部访问
protected受保护可访问可访问不可访问不可访问允许派生访问
private私有可访问不可访问不可访问不可访问仅允许内部访问

注意:在C++中,没有明确的default关键字来表示包私有访问,这里的default仅用于比,代表内部和同一包内其他可以访问,但对象和包外无法访问。在C++中,如果一个成员没有被显式声明为publicprotectedprivate,那么它的访问级别就是private


http://www.ppmy.cn/news/1528529.html

相关文章

springbootKPL比赛网上售票系统

基于springbootvue实现的KPL比赛网上售票系统 &#xff08;源码L文ppt&#xff09;4-068 4.2 系统结构设计 架构图是系统的体系结构&#xff0c;体系结构是体系结构体系的重要组成部分。KPL比赛网上售票系统的总体结构设计如图4-2所示。 图4-2 系统总体架构图 4.3数据…

TAPD卓越版的全面评测:超强的功能与用户体验优势

在数字化转型浪潮中&#xff0c;项目管理和团队协作工具成为提升企业效能的关键。其中&#xff0c;腾讯研发的TAPD卓越版&#xff0c;作为一款集敏捷项目管理、研发管理和知识管理为一体的全方位协作平台&#xff0c;深受众多企业的青睐。本文将从功能特性、用户体验、以及实际…

vue项目中——如何用echarts实现动态航线图

在Web开发中&#xff0c;数据可视化越来越受到重视。本文将带领大家了解如何在Vue项目中使用ECharts实现动态航线图&#xff0c;如下图&#xff1a;让你的数据展示更加生动有趣。 一、准备工作 1、安装ECharts 在项目根目录下&#xff0c;运行以下命令安装ECharts&#xff1a…

OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia

在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.0) Install macOS on unsupported Macs 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主…

2024年华为杯中国研究生数学建模竞赛E题(高速公路应急车道紧急启用模型)思路

1. 统计四个观测点的交通流参数随时间的变化规律 思路: 从视频数据中提取流量、密度、速度等交通流参数。进行时间序列统计,分析其随时间的变化规律。通过数据可视化,帮助分析流量波动、车速变化等现象。主要步骤: 读取视频数据:利用提供的Python程序读取每个视频文件。提…

传送带异物破损裂缝检测数据集 2300张 带标注voc yolo

传送带异物破损裂缝检测数据集 2300张 带标注voc yolo 2 传送带异物破损裂缝检测数据集 数据集描述 该数据集旨在用于传送带上的异物、破损、裂缝等缺陷的检测任务。数据集包含大量的图像及其对应的标注信息&#xff0c;可用于训练计算机视觉模型&#xff0c;以识别和定位传…

STM32 使用 CubeMX 实现按键外部中断

目录 问题背景知识参考需要改什么注意尽量不要在中断函数使用 循环函数做延时中断函数中延时方法调试 问题 我想实现按钮触发紧急停止类似功能&#xff0c;需要使用按键中断功能。 背景知识 GPIO 点亮 LED。stm32cubemx hal学习记录&#xff1a;GPIO输入输出。STM32—HAL库 …

Java面试篇基础部分-Java语言中的锁有哪些?

Java中的锁主要是用于保障并发线程场景下的数据一致性问题。在多线程编程中为了保证数据一致性&#xff0c;通常需要在使用对象或者方法之前进行加锁操作。也就是说要保证在同一时间内只能由一个线程来对对象进行修改&#xff0c;从而保证了数据一致性&#xff0c;保证了数据安…