C++入门自学Day2-- c++类与对象(初识)

一、面向对象和面向过程

1、什么是面向过程(Process-Oriented Programming, POP)

📌 定义

  • 面向过程强调的是 过程(过程=函数),即:按照步骤(流程)组织代码

  • 程序结构 = 数据结构 + 操作这些数据的函数。

  • 程序的主要设计思想是:先干什么,再干什么,顺序执行,遇事用函数搞定

📌 特点

  • 数据与函数分离

  • 强调模块化、函数复用

  • 程序结构清晰,适合小项目或底层开发

  • 缺乏对复杂数据结构的抽象能力

  • C 语言是典型的面向过程语言:关注过程,分析求解问题的步骤,通过函数调用逐步解决问题。

  • struct Student {char name[20];int age;
    };void printStudent(struct Student s) {printf("%s %d\n", s.name, s.age);
    }int main() {struct Student s = {"Tom", 20};printStudent(s); // 操作结构体由外部函数处理
    }

2、什么是面向对象(Object-Oriented Programming, OOP)?

📌 定义

  • 面向对象强调的是“对象(object)”:

    把数据和操作这些数据的方法封装成一个整体(类),对象是类的实例。

📌 核心特性(C++ 支持)

特性

含义

封装

数据和函数封装在类中,提高安全性与模块化

继承

子类自动继承父类成员,提高复用性

多态

同一个接口有不同表现形式(如虚函数)

 C++ 是支持面向对象的语言:关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

class Student {
public:string name;int age;void print() {cout << name << " " << age << endl;}
};int main() {Student s;s.name = "Tom";s.age = 20;s.print();  // 数据和方法封装在类内部
}

3、两种范式对比总结

比点

面向过程(C)

面向对象(C++)

编程核心

函数、流程

对象、类

数据与函数

分离

封装在一起

适用场景

小型、过程性、底层开发

中大型、复杂、维护性强项目

可扩展性

典型语言

C

C++、Java、Python(OOP)

面向过程强调“做什么”,面向对象强调“谁来做”;
C 是“写过程”的语言,C++ 是“建模型”的语言。

二、c++类的引入

        c语言中,结构体只能定义变量,在c++中,结构体内不仅可以定义变量,也可以定义函数。

1、类的基本语法和使用

直接定义:

//类里面可以定义:1成员变量,2成员方法(函数)class Person {
public: //访问限定符--公有void showInfo(){cout<< _name<<"-"<<_sex<<"-"<<_age<<"-"<<endl;}public:           // 访问权限char* _name;  // 成员变量char* _sex;int _age;
};

分开定义,在头文件中声明,cpp中定义

头文件中的声明:


class Person {
public://访问限定符--公有//显示基本信息void showInfo();public:           // 访问权限char* _name;  // 成员变量int _age;char* _sex;};

cpp文件的定义

#include "class.h"void Person::showInfo(){cout<< _name<<"-"<<_sex<<"-"<<_age<<"-"<<endl;
}

c++类的访问限定符

关键字

说明

public

类外可访问

private

类外不可访问,仅类内和友元函数可访问

protected

类外不可访问,派生类可访问

默认访问权限:class 默认是 private,struct 默认是 public。struct也可以定义类。

利用类实现数据结构中的栈等

//利用类实现数据结构中的栈。
class Stack{public:void STInit(){//..../}void STpush(int x){//..../}void STpop(){//..../}void PrintST(){//..../}void Destroy(){//..../}private:int Top;int* _arr;int _capacity;
};int main(){Stack ST;ST.STInit(10);ST.STpush(1);ST.STpush(10);
}

c语言结构体和c++结构体定义的区别:

        c++中,兼容c的struct的定义结构体的方法,但同时struct也可以用来定义类。

        struct所定义的类 默认是 public, class 定义的类默认是private 。

        

//c语言用于定义结构体
struct ListNodeC{struct ListNodeC* prev;struct ListNodeC* next;
};
//c++定义结构体
struct ListNodeCPP{//同时也可以定义类ListNodeCPP* prev;ListNodeCPP* next;//这里仍然可以定义函数->成员函数ListNodeCPP* Creat();
}

c++ 兼容 c语言的用法。

类的内存占用

class Stack{//1、成员函数
public:void Push(int x); //函数的声明void Pop(); //函数可以在类中定义,也可以在类外定义。  bool IsEmpty();//2、成员变量
public:int* _arr;int _size;size_t _capactity;};int main(){//类实例化出对象,相当于定义出类的成员变量Stack s1;Stack s2;Stack s3;// s1.Push(1);cout << sizeof(s1) << endl;//计算内存占用大小return 0;
}

输出如下:

24 --> macos arm64架构下,int* 占用8个字节

根据内存对齐:

  • int* 要求 8 字节对齐

  • int 要求 4 字节对齐

  • 所以整体对齐到 8 的倍数

共24字节。那也就是成员函数不占字节

原因:一个类可以实例化n个对象,每个成员变量都可以存储不同的值,但是调用的函数确是同一个。所以成员函数不占类对象的内存,成员函数是 代码段(.text 段),与对象无关。

        所以:sizeof(类对象) 只与 成员变量 有关,与成员函数无关

当我们的类中,成员变量为空,成员函数为空的情况下,内存大小是多少呢?

class A2{public:void f1();
};class A3{};int main(){cout << sizeof(A2) << endl;cout << sizeof(A3) << endl;return 0;
}

输出结果:

1

1

1️⃣ C++标准规定:

每个对象必须有唯一地址

  • 如果类的大小是 0,那多个对象就可能共享同一块地址(比如全都指向空地址 0x1234)

  • 为了保证对象在内存中“可区分”,编译器会强制空类占用至少 1 字节

2️⃣ 类中只有函数时,仍然认为“没有数据成员”

  • 成员函数是**代码段(text segment)**的一部分,不存储在对象中

  • 所以 A2 仍然是空类(empty class),编译器仍然会分配 1 字节

类的实例化 --> 就是用自己定义的类型定义出对象

1、内置类型,基本类型 int/char/double

2、自定义类型,class/struct。

面向对象的三大特性:封装,继承,多态。

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

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

相关文章

DAO组织智能合约开发:从理论到实践

目录 DAO组织智能合约开发:从理论到实践 1. DAO概述:去中心化自治组织 2. DAO核心组件设计 2.1 架构设计 2.2 关键智能合约 3. 治理代币实现 3.1 ERC20扩展合约 4. 提案管理系统实现 4.1 提案状态机 4.2 提案合约实现 5. DAO核心合约实现 5.1 DAO合约架构 5.2 提案类型扩展 6…

Ubuntu系统完整配置教程

Ubuntu系统完整配置教程 目录 配置镜像源安装网络服务虚拟机中安装CUDAPython开发环境配置Java开发环境配置 1. 配置镜像源 1.1 备份原始源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup1.2 编辑源文件 sudo nano /etc/apt/sources.list1.3 各大镜像源…

【mysql慢查询】

mysql慢查询慢查询慢查询日志配置慢查询 慢查询是指执行时间超过指定阈值的SQL语句。在MySQL中&#xff0c;默认情况下执行时间超过10秒的查询会被认为是慢查询&#xff0c;但这个阈值可以根据需要进行调整。 慢查询日志配置 -- 查看当前慢查询配置 SHOW VARIABLES LIKE slo…

django 按照外键排序

在Django中&#xff0c;使用外键&#xff08;ForeignKey&#xff09;进行排序是一种常见的需求&#xff0c;特别是在处理数据库关系时&#xff0c;如用户和订单之间的关系&#xff08;一个用户有多个订单&#xff09;。下面是如何在使用Django ORM时进行基于外键的排序。 定义模…

JAVA_EIGHTEEN_特殊文件

目录 Properties属性文件 XML的作用和应用场景 日志技术 Properties属性文件 约束&#xff1a;只能是键值对 键不能重复 文件后缀一般是.properties结尾的 是一个Map集合&#xff08;键值对集合&#xff09; 核心作用&#xff1a;Properties是用来代表属性文件的&#…

第二十二节 MATLAB转置向量、MATLAB追加向量

MATLAB中转置操作能够将一个行向量改变成一个列向量&#xff0c;反之亦然。MATLAB中转置操作使用一个单引号&#xff08;&#xff09;来表示。详细例子在MATLAB中建立一个脚本文件&#xff0c;输入下述代码&#xff1a;r [ 1 2 3 4 ]; tr r; v [1;2;3;4]; tv v; disp(tr); …

window显示驱动开发—Direct3D 11 视频设备驱动程序接口 (DDI)

这些设备驱动程序接口 (DDI) 是新的或针对Windows 8更新的&#xff1a;CalcPrivateCryptoSessionSizeCalcPrivateAuthenticatedChannelSizeCalcPrivateVideoDecoderOutputViewSizeCalcPrivateVideoDecoderSizeCalcPrivateVideoProcessorEnumSizeCalcPrivateVideoProcessorInput…

新手向:用AI破解数据质量难题

用AI破解数据质量难题&#xff1a;从零开始的完整指南数据质量的重要性及其影响数据质量是数据分析、机器学习和业务流程中不可忽视的核心问题。低质量数据会导致一系列严重后果&#xff1a;错误决策&#xff1a;基于不准确或缺失的数据可能导致管理层做出错误判断。例如&#…

用 Python 获取电脑电池电量的各种案例

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 方法一:使用 `psutil` 库(跨平台) 方法二:Windows 专用方法(使用 `win32api`) 方法三:macOS 专用方法 方法四:Linux 专用方法 方法五:跨平台统一方法 Python 程序案例:检测电池电量并在低于20%时关机 以下…

Linux->自定义shell

目录 引入&#xff1a; 1&#xff1a;shell是什么&#xff1f; 2&#xff1a;命令行提示符是什么&#xff1f; 3&#xff1a;xshell是什么&#xff1f; 一&#xff1a;命令行提示符 二&#xff1a; 获取用户输入 三&#xff1a;分割字符串 四&#xff1a;执行命令 五…

js中出现-8.881784197001252e-16这种(一个极其接近 0 的极小负数)的浮点数精度计数异常问题解决思路

你的代码中出现 -8.881784197001252e-16&#xff08;一个极其接近 0 的极小负数&#xff09;的原因是 JavaScript 浮点数精度问题。具体来说&#xff0c;当你反复进行 加法 和 减法 时&#xff0c;由于浮点数在计算机中的存储方式&#xff0c;可能会引入微小的误差。一、问题情…

超详细的 RustDesk 自建中继节点教程

厌倦了商业远程控制软件的会员限制和功能阉割&#xff1f;渴望拥有一个自由掌控、安全可靠的远程连接方案&#xff1f;开源软件 RustDesk 正是你需要的答案&#xff01; 相信从事互联网工作的你&#xff0c;一定对向日葵和ToDesk等商业远程控制软件并不陌生。然而&#xff0c;…

Spring Boot 2整合Druid的两种方式

一、自定义整合Druid&#xff08;非Starter方式&#xff09;适用于需要完全手动控制配置的场景添加依赖&#xff08;pom.xml&#xff09;<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</ve…

鸿蒙Next-开发版本升级,API升级(例如API12升API16)

鸿蒙更新换代很快的&#xff0c;2025年1月&#xff0c;截至4月就有 DevEco Studio 5.0.2 Release 升级到 DevEco Studio 5.0.3 Release 升级到 DevEco Studio 5.0.4 Release&#xff0c;三次大版本更新。 作者也想在年前创建的项目中体验一下新版本的特性&#xff0c;于是查看了…

树莓派设置时区

查看当前时间 piraspberrypi-CM5:~ $ date Mon 28 Jul 09:22:38 BST 2025BST 指的是 British Summer Time&#xff0c;即英国夏令时&#xff08;UTC1&#xff09;。 所以这是英国&#xff08;伦敦等地&#xff09;在夏令时期间的本地时间&#xff0c;比标准的 UTC 时间快 1 小时…

C Primer Plus 第6版 编程练习——第13章(下)

8.编写一个程序&#xff0c;以一个字符和任意文件名作为命令行参数。如果字符后面没有参数&#xff0c;该程序读取标 淮输入;否则&#xff0c;程序依次打开每个文件并报告每个文件中该字符出现的次数。文件名和字符本身也要一同报告。程序应包含错误检查&#xff0c;以确定参数…

王树森推荐系统公开课

github&#xff1a;https://github.com/wangshusen/RecommenderSystem b站&#xff1a;推荐系统公开课——8小时完整版&#xff0c;讲解工业界真实的推荐系统_哔哩哔哩_bilibili 知乎上一个比较全面的笔记&#xff1a;https://zhuanlan.zhihu.com/p/678664853 我的笔记&…

<RT1176系列11>DMAMUX解读

1、概述DMA&#xff08;直接内存访问&#xff0c;DIrect Memory Access&#xff09;工作原理&#xff1a;DMA控制器直接在内存和外设之间传输数据&#xff0c;而不需要CPU的干预。优点&#xff1a;极大地提高了数据传输效率&#xff0c;释放CPU资源。适合大批量数据传输&#x…

【MySQL】MySQL 缓存方案

一、MySQL主从同步 1.1 主从同步是什么 MySQL 主从同步是一种数据复制机制&#xff0c;通过该机制可以实现将主数据库&#xff08;Master&#xff09;的 DDL&#xff08;数据定义语言&#xff09;和 DML&#xff08;数据操纵语言&#xff0c;如 update、insert、delete&#x…

base64.b64encode(f.read()).decode(‘utf-8‘)作用

base64.b64encode(f.read()).decode(utf-8) 的作用是将文件内容&#xff08;通常是二进制文件&#xff09;编码为一个 UTF-8 格式的字符串。下面逐步解释这个过程&#xff1a;f.read()&#xff1a;读取文件 f 中的内容。这将返回文件的二进制数据。base64.b64encode()&#xff…