C++学习之面向对象和封装

简介: C++学习之面向对象和封装

面向对象的编程思想是谁提出来的?

我猜他的背影是不是这样的…

面向对象编程思想起源于20世纪60年代。尽管有许多早期的贡献者,但可以说是艾伦·凯伊(Alan Kay)最早提出并推广了面向对象的编程思想。

Alan Kay是美国计算机科学家和图灵奖得主。他在1967年左右提出了“对象导向”的概念,并在之后的研究与工作中深化和发展了这一思想。他也是Smalltalk编程语言的设计者,Smalltalk是第一个完全基于面向对象概念的编程语言。

Alan Kay的工作对后来的面向对象编程语言和方法论的发展产生了很大影响,奠定了面向对象编程思想的基础。随后,许多其他的计算机科学家和软件工程师在此基础上进行了进一步的研究、发展和应用。

面向对象的编程思想

不是这个对象,而是那个对象。

这里的对象应该是这个意思:对象是一个模板产出的实体。万物皆有自己的模板和母版;

面向对象编程思想是一种编程范式,强调将问题划分为各个对象,通过对象之间的交互来解决问题。它具有以下几个关键概念:

  1. 封装(Encapsulation):将相关的数据和方法封装在一个对象中,以隐藏内部实现细节,并提供公共接口供其他对象访问。
  2. 继承(Inheritance):通过创建子类来继承父类的属性和方法,实现代码的重用和继承层次的组织,使得代码更具扩展性和灵活性。
  3. 多态(Polymorphism):同一种操作或方法可以应用于不同类型的对象,不同对象对相同的消息做出不同的响应,简化了代码的编写和维护,并提高了代码的可读性。

面向对象编程的优点包括:

  1. 代码可重用性:通过继承和组合多个已存在的类,可以更好地利用已有的代码,提高代码的复用性。
  2. 代码易扩展性:面向对象编程可通过增加新的类和对象,扩展现有功能或新增功能,而无需修改原有代码。
  3. 代码可维护性:面向对象编程通过封装可以隐藏内部实现细节,使得代码更易于理解和维护。
  4. 代码可测试性:面向对象编程的多态特性使得代码更易于进行单元测试和模块测试。

面向对象编程思想被广泛应用于许多编程语言和开发框架中,例如Java、C++、Python等。它能够帮助开发者设计和构建更结构化、模块化、可扩展和可维护的软件系统。

C++中的面向对象

C++是一种支持面向对象编程的编程语言。在C++中,可以使用类(class)和对象(object)来实现面向对象的编程思想。

类(class)是一种用户自定义的数据类型,它封装了一组数据和操作这些数据的方法。类定义了对象的属性和行为,并作为对象的蓝图或模板。C++中的类可以包含成员变量(数据成员)和成员函数(方法)。成员变量用于存储对象的状态,成员函数用于操作和访问对象的状态。

对象(object)是类的一个实例化(实例)。通过创建对象,我们可以使用类中定义的成员变量和成员函数。对象可以具有不同的状态,但共享相同的行为。可以根据需要创建多个对象,并且每个对象都是独立的,拥有自己的数据和方法。

在C++中,类可以使用访问修饰符(public、private、protected)来控制对类成员的访问权限。public成员可以被外部代码访问,private成员只能在类内部访问,protected成员在派生类中可访问。

除了类和对象,C++还支持其他面向对象的特性,例如继承(inheritance)、封装(encapsulation)、多态(polymorphism)等。继承允许从现有的类派生出新的类,以实现代码的重用和扩展。封装将数据和方法封装在类中,以隐藏内部实现细节并提供公共接口。多态允许使用基类的指针或引用来引用派生类的对象,并根据实际对象类型的不同调用适当的方法。

通过面向对象的编程思想,C++提供了一种结构化、模块化和可重用的方式来组织和管理代码,使得软件开发更加灵活、可扩展和可维护。

C++ 中的类和对象

在C++中,类(class)是一种用户自定义的数据类型,用于封装数据和相关操作。对象(object)则是类的一个实例化(实例),通过创建对象,我们可以使用类中定义的成员变量和成员函数。

下面是一个简单的示例来说明C++中的类和对象:

// 定义一个类
class MyClass {
private:
    int myPrivateVariable; // 私有成员变量
public:
    int myPublicVariable; // 公有成员变量
    
    // 构造函数
    MyClass() {
        myPrivateVariable = 0;
        myPublicVariable = 0;
    }
    
    // 成员函数
    void myMethod() {
        // 访问私有成员变量
        myPrivateVariable++;
        
        // 访问公有成员变量
        myPublicVariable++;
    }
};
int main() {
    // 创建对象
    MyClass obj1;
    MyClass obj2;
    
    // 使用对象的成员变量和成员函数
    obj1.myMethod();
    obj2.myPublicVariable = 10;
    
    return 0;
}

在上述示例中,我们首先定义了一个名为 MyClass 的类,在类中包含了私有成员变量 myPrivateVariable 和公有成员变量 myPublicVariable,以及一个成员函数 myMethod()。构造函数 MyClass() 用于初始化成员变量。

main() 函数中,我们创建了两个对象 obj1obj2,这两个对象是 MyClass 类的实例。我们可以使用点运算符 . 来访问对象的成员变量和成员函数,通过调用 obj1.myMethod() 可以使用 obj1 对象的 myMethod() 成员函数。

通过对象,我们可以独立地使用类中定义的成员变量和成员函数。每个对象都具有独立的内存空间来存储成员变量的值,并且可以通过成员函数对它们进行操作。这使得类可以被看作是一个模板,用于创建多个相似但具有不同状态的对象。

通过类和对象的使用,C++支持了面向对象编程范式,提供了更加灵活、模块化和可重用的代码组织方式。

C++类的属性和行为

在C++中,类是一种将属性(数据成员)和行为(成员函数)组合起来的用户自定义数据类型。属性描述了类的状态和特征,而行为描述了类的能力和操作。

属性(数据成员):

  1. 成员变量(Member Variables):也被称为实例变量或属性,用于存储对象的状态信息。它们可以是各种基本数据类型(如整数、浮点数、布尔值等)或者自定义数据类型(如另一个类的对象)。
    示例:
class MyClass {
private:
    int myPrivateVariable; // 私有成员变量
public:
    int myPublicVariable; // 公有成员变量
};
  1. 在上述示例中,myPrivateVariable 是私有成员变量,只能在类内部访问。myPublicVariable 是公有成员变量,可以在类内外的代码被访问。

行为(成员函数):

  1. 成员函数(Member Functions):也被称为方法,定义了类的行为和操作。它们可以访问和操作类的成员变量,并且可以执行其他代码逻辑。
    示例:
class MyClass {
public:
    void myMethod() {
        // 执行操作
    }
};
  1. 在上述示例中,myMethod() 是一个公有成员函数,用于执行类的某种操作。

通过类的属性和行为的结合,可以表示现实世界中的对象,将相关的数据和行为组织在一起,实现封装和抽象。类的属性描述了对象的状态,而类的行为描述了对象可以做什么。通过创建对象并调用对象的成员函数,可以使用类的属性和行为来完成特定的任务。

需要注意的是,类的属性和行为可以根据具体情况使用访问修饰符 privatepublicprotected 来控制其访问权限。私有成员只能在类内访问,公有成员可以在类内外访问,受保护的成员可以在派生类中访问。

使用类的属性和行为,可以通过面向对象编程思想构建更加模块化、可扩展和可维护的程序。

C++封装的意义

封装是面向对象编程中的一个重要概念,它指的是将数据和操作数据的方法打包在一起形成一个类,对外部代码隐藏内部实现细节,只暴露必要的接口。

C++中封装的意义包括:

  1. 数据隐藏:封装可以将类的成员属性设置为私有(private),防止外部代码直接访问和修改类的内部数据。这样可以确保数据的安全性和一致性。
  2. 接口统一:通过封装,类可以提供公共的接口(公有成员函数),规定了外部代码与类进行交互的方式。这样可以减少外部代码与类的耦合度,减少了外部代码对内部实现的依赖。
  3. 简化使用:封装使得类的使用更加简单,外部代码只需要知道如何使用类的接口,对于类的内部实现细节不需要关心。这样可以降低学习和使用类的难度,提高开发效率。
  4. 提高安全性:封装可以提高数据的封锁性和可控性,通过公有成员函数对成员属性进行访问和修改的控制,限制了对数据的非法操作和错误使用。这样可以减少潜在的错误和数据异常情况,提高程序的安全性和稳定性。
  5. 便于维护和扩展:封装可以隐藏类的内部实现细节,使得类的实现独立于外部代码,方便对类的内部实现进行修改和优化,而不会对外部代码产生影响。同时,封装也提供了对类的继承和多态等特性的支持,使得类的扩展更加灵活和可维护。

总体来说,封装是面向对象编程中一项重要的原则,它通过隐藏内部实现细节、提供统一的接口、保护数据安全等手段,提高了代码的可维护性、可扩展性和安全性,同时降低了代码的复杂性和耦合度,是构建健壮、可靠的软件系统的重要手段之一。

C++类的属性和方法的访问权限

在C++中,类的属性和方法可以使用访问修饰符(access specifiers)来控制其访问权限。C++提供了三种常见的访问修饰符:public、private和protected。

  1. public(公有):
  • 公有属性和方法可以在类的内部和外部的任何地方被访问。
  • 从类的外部代码可以使用对象来访问公有成员属性和调用公有成员方法。
  • 公有成员可以被派生类继承。
  1. private(私有):
  • 私有属性和方法只能在类的内部被访问。
  • 外部代码无法直接访问或修改私有成员属性,但可以通过公有成员函数间接地访问和修改私有成员属性。
  • 私有成员不会被派生类继承。
  1. protected(受保护):
  • 受保护属性和方法可以在类的内部被访问,也可以在派生类中被访问。
  • 外部代码无法直接访问或修改受保护成员属性,但可以通过公有/受保护成员函数间接地访问和修改受保护成员属性。
  • 受保护成员会被派生类继承,但对于派生类的外部代码来说,它们仍然是私有的。

使用访问修饰符的示例代码如下:

class MyClass {
public:
    int publicVar; // 公有成员属性
    void publicMethod() {
        // 公有成员方法
    }
private:
    int privateVar; // 私有成员属性
    void privateMethod() {
        // 私有成员方法
    }
protected:
    int protectedVar; //受保护成员属性
    void protectedMethod() {
        // 受保护成员方法
    }
};
int main() {
    MyClass obj;
    obj.publicVar; // 可以访问公有属性
    obj.publicMethod(); // 可以调用公有方法
    // obj.privateVar; // 错误,无法访问私有属性
    // obj.privateMethod(); // 错误,无法调用私有方法
    // obj.protectedVar; // 错误,无法访问受保护属性
    // obj.protectedMethod(); // 错误,无法调用受保护方法
    return 0;
}

请注意,以上示例中的访问权限是针对类对象来说的。对于通过指针或引用访问类对象的情况,访问权限仍然适用。

合理使用访问修饰符可以实现封装性和数据安全性,并确保类的属性和方法被正确访问和使用。

C++类和结构的区别

结构的本质还是数据集合体;

类的本质是一个对象模板;

C++成员属性设为私有的情况

将C++类的成员属性设为私有(private)有多种情况的应用。私有成员属性只能在类的内部访问,外部代码无法直接访问或修改私有成员属性。

下面是一些常见的情况,适合将成员属性设为私有:

  1. 封装数据:私有成员属性可以用于封装类的内部数据,防止外部代码对数据的直接访问和修改。这样可以确保数据的安全性和一致性。
class MyClass {
private:
    int myPrivateVariable; // 私有成员属性
public:
    // 公有成员函数可以间接访问或修改私有成员属性
    void setPrivateVariable(int value) {
        myPrivateVariable = value;
    }
    int getPrivateVariable() {
        return myPrivateVariable;
    }
};
  1. 在上述示例中,myPrivateVariable 是私有成员属性,外部代码无法直接访问它。但通过公有成员函数 setPrivateVariable()getPrivateVariable(),可以间接地设置和获取私有成员属性的值。
  2. 实现封装性:私有成员属性可以隐藏类内部的实现细节,只暴露必要的接口给外部代码使用。这样可以提高代码的可维护性和可复用性,同时避免不受控制地修改成员属性。
class BankAccount {
private:
    double balance; // 私有成员属性
public:
    // 提供公有成员函数实现对余额的操作
    void deposit(double amount) {
        balance += amount;
    }
    void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
        } else {
            // 处理取款金额超过余额的情况
        }
    }
    double getBalance() {
        return balance;
    }
};
  1. 在上述示例中,balance 是私有成员属性,只能通过公有成员函数 deposit()withdraw()getBalance() 来操作和获取余额。这样可以确保余额的安全性和一致性,并控制对余额的访问方式。
  2. 版本升级:私有成员属性可以在类的实现中灵活地更改和调整,而不会影响使用该类的外部代码。这使得类在版本升级时能够更方便地进行修改和扩展。
class APIConnection {
private:
    // 原始实现使用的私有成员属性
    std::string apiKey;
    std::string apiSecret;
public:
    // 更新版本后使用的新的私有成员属性
    std::string accessToken;
    std::string refreshToken;
    // 公有成员函数和其他相关代码
};
  1. 在上述示例中,随着API连接类版本的升级,原始实现中的私有成员属性 apiKeyapiSecret 可能被新的版本中的 accessTokenrefreshToken 替代。这样可以平滑地进行版本迁移和功能扩展,而不会直接影响使用该类的外部代码。

通过设定私有成员属性,C++提供了封装性和数据安全性,同时允许类通过公有成员函数来间接访问和修改私有成员属性。这样可以控制对类内部数据的外部访问方式,提高代码的可靠性和安全性。

封装只是开始

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步


相关文章
|
8月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
169 19
|
8月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
134 16
|
9月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
191 4
2023/11/10学习记录-C/C++对称分组加密DES
|
8月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
205 13
|
8月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
180 5
|
8月前
|
存储 C++
【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】
本任务要求使用C++读取二进制文件并在每行前添加行号后输出到控制台。主要内容包括: 1. **任务描述**:用二进制方式打开指定文件,为每一行添加行号并输出。 2. **相关知识**: - 流类库中常用的类及其成员函数(如`iostream`、`fstream`等)。 - 标准输入输出及格式控制(如`cin`、`cout`和`iomanip`中的格式化函数)。 - 文件的应用方法(文本文件和二进制文件的读写操作)。 3. **编程要求**:编写程序,通过命令行参数传递文件名,使用`getline`读取数据并用`cout`输出带行号的内容。 4. **实验步骤**:参考实验指
199 5
|
8月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
132 5
|
8月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
131 4
|
8月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
177 3
|
11月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
356 6