第二弹:面向对象编程中的类与对象

文章目录

  • 面向对象编程中的类与对象
    • 1. 类与对象的定义
      • 1.1 类和对象的概念
      • 1.2 类的基本定义
    • 2. 类的封装
      • 2.1 类的封装语法
      • 2.2 类成员访问权限
      • 2.3 `struct`和`class`的区别
      • 2.4 类封装与成员函数定义分离
    • 3. 类对象的创建与销毁
      • 3.1 静态与动态对象的创建
      • 3.2 对象的销毁
    • 4. 构造函数和析构函数
      • 4.1 构造函数
      • 4.2 析构函数
      • 4.3 拷贝构造函数
      • 4.4 移动构造函数
    • 5. 类成员是类对象
      • 5.1 初始化列表
      • 5.2 组合类的构造与析构
    • 6. 类的特殊成员
      • 6.1 类成员的存储
      • 6.2 this指针
      • 6.3 static成员
      • 6.4 const修饰类
      • 实践练习:复数类的实现
    • 总结


面向对象编程中的类与对象

在现代编程中,面向对象(Object-Oriented Programming, OOP)已成为一种常用且强大的编程范式。OOP的核心思想包括封装、继承和多态,其中类和对象是基础概念。本文将深入探讨类与对象的定义、封装、创建与销毁、以及相关的特殊成员与功能。

1. 类与对象的定义

1.1 类和对象的概念

在OOP中,对象是现实世界中一个具体的实体,它具有属性和行为。我们可以通过编程语言将现实世界中的对象抽象为计算机中的类。类定义了对象的属性和行为,而对象则是类的一个实例化。

  • 对象:对象是一个具体存在的实体,具有属性(如颜色、大小等)和行为(如运动、停止等)。
  • :类是对对象的抽象,通过封装对象的属性和行为,使得我们可以在计算机中实现这些对象。

1.2 类的基本定义

类是对一类对象的抽象描述,它包含成员变量(对象的属性)和成员函数(对象的行为)。在C++中,类的定义可以使用classstruct关键字进行。

class 类名称 {// 类对象的属性和行为成员的存储列表
};

其中,class是用于封装类的关键字,它封装了类的属性(成员变量)和行为(成员函数)。类中的属性可以是私有的或公开的,而行为则可以根据需要设置访问权限。

2. 类的封装

封装是OOP的三大特性之一,指的是将数据和操作封装在类内部,控制外部对类成员的访问,以保证数据的安全性和完整性。

2.1 类的封装语法

类的封装语法非常简单,类的属性和行为通过成员变量和成员函数体现。

class 类名称 {// 成员变量与成员函数
};

2.2 类成员访问权限

C++提供了三种访问权限修饰符:

  • private:只能在类内部访问,外部不能直接访问。
  • protected:可以在当前类和派生类中访问。
  • public:可以在任何位置访问,包括类外部。
    -

使用这些访问控制修饰符,可以控制哪些属性或行为对外界是可见的。

2.3 structclass的区别

  • 在C++中,structclass本质上都是用于定义类的关键字,但它们的默认访问权限不同:
    • struct的成员默认是public权限。
    • class的成员默认是private权限。

因此,在大多数C++项目中,struct通常用于简单的数据结构,而class则用于复杂的对象封装。

2.4 类封装与成员函数定义分离

在C++中,类的成员函数可以在类外部定义。这不仅可以使代码结构更加清晰,还可以将类的声明与实现分离。

class 类名称 {void 函数名();
};void 类名称::函数名() {// 函数体
}

这种定义与实现的分离可以在大型项目中提高代码的可维护性。

3. 类对象的创建与销毁

3.1 静态与动态对象的创建

C++中的对象可以通过两种方式创建:静态创建和动态创建。

  • 静态创建:在栈上分配内存,生命周期由函数的作用域控制。
  • 动态创建:在堆上分配内存,生命周期由程序员手动控制,必须在适当的时候释放内存。
class Demo {int val;void Print();
};Demo obj; // 静态创建
Demo* p = new Demo(); // 动态创建
delete p; // 动态销毁

3.2 对象的销毁

当对象不再需要时,必须释放其占用的资源。对于静态对象,销毁时自动调用析构函数;对于动态对象,必须使用delete显式销毁。

4. 构造函数和析构函数

4.1 构造函数

构造函数是对象在创建时自动调用的特殊函数,用于初始化对象的成员变量。它可以有参数,也可以是无参的。构造函数是可重载的,即可以定义多个构造函数来实现不同的初始化方式。

class Demo {Demo(); // 无参构造函数Demo(int val); // 有参构造函数
};

4.2 析构函数

析构函数是对象销毁时自动调用的特殊函数,用于释放对象所占用的资源。它没有参数,也不能被重载。

class Demo {~Demo();
};

4.3 拷贝构造函数

当使用一个对象来初始化另一个对象时,拷贝构造函数会被调用。默认的拷贝构造函数是浅拷贝,但可以自定义深拷贝来避免指针成员的内存管理问题。

class Demo {Demo(const Demo &obj); // 拷贝构造函数
};

4.4 移动构造函数

C++11引入了移动构造函数,以提高对象转移时的效率。移动构造函数通过转移资源而不是拷贝资源来避免不必要的性能开销。

class Demo {Demo(Demo &&obj); // 移动构造函数
};

5. 类成员是类对象

在某些场景中,类的成员变量可以是其他类的对象。这种关系被称为组合关系,用于表示“has-a”关系。

5.1 初始化列表

初始化列表是一种高效的初始化方式,常用于类的成员对象或const成员的初始化。

class Demo {Demo(int a, int b) : a(a), b(b) {}
};

5.2 组合类的构造与析构

在组合类的构造函数中,成员对象的构造函数首先被调用,随后是组合类的构造函数;在析构函数中,情况则相反。

class A {A(int x);
};
class B {B(int y);
};
class Demo {A a_obj;B b_obj;Demo(int x, int y) : a_obj(x), b_obj(y) {}
};

6. 类的特殊成员

6.1 类成员的存储

类的成员变量在对象创建时分配存储空间,而成员函数则在类的外部共享代码块,多个对象共享同一份成员函数的代码。

6.2 this指针

this指针是C++中特殊的指针,指向当前对象。通过this指针,类的成员函数可以访问调用该函数的对象。

class Demo {void setVal(int val) {this->val = val;}
};

6.3 static成员

static成员属于整个类,而非某个具体的对象。静态成员变量在类外部定义,而静态成员函数可以在不实例化对象的情况下访问。

class Stu {static int Class;
};int Stu::Class;

静态成员函数只能访问静态成员,且不需要通过对象调用。

class Stu {static void Print();
};
Stu::Print();

6.4 const修饰类

  • const修饰的成员变量在初始化后不能被修改;
  • const修饰的成员函数不能修改对象的状态;
  • const修饰的类对象只能调用const成员函数。
class Demo {int getVal() const; // const成员函数
};
const Demo obj;
obj.getVal(); // const对象只能调用const函数

实践练习:复数类的实现

我们可以通过定义一个复数类来练习面向对象编程中的类和对象的概念。该类应支持复数的初始化、输出以及加减乘除运算。

class Complex {int real, imag;
public:Complex(int r, int i) : real(r), imag(i) {}void display() {cout << real << " + " << imag << "i" << endl;}Complex add(Complex c) {return Complex(real + c.real, imag + c.imag);}
};

通过这一示例,我们可以更好地理解类和对象的使用以及成员函数的封装与实现。

总结

面向对象编程中的类和对象是程序设计的基石,类通过封装实现对对象的抽象,而对象是类的实例。通过对类的成员、构造

函数、析构函数、以及特殊成员的深入理解,我们可以高效地进行面向对象的编程,编写出简洁、可维护性强的代码。在实际项目中,熟练掌握类和对象的使用有助于我们解决复杂的工程问题。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析 ConcurrentHashMap:从 JDK 1.7 到 JDK 1.8

✨探索Java基础 ConcurrentHashMap✨ 引言 ConcurrentHashMap 是 Java 中一个线程安全的高效 Map 集合。它在多线程环境下提供了高性能的数据访问和修改能力。本文将详细探讨 ConcurrentHashMap 在 JDK 1.7 和 JDK 1.8 中的不同实现方式&#xff0c;以及它们各自的优缺点。 …

(笔记)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第2关Python 基础知识

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1mS421X7h4/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp3/docs/L0/Python 关…

如何使用ssm实现基于JSP的高校听课评价系统

TOC ssm753基于JSP的高校听课评价系统jsp 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时…

【LeetCode: 1870. 准时到达的列车最小时速 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

各种饺子的做法

【羊肉馅水饺】 材料:羊肉1000克、洋葱2个、香油3汤匙、盐适量、姜2片、料酒1汤匙、白胡椒粉、十三香1茶匙、 做法&#xff1a; 1.把羊肉剁成肉馅&#xff0c;羊肉选用带一些肥肉的&#xff0c;味道比较香&#xff0c;如果羊肉比较瘦&#xff0c;可以放一些猪的肥肉一起剁成馅…

电商店铺多开自动回复软件

在电商平台上开设多个店铺&#xff0c;即店铺多开&#xff0c;是一种扩展业务和增加销售额的策略。然而&#xff0c;店铺多开需要谨慎规划和执行&#xff0c;以避免违反平台规定和管理上的混乱。以下是如何实现店铺多开的详细步骤和注意事项。 1. 确定多开目标 在决定多开店铺…

4个顶级的大模型推理引擎

LLM 在文本生成应用中表现出色&#xff0c;例如具有高理解度和流畅度的聊天和代码完成模型。然而&#xff0c;它们的庞大规模也给推理带来了挑战。基本推理速度很慢&#xff0c;因为 LLM 会逐个生成文本标记&#xff0c;需要对每个下一个标记进行重复调用。随着输入序列的增长&…

【CKA】七、七层负载-Ingress应用

7、七层负载-Ingress应用 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 1、要先查到集群中使用的ingressclass 2、编写yaml 我考的题只是把 hi 服务换成了 hello&#xff0c;其他都一模一样 3. 官网地址&#xff1a; https://kubernetes.io/zh-cn/docs/concepts/serv…

Pytorch实现RNN实验

一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络&#xff08;RNN&#xff09;的基本原理&#xff1a;通过构建一个基于RNN的诗歌生成模型&#xff0c;学会RNN是如何处理序列数据的&#xff0c;以及如何在…

LabVIEW提高开发效率技巧----快速实现原型和测试

在LabVIEW开发中&#xff0c;DAQ助手&#xff08;DAQ Assistant&#xff09;和Express VI为快速构建原型和测试功能提供了极大的便利&#xff0c;特别适合于简单系统的开发和早期验证阶段。 DAQ助手&#xff1a;是一种可视化配置工具&#xff0c;通过图形界面轻松设置和管理数据…

HISTCITE分析进阶

不可否认histcite是一个很好的文献分析的工具,他能很好的找到最重要的那几篇文章,同时也能找到研究的发文趋势、研究机构和著名的研究学者等。但是它是一个很老的软件,因而很多东西都没能跟上下载的分析。我在使用过程中,尝试做一些改变使其更好用,同时也做一些记录。 1.…

C语言数组和指针笔试题(四)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️…

vulnhub-Matrix 1靶机

vulnhub&#xff1a;https://www.vulnhub.com/entry/matrix-1,259/ 导入靶机&#xff0c;扫描IP 靶机在192.168.81.6&#xff0c;扫描端口 存在三个端口&#xff0c;有两个都是http服务&#xff0c;访问 80端口的网页没什么信息&#xff0c;31337的网页元素里有注释 ZWNobyAi…

加密与安全_HTOP 一次性密码生成算法

文章目录 HOTP 的基础原理HOTP 的工作流程HOTP 的应用场景HOTP 的安全性安全性增强措施Code生成HOTP可配置项校验HOTP可拓展功能计数器&#xff08;counter&#xff09;计数器在客户端和服务端的作用计数器的同步机制客户端和服务端中的计数器表现服务端如何处理计数器不同步计…

dubbo微服务

一.启动nacos和redis 1.虚拟机查看是否开启nacos和redis docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps二.创建三个idea的maven项目 1.第一个项目dubboapidemo 2.1.1向pom.xml里添加依赖 …

MES(软件)系统是什么?MES系统为何如此重要呢?

一、MES系统的定义与功能 MES系统是一套面向制造企业车间执行层的生产信息化管理系统&#xff0c;它涵盖了多种功能模块&#xff0c;包括但不限于&#xff1a; 订单管理&#xff1a;处理客户订单&#xff0c;确保生产需求与市场需求相匹配。生产调度&#xff1a;根据订单和生…

快乐数——双指针算法

题目链接 快乐数https://leetcode.cn/problems/happy-number/description/ 题目要求 样例 算法原理 根据上述的题目分析&#xff0c;我们可以知道&#xff0c;当重复执行 x 的时候&#xff0c;数据会陷入到⼀个”循环“之中。 而”快慢指针“有⼀个特性&#xff0c;就是在⼀个…

英文网站建设意义

英文网站建设是一项至关重要的任务&#xff0c;对于企业和个人而言都具有巨大的战略意义。一个精心设计的英文网站不仅可以提升品牌形象&#xff0c;还能够为用户提供良好的体验&#xff0c;从而增加流量、促进业务发展。在进行英文网站建设时&#xff0c;有几个关键方面需要特…

[MAUI]数据绑定和MVVM:MVVM的属性验证

一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…

五、Drf权限组件

五、权限组件 权限组件=[权限类,权限类,权限类…] 执行所有权限类的has_permission方法,通过返回True,不通过返回False 默认情况下,所有的权限类都通过,才返回True 5.1简单应用权限组件 #ext.per class MyPermission1(BasePermission):def has_permission(self, requ…