类和对象(初)

news2024/9/21 12:36:41

目录

一、面向过程和面向对象初步认识

二、类的引入

 命名规则

三、类的定义

四、访问限定符

五、类的作用域

六、类的实例化

七.类对象模型


一、面向过程和面向对象初步认识

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

2. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。

以洗衣服为例子

c语言关注

c++关注

二、类的引入

鉴于C++面向对象的特点,于是就创建出类这个概念来处理每个对象,我们可以通过类来描述每个对象的全部特点 

但是虽然c++是基于面向对象的语言,关注对象,但是它也支持面向过程,因此c语言和c++的代码可以混编

c++兼容c语言,结构用法可以继续使用

同时struct也升级成了类

struct Stack//类名
{
    int* a;
    int top;
    int capacity;
};

int main()
{
    struct Stack st1;//结构体的用法
    Stack st2;//类的用法,类名可作类型
};

同时,类中不止可以定义变量,也可以声明和定义函数 

不用我们主动传参,成员函数可以直接访问成员变量,例子如下

typedef int DataType;
struct Stack
{
    void Init(size_t capacity)
    {
        _array = (DataType*)malloc(sizeof(DataType) * capacity);
        if (nullptr == _array)
        {
            perror("malloc申请空间失败");
            return;
        }
        _capacity = capacity;
        _size = 0;
    }

    DataType* _array;
    size_t _capacity;
    size_t _size;
};
int main()
{
    Stack s;
    s.Init(10);
    return 0;
}

 命名规则

为了避免函数形参与成员变量之间产生混淆等 ,我们一般将成员变量加上标记处理,比如_,my等等。如果形参与成员变量名称相同,默认优先使用局部域的变量,就会形成局部变量自己赋值给自己的情况

class Date
{
public:
    void Init(int year)
    {
        _year = year;
    }
private:
    int _year;
};
// 或者这样
class Date
{
public:
    void Init(int year)
    {
        mYear = year;
    }
private:
    int mYear;
};

三、类的定义

但是c++中更喜欢使用class,主要原因在4.访问限定符中讲

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

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


类的两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器会将其当成内
联函数处理。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

因为编译器遇到一个变量要去找,加了类名它才知道去哪找,不加类名它只会默认在全局去找

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

四、访问限定符

C++实现封装的方式:

用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

【访问限定符说明】
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 } ,即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C),因此我们在c++中更喜欢使用class
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

一般来说我们习惯将成员变量私有,通过公有的成员函数进行访问,同时,类里面不受访问限定符的限制

五、类的作用域


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

class Person
{
public:
    void PrintPersonInfo();
private:
    char _name[20];
    char _gender[3];
    int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
    cout << _name << " "<< _gender << " " << _age << endl;
}

我们可以将花括号就看成一个域的界限 

六、类的实例化

class date
{
public:
    void init(int year,int month,int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print()
    {
        cout << _year << "/" << _month << "/" << _day << endl;
    }
private:
    int _year;//这里是声明
    int_month;
    int_day;
};

定义的特点是开空间,这里并没有开空间

int main()
{
    date d;//这里开了空间,这才叫定义
    return 0;
}

那三个成员变量都绑在一起定义了, 对象的定义也叫做对象的实例化。

同样的,函数的定义和声明也是一样,定义需要分配存储空间;声明只是告诉编译器这个函数已经在别处定义过了。

函数的定义和声明比较好区分。有函数体的即为定义,不带函数体即为声明。

七.类对象模型

接下来再看另一个问题

int main()
{
    date d1;
    d1.init(2024,7,12);
    d1.Print();
    d1._year;


    date d2;
    d1.init(2024,7,13);
    d1.Print();
    d2._year;
}

我们sizeof(date)  与sizeof(d1)得出的值均为12(实际上,sizeof计算对象的大小也是转换成对对象类型的计算)

我们知道,d1中的_year  与d2中的_year不是一个变量,但是d1中的Print()与d2中的Print()是同一个函数,如果我们在每个对象中都存一个,这种方式不划算。所以d1.year 与d2._year是到对象里面去找,但是d1.Print()与d2.Print()是到公共的代码区去找。成员函数与全局函数都储存在公共代码区

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

// 类中什么都没有---空类
class A
{};

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

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

相关文章

开发个人Ollama-Chat--5 模型管理 (二)

开发个人Ollama-Chat–5 模型管理 (二) ChatGPT 这是该项目的最终效果&#xff0c;使用ollama的open-webui进行人与机器的对话功能&#xff0c;对话的后端服务则完全对接自己开发的Go项目。 如何实现呢&#xff1f;则通过这篇文章&#xff0c;一一给大家剖析后端的原理及功能…

【进阶篇-Day8:JAVA中递归、异常的介绍】

目录 1、递归的介绍和使用1.1 递归的介绍1.2 案例案例一&#xff1a;案例二&#xff1a;案例三&#xff1a;案例四&#xff1a; 1.3 总结 2、异常的介绍和使用2.1 异常的介绍&#xff1a;&#xff08;1&#xff09;能够看懂异常&#xff08;2&#xff09;异常的体系接口和分类&…

fortran快速排序算法,示例对一维数组进行排序

fortran快速排序算法&#xff0c;示例对一维数组进行排序 0. 引言1. 快速排序方法(QuickSqrt)代码实现2. 结语 0. 引言 快速排序&#xff08;QuickSort&#xff09;是一种常用的排序算法&#xff0c;采用分治策略实现。它的基本思想是通过一趟排序将待排序的数据分割成独立的两…

[笔试训练](三十六)106:提取不重复的整数107:哈夫曼编码108:abb

目录 106:提取不重复的整数 107:哈夫曼编码 108:abb 106:提取不重复的整数 题目链接:提取不重复的整数_牛客题霸_牛客网 (nowcoder.com) 题目: ​ 题解: #include <iostream> #include <string> using namespace std; int n0; int cnt[10]; int ret0; int mai…

MySQL CONCAT函数的简单使用

CONCAT函数用于将mysql中查询多列的值拼成一列显示&#xff0c; 使用示例&#xff1a; SELECT CONCAT(attr_name,"&#xff1a;",attr_value) FROM pms_sku_sale_attr_value WHERE sku_id1; 上面SQL语句使用CONCAT函数将attr_name、attr_value两列的值拼成一列&am…

【代码随想录】【算法训练营】【第62天】 [卡码108]冗余连接 [卡码109]冗余连接II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 62&#xff0c;又是一个周一&#xff0c;ding~ 题目详情 [卡码108] 冗余连接 题目描述 卡码108 冗余连接 LeetCode类似题目684 冗余连接 解题思路 前提&#xff1a; 思路&#xff1a; 重点&a…

如何对odoo17网站cookies进行配置(How to configure cookies for Odoo 17 website?)

浏览器cookies具有缓存和加速的作用&#xff0c;odoo17 website 模块内置了cookies的选项: &#xff08;Browser cookies have the function of caching and acceleration, and the Odoo 17 website module has built-in options for cookies:&#xff09; 1、安装website模块后…

TCP传输控制协议

传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793[1]定义。 TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机…

【C++】哈希表的模拟实现及 unordered_set 和 unorderded_map 的封装

目录 前言一、哈希表的模拟实现1.1 哈希表的改造1.1.1 模板参数列表的改造1.1.2 增加迭代器操作 1.2 哈希表的模拟实现1.2.1 哈希表中仿函数的实现1.2.2 哈希表中节点类的实现1.2.3 哈希表中迭代器类的实现1.2.4 哈希表中构造函数、析构函数和 Clear() 函数的实现1.2.5 哈希表中…

JZ62 孩子们的游戏(圆圈中最后剩下的数)

题目来源&#xff1a;牛客 题目描述&#xff1a; 每年六一儿童节&#xff0c;牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中&#xff0c;有个游戏是这样的&#xff1a;首先&#xff0c;让 n 个小朋友们围成一个大圈&#xff0c;小朋友们的编号是0~n-1。然后&…

Git 课程任务

** ** https://github.com/InternLM/Tutorial/pull/905 https://github.com/onlyzer0/all_you_need/blob/main/README.md

Dify中固定递归字符文本分割器的chunk长度计算方式

本文主要从源码角度剖析了Dify中FixedRecursiveCharacterTextSplitter的chunk长度计算方式。 1.self._length_function(chunk) 源码位置:dify\api\core\splitter\fixed\_text\_splitter.py\FixedRecursiveCharacterTextSplitter类\split\_text方法\self.\_length\_function(…

实验9 存储过程与函数的创建管理实验

一、实验目的&#xff1a; 理解存储过程和函数的概念。掌握创建存储过程和函数的方法。掌握执行存储过程和函数的方法。掌握游标的定义、使用方法。 二、实验内容 1&#xff0e;某超市的食品管理的数据库的Food表&#xff0c;Food表的定义如表所示&#xff0c; Food表的定义…

GESP 2023年12月C++二级真题

参考程序1&#xff1a; #include<iostream> using namespace std;int first,second; int m,n; int sum 0;int fn(int n) {if(n1) {return first;} else if (n2) {return second;} else {return fn(n-1)fn(n-2);} } int main() {cin>>first>>second;cin>…

【Golang】map的使用

map声明的方式 //声明var m map[string]string//在使用map之前&#xff0c;先make&#xff0c;make的作用就是给map分配空间m make(map[string]string)m["lover"] "Yzx"m["friend1"] "Zxw"m["friend2"] "Zzc"…

【电子通识】什么是无源元件的认证用可靠性试验标准AEC-Q200?

目前电动汽车已经是一个大趋势&#xff0c;汽车上安装有由多个电子零部件构成的ECU&#xff08;电子控制单元&#xff09;。即使汽车在恶劣的环境下行驶&#xff0c;电子零部件也必须不出故障地正常工作。因此&#xff0c;车载电子零部件与消费类电子相比&#xff0c;要求其达到…

Idea调试Kotlin代码

1.配置java虚拟机jvm远程调试 例如 启动程序配置 java -agentlib:jdwptransportdt_socket,servery,suspendn,address127.0.0.1:5005 -jar KtTest.jar IDEA配置远程调试JVM idea编译的Kt代码为 // IntelliJ API Decompiler stub source generated from a class file // Im…

人工智能是帮助开发人员还是取代他们?

最近&#xff0c;神经网络已经成为应用开发中不可或缺的工具。它们大大简化和加速了这一过程。 例如&#xff0c;使用GitHub Copilot&#xff0c;可以根据任务描述自动生成重复的代码部分。神经网络可以创建和运行测试&#xff0c;识别错误&#xff0c;甚至提出修复错误的方法…

数据库管理软件Navicat Premium介绍

1、点击连接 2、主界面 3、软件版本 待续...

【ZYNQ】VDMA 的使用

VDMA, Video Direct Memory Access 是 Xilinx 官方提供的高速内存存取 IP,采用 AXI4-Stream 与 AXI4 协议实现存储映射接口(Memory Map)与非存储映射接口(Non-Memory Map)接口的转换,主要用于视频数据缓存,同时提供帧缓存与帧同步控制功能。本文主要介绍 AXI VDMA 的配置…