【Cpp】类和对象

标题:【Cpp】类和对象

@水墨不写bug


 


正文开始:

(一)面向过程与面向对象

        面向过程面向对象是两种不同的编程思想。

        面向过程指的是将程序分解成多个步骤,每个步骤都是一个独立的函数,通过函数之间的调用实现程序的功能。面向过程的程序设计着重于算法和步骤的顺序,将问题分解为一系列的步骤来解决。

        面向对象则是以对象为中心的编程思想。对象是数据和操作数据的函数组合而成的。面向对象的程序设计着重于对象之间的交互和关系,将问题分解为一组对象之间的协作。

        面向过程和面向对象的主要区别在于思考问题的角度和解决问题的方式。面向过程更加注重步骤和算法的实现,而面向对象更加注重对象之间的关系和交互。同时,面向对象的程序设计可以更好地实现封装、继承和多态等特性,使代码更加灵活和可复用。 

        举个例子:点外卖

面向过程,将从你下单点外卖到你拿到饭菜,到这一动作分成若干步骤:

        你下单——商家做饭——骑手取餐——商家骑手交接——骑手送餐——你拿到饭菜。 

而面向对象,就截然不同了。

        面向对象注重的是骑手,商家,顾客三个类实例化产生的对象之间的交互:你选择了哪个商家,商家输出产品,骑手输送产品等动作,都是实例化的对象的功能的体现。


(二)类 . Class

(1)认识类

        C语言的结构体中只能定义变量,不能定义函数。

        Cpp中规定结构体内可以定义函数,并用  class  代替  struct  来定义一个结构体,作为一个类的定义。

class className
{

    // 类体:由成员函数和成员变量组成

}; 
// 一定要注意后面的分号

        class为定义类的关键字,ClassName为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略
        类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

(2)类的两种定义方式

类的成员函数两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加 “类名::”

(一般情况下,更期望采用第二种方式)

类的成员变量的定义方式:

1.为了区分一个类的成员变量和成员函数的形参,通常将成员变量前或者后加一个“_”;

class Date
{
public:
    void Init(int year)
    {
//区分一个类的成员变量和成员函数的形参,通常将成员变量前或者后加一个“_”
        _year = year;
    }
private:
    int _year;
};

(3)类的访问限定符

        public,private,protected。

        C++实现封装的方式:用类将对象的属性(通过成员变量体现)与方法(通过成员函数体现)结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

        1. public修饰的成员(成员函数或者成员变量)在类外可以直接被访问
        2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的);
        3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;
        4. 如果后面没有访问限定符,作用域就到 } 即类结束;
        5. class的默认访问权限为private,struct为public(因为struct要兼容C);

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别


(4)类的作用域 

        类定义了一个新的作用域,类的所有成员都在类的作用域中。(类似于在另一个文件中定义类的成员时)在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
 

class Person
{
public:
    void Print_person_info();
private:
    char name[50];
    char address[50];
    char gender[10];
    int age;
    char tel[15];
};

//(类似于在另一个文件中定义类的成员时)
//在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
void Person::Print_person_info()
{
    //..
}

(5)类的实例化

用类创建对象的过程称为类的实例化。

        类本质上也是一种数据类型,(如int,float,double等)只不过类是一种比较复杂的数据类型,它包含多种可自助实现的功能(类的成员函数)。

        既然类是和(如int,float,double等)相似的,那么也就意味着类本身是不占用内存空间的,而通过类实例化出来的对象是占用内存空间的

        但是一个类既包含了成员变量也包含了成员函数,那么占用的内存空间一定不小。如果我们实例化许多个对象,每个对象都会重复保存一份成员函数,不就造成了内存浪费吗?

i,如何计算类对象的大小

#include<iostream>
using namespace std;

class A1 {
public:
	void f1(){}
private:
	int _a;
};
// 类中仅有成员函数
class A2 {
public:
	void f2() {}
};
// 类中什么都没有---空类
class A3
{};

int main()
{
	cout<<sizeof(A1)<<" "<<sizeof(A2)<<" "<<sizeof(A3);
	return 0;
}

        结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。


完~

未经作者同意禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用OneAPI创建LLM访问API Key

OneAPI 是一个能替代 springdoc-openapi/Swagger 的 API 生产工具&#xff0c;既不需要修改后端代码&#xff0c;也不需要启动应用。 也支持导出 OpenAPI 3.0 协议数据&#xff0c;方便在其他工具中消费。 前面我们介绍了LobeChat需要配置LLM的API访问Key&#xff0c;今天你可…

《架构即未来》读后感

目录 一、引言 二、《架构即未来》读后感 1、主题的简要介绍 2、我的看法和理解 3、作者的优点和传递的信息 4、思想如何适用于当今社会 三、《架构即未来》对于企业发展的影响具体体现在哪些方面&#xff1f; 一、引言 任何一个持续成长的公司最终都需要解决系统、组织…

【讲解下如何解决一些常见的 Composer 错误】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【Spring AI】09. ETL 管道

文章目录 ETL PipelineAPI 概述入门指南ETL 接口和实现DocumentReaderJsonReaderTextReaderPagePdfDocumentReaderParagraphPdfDocumentReaderTikaDocumentReader DocumentTransformerTextSplitterTokenTextSplitterContentFormatTransformerKeywordMetadataEnricherSummaryMet…

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分&#xff0c;它主要用于处理企业内部文件向外部传输的流程&#xff0c;确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括&#xff1a; 1、防止数据泄露&#xff1a;通过严格的审批流程和安全策略&…

【强训笔记】day7

NO.1 思路&#xff1a;双指针模拟&#xff0c;begin表示最长数字字符串最后一个字符&#xff0c;而len表示数字字符串的长度&#xff0c;i用来遍历&#xff0c;如果为数字&#xff0c;那么定义j变量继续遍历&#xff0c;直到不为数字&#xff0c;i-j如果大于len&#xff0c;就…

LabVIEW机械臂控制与图像处理示教平台

LabVIEW机械臂控制与图像处理示教平台 随着工业自动化技术的快速发展&#xff0c;工业机器人在制造业中的应用越来越广泛&#xff0c;它们在提高生产效率、降低人工成本以及保证产品质量方面发挥着重要作用。然而&#xff0c;传统的工业机器人编程和操作需要专业知识&#xff…

深入理解vector 【C++】

一、vector的介绍&#xff1a; 1.vector是表示可变大小的顺序容器。 2.就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&am…

【C++STL详解(五)】--------list的介绍与使用

目录 前言 一、list的介绍 二、list的使用 Ⅰ.默认成员函数 1、构造函数 2、赋值重载 3、析构函数 Ⅱ、容量 1.size() Ⅲ、迭代器与遍历 1.beginend (正向迭代器) 2.rbeginrend (反向迭代器) 3.front 4.back Ⅳ、增删查改 1.push_front 2.pop_front 3.push_b…

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

平平科技工作室-Python-步步惊心

一.准备图片 放在 文件夹取名为imgs,分为两种boys和girls 二.编写程序 首先创建一个文件名为index.py 其次编写程序 # coding:utf-8 import sys, time, easygui, os, pygame from pygame.locals import * pygame.init() # 设置窗口显示位置、大小、颜色、标题 os.environ[ …

Go语言的包管理工具go mod与之前的GOPATH有什么区别?

在深入探讨Go语言的包管理工具go mod与之前的GOPATH之间的区别之前&#xff0c;我们首先需要理解这两个概念各自的作用和背景。 GOPATH时代 在Go语言早期版本中&#xff0c;GOPATH是一个非常重要的环境变量。它告诉Go工具链在哪里查找你的Go代码、第三方库以及编译后的二进制…

C#描述-计算机视觉OpenCV(4):图像分割

C#描述-计算机视觉OpenCV&#xff08;4&#xff09;&#xff1a;图像分割 前言用 GrabCut 算法分割图像实例展示 前言 本文中如果有什么没说明的地方&#xff0c;大概率在前文中描述过了。 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算…

docker 指定根目录 迁移根目录

docker 指定根目录 1、问题描述2、问题分析3、解决方法3.1、启动docker程序前就手动指定docker根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决根目录空间不够问题3.1.0、方法思路3.1.1、docker官网安装文档3.1.2、下载docker安装包3.1.3、安装docker 26.1.03…

记一次从登录框到前台rce

接口未授权挖掘 在网站未登录的情况下&#xff0c;由于不知道后台接口。唯一办法通过js文件、路径扫描。通过这种收集方式使用burp进行批量扫描&#xff0c;分别探测GET/POST请求。观察响应包跟状态码。判断响应包&#xff0c;确定存在未授权后&#xff0c;再构造数据包。 2 突…

C++ | Leetcode C++题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution { public:int minPathSum(vector<vector<int>>& grid) {if (grid.size() 0 || grid[0].size() 0) {return 0;}int rows grid.size(), columns grid[0].size();auto dp vector < vector <int>…

机器学习笔记-18

异常检测问题 异常检测虽然主要用于无监督学习问题上&#xff0c;但是和监督学习问题很相似。 异常检测(Anomaly Detection)&#xff1a;给定正确样本集{ x ( 1 ) , x ( 2 ) . . . x ( n ) x^{(1)},x^{(2)}...x^{(n)} x(1),x(2)...x(n)}&#xff0c;记新样本即要检测的样本为…

NIO(非阻塞I/O)和IO(阻塞I/O)详解

文章目录 一、NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞I/O&#xff09;1、Channel&#xff08;通道&#xff09;与Buffer&#xff08;缓冲区&#xff09;1.1、使用ByteBuffer读取文件1.2、ByteBuffer 方法1.2、ByteBuffer 结构1.3、字符串与 ByteBuffer 互转1.4 Sca…

代码随想录算法训练营DAY48|C++动态规划Part9|121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

文章目录 121.买卖股票的最佳时机思路CPP代码 122.买卖股票的最佳时机II思路CPP代码 123.买卖股票的最佳时机III思路CPP代码 121.买卖股票的最佳时机 力扣题目链接 文章讲解&#xff1a;121.买卖股票的最佳时机 视频讲解&#xff1a;动态规划之 LeetCode&#xff1a;121.买卖股…

BJFUOJ-C++程序设计-实验3-继承和虚函数

A TableTennisPlayer 答案&#xff1a; #include<iostream> #include<cstring> using namespace std;class TableTennisPlayer{ private:string firstname;string lastname;bool hasTable;public:TableTennisPlayer(const string &, const string &, bool…