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

news2024/11/17 17:53:37

文章目录

  • 面向对象编程中的类与对象
    • 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.coloradmin.cn/o/2184529.html

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

相关文章

云服务器部署k8s需要什么配置?

云服务器部署k8s需要什么配置&#xff1f;云服务器部署K8s需要至少2核CPU、4GB内存、50GBSSD存储的主节点用于管理集群&#xff0c;工作节点建议至少2核CPU、2GB内存、20GBSSD。还需安装Docker&#xff0c;选择兼容的Kubernetes版本&#xff0c;配置网络插件&#xff0c;以及确…

大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【日常记录】现在遇到的Y7000P亮度无法调节问题,无需改动注册表进行调整的方法。

1、winR 2、输入&#xff1a;services.msc 3、找到下面红框内的服务 4、右键后&#xff0c;点击重启任务&#xff0c;重启任务后&#xff0c;再次按热键即可恢复亮度调节。

XGBOOST算法Python实现(保姆级)

摘要 XGBoost算法&#xff08;eXtreme Gradient Boosting&#xff09;在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合&#xff0c;这是因为工科要求都必须是8开头的专业课&#xff0c;里面参考课本还是没变的&#xff0c;无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

<<迷雾>> 第5章 从逻辑学到逻辑电路(6)--莎士比亚电路 示例电路

info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch05-17-shakespeare-circuit.txt 原图

【AI人工智能】文心智能体,陪爸妈去旅游,国庆假期不容错过,旅游搭子首选

文章目录 背景创作灵感陪爸妈去旅游简介角色与目标思考路径个性化开场白调优 智能体体验总结和感受 背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风…

AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用

查看原文>>>AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用 目录 专题一 CMIP6中的模式比较计划 专题二 数据下载 专题三 基础知识3.1 Python基础 专题四 单点降尺度 专题五 统计方法的区域降尺度 专题六 基于WRF模式的动力降尺度 专题七…

墙绘艺术在线交易:SpringBoot技术解析

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架…

习题2 算法

选择题 1. 以下叙述中错误的是 【 正确答案: C】。 A.算法正确的程序最终一定会结束 B.算法正确的程序可以有零个输入 C.算法正确的程序可以有零个输出 D.算法正确的程序对于相同的输入一定有相同的结果 2. 下面关于算法的说法错误的是 【 正确答案: B】。 …

推送k8s镜像到阿里云服务器

1、服务打包 2、打包后进入Dockerfile的同级目录 运行 docker build -t 镜像名:镜像版本 . (这个点是当前目录的意思&#xff0c;不能忽略)例如 docker build -t trac:v1.0.4 .3、上传镜像到阿里云镜像服务 注意选择区域 例如&#xff1a; docker tag 70743d9bdba3 registr…

git push 远程仓库 linux版

git push 远程仓库 为了将git本地仓库的内容push到远程仓库上&#xff0c;此处记录一下具体的过程&#xff1a; 1.进入到项目根目录下 2.将本地目录初始化为Git仓库。默认情况下&#xff0c;初始分支为main。 git init && git symbolic-ref HEAD refs/heads/main3.…

nginx打包部署前端vue项目全过程【保姆级教程】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

数据结构(7.4_1)——B树

B树的定义 m阶B树的核心特性&#xff1a; B树的高度 最小高度 最大高度 总结&#xff1a;

通信工程学习:什么是DHCP动态主机配置协议

DHCP&#xff1a;动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一种用于自动分配IP地址及其他网络配置参数&#xff08;如子网掩码、网关地址、DNS服务器等&#xff09;的网络管理协议。以下是对DHCP协议的…

Acwing 容斥原理

容斥原理 先不考虑重叠的情况&#xff0c;把包含于某内容中的所有对象的数目先计算出来&#xff0c;然后再把计数时重复计算的数目排斥出去&#xff0c;使得计算的结果既无遗漏又无重复&#xff0c;这种计数的方法称为容斥原理。 以S1,S2,S3三个集合为例&#xff0c;求出三个…

机器学习西瓜书笔记(十三) 第十三章半监督学习+代码

第十三章 13 半监督学习13.1 未标记样本13.3.1 小结 13.2 生成式方法13.2.1 小结 13.3 半监督SVM13.3.1 小结 13.4 图半监督学习13.4.1 小结 13.5 基于分歧的方法13.5.1 小结 13.6 半监督聚类13.6.1 小结 13.7 代码&#xff1a;手写数据集上的标签传播-性能展示章末小结 13 半监…

netty之NettyServer群发消息

前言 在微信或者QQ的聊天中我们经常会用到一些群聊&#xff0c;把你的信息发送给所有用户。那么为了实现群发消息&#xff0c;在netty中我们可以使用ChannelGroup方式进行群发消息。如果为了扩展验证比如你实际聊天有不同的群&#xff0c;那么可以定义ConcurrentHashMap结构来存…

程计软考题2-编译、解释程序翻译阶段

(一) 编译器和解释器的工作阶段 1.编译和解释与源程序的区别 分析&#xff1a;编译和解释是语言处理的两种基本方式。 编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段&#xff0c;以及符号表管理和出错处理模块。 解释过程在词法、语…