【c++】类和对象1

1.面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完

在这里插入图片描述

2.类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:
之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,
会发现struct中也可以定义函数。

#include <iostream>using namespace std;struct stack
{void init(int capcity){_a = (int*)malloc(sizeof(int) * capcity);if (_a == nullptr){perror("malloc fail");return;}_capacity = capcity;_top = 0;}void Push(const int&data){// 扩容_a[_top] = data;++_top;}int Top(){return _a[_top- 1];}void Destroy(){if (_a){free(_a);_a = nullptr;_capacity = 0;_top = 0;}}int* _a;int _top; // 栈顶int _capacity;};int main()
{stack st;st.init(4);st.Push(1);st.Push(2);st.Push(3);int  ret = st.Top();st.Destroy();}

上面结构体的定义,在C++中更喜欢用class来代替。

3.类的声明与定义

1.上面的那种方法,定义和声明都在类里面
2.定义和声明分开
stack.cpp

#include <stdlib.h>#include"stack.h"void stack:: init(int capcity){_a = (int*)malloc(sizeof(int) * capcity);if (_a == nullptr){perror("malloc fail");return;}_capacity = capcity;_top = 0;}void stack::Push(const int& data){// 扩容_a[_top] = data;++_top;}int  stack::Top(){return _a[_top - 1];}void  stack::Destroy(){if (_a){free(_a);_a = nullptr;_capacity = 0;_top = 0;}}

stack.h

#pragma once
struct stack
{void init(int capcity);void Push(const int& data);int Top();void Destroy();int* _a;int _top; int _capacity;};

源.cpp

#include <iostream>
#include "stack.h"
using namespace std;int main()
{stack st;st.init(4);st.Push(1);st.Push(2);st.Push(3);int  ret = st.Top();st.Destroy();
}

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

在这里插入图片描述

4.类的访问限定符及封装

在这里插入图片描述
【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
    【面试题】
    解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
    定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
    默认访问权限是private。

5.类的作用域

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

struct stack
{void init(int capcity);void Push(const int& data);int Top();void Destroy();int* _a;int _top;int _capacity;};void stack:: init(int capcity){_a = (int*)malloc(sizeof(int) * capcity);if (_a == nullptr){perror("malloc fail");return;}_capacity = capcity;_top = 0;}

这里的init属于stack这个类域

6.类的实例化

1.用类类型创建对象的过程,称为类的实例化
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
3.做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
才能实际存储数据,占用物理空间

struct stack
{void init(int capcity);void Push(const int& data);int Top();void Destroy();int* _a;int _top; int _capacity;
};
int main()
{stack st;}

st就是类的实体化。

7.如何计算类对象的大小

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

sizeof(A1) : 4__ sizeof(A2) : 1__ sizeof(A3) : 1__

#include <iostream>using namespace std;
class A1 {
public:void f1() {}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中什么都没有---空类
class A3
{};
int main()
{printf("%d ", sizeof(A1));printf("%d ", sizeof(A2));printf("%d ", sizeof(A3));}

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

8.this指针的引出

#include <iostream>using namespace std;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 d1;date d2;d1.init(2023, 3, 11);d2.init(2023, 1, 12);d1.print();d2.print();}

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函
数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成。

【面试题】

  1. this指针存在哪里?
  2. this指针可以为空吗?

答:this指针存在栈区中(类中的函数存在代码段中).

#include <iostream>using namespace std;class date 
{  public:void init(int year, int month, int day){_year = year;_month = month;_day = day;}void print(){cout << _year << "-" << _month << "-" << _day << endl;}void func(){cout << "func()" << endl;}
private:int _year;int _month;int _day;};
int main()
{date d1;date d2;d1.init(2023, 3, 11);d2.init(2023, 1, 12);/*d1.print();d2.print();*/date* ptr = nullptr;ptr->func();//可以为空吗//正常运行//在代码段中找ptr->init(2001, 1, 1);//可以为空吗//运行崩溃(*ptr).func();//可以为空吗//正常运行//原理和第一个一样}

第一个空指针没有解引用
第二个空指针解引用导致崩溃

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

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

相关文章

编程江湖:Python探秘之旅-----Python 实用工具和库(七)

在一个普通的工作日&#xff0c;团队聚集在一起讨论如何提升开发效率。这时&#xff0c;林克斯加入了讨论&#xff0c;他是团队的技术专家&#xff0c;对 Python 的生态系统了如指掌。 林克斯&#xff1a;&#xff08;满怀热情地&#xff09;你们知道吗&#xff0c;Python 有一…

JavaScript高级程序设计读书记录(十二):函数

函数是ECMAScript中最有意思的部分之一&#xff0c;这主要是因为函数实际上是对象。每个函数都是Function 类型的实例&#xff0c;而 Function 也有属性和方法&#xff0c;跟其他引用类型一样。因为函数是对象&#xff0c;所以函数名就是 指向函数对象的指针&#xff0c;而且不…

[linux]编译一个ko文件并运行

一、需求 有一段代码需要在运行时加载注入内核中&#xff0c;当用户层需要访问时可以提供内核态环境去运行。 二、c代码构建 // #include <errno.h> // #include <string.h> // #include <stdio.h> // #include <fcntl.h> // #include <stdlib.h…

Windows安装Rust环境(详细教程)

一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio&#xff0c;但该工具占用空间大安装也较为麻烦&#xff0c;可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub&#xff1a;Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…

Formnext2024法兰克福3D打印增材制造展览会现正接受报名

Formnext2024法兰克福3D打印增材制造展览会现正接受报名 Formnext法兰克福国际精密成型及 3D 打印制造展览会将于2024年11月19日至22日在法兰克福举办。 Formnext法兰克福国际精密成型及 3D 打印制造展览会在2023年迎来了32,851名专业人士和管理人员(50%来自国际)&#xff0c…

Excel地址

解题思路&#xff1a; 根据题中歪歪和笨笨的话可以有两种解法。 1.输入的数为多大&#xff0c;则循环1多少次&#xff0c;当值为27时就要进行进位操作。这时要分情况讨论。 当集合中元素为一个时&#xff0c;如26&#xff0c;则需要变为1 1&#xff0c;集合元素个数加一。 当…

2023年全球软件质量效能大会(QECon上海站):核心内容与学习收获(附大会核心PPT下载)

会议聚焦于软件质量和效能的提升。在智能时代&#xff0c;随着数字化的深入人心&#xff0c;软件正在随着云计算、移动互联网、物联网等的发展而不断进化&#xff0c;软件对企业的发展愈加重要&#xff0c;大家对软件的质量要求也在从传统功能、性能、安全这些基础层面向着用户…

easyui datagrid无数据时显示无数据

这里写自定义目录标题 需求解决办法 需求 使用datagrid显示记录时&#xff0c;结果查询记录数为0&#xff0c;此时需要显示无数据。 示例代码 <table id"dg"></table>$(#dg).datagrid({url:datagrid_data.json,columns:[[{field:code,title:Code,widt…

【OCR】实战使用 - 如何提高识别文字的精准度?

实战使用 - 如何提高文字识别的精准度 我们在平常使用OCR的时候&#xff0c;经常会出现文字识别不精准的情况&#xff0c;我们改如何提高文字识别的精度呢&#xff1f; 以下是一些提高OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识…

(超详细)5-YOLOV5改进-添加A2Attention注意力机制

1、在yolov5/models下面新建一个A2Attention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn import functional as Fclass DoubleAttention(nn.Module):def …

coco数据集格式转yolo数据格式

一、coco数据集是什么&#xff1f; COCO&#xff08;Common Objects in Context&#xff09;是一个广泛使用的目标检测和分割数据集&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一种流行的实时目标检测算法。 首先&#xff0c;导入了必要的库&#xff0c…

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图&#xff1a; 当前是写前两个记号&#xff0c;其余记号后面写&#xff1a;这些反复记号最主要的目的很简单&#xff0c;还是为了节约纸张&#xff0c…

蓝桥杯单片机组备赛——LED指示灯的基本控制

&#x1f388;教程介绍&#xff1a;博客依据b站小蜜蜂老师的教程进行编写&#xff0c;文中会对老师传授的知识进行总结并加入自己的一些理解。教程链接 文章目录 一、点灯介绍二、相关数字芯片介绍2.1 74HC138介绍2.2 74HC573介绍2.3 74HC02介绍 三、代码设计思路四、代码编写…

Spring MVC 异常处理器

异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处…

解决跨域问题的8种方案(最新最全)

什么是跨域: 浏览器对于javascript的同源策略的限制,例如http://a.cn下面的js不能调用http://b.cn中的js,对象或数据(因为http://a.cn和http://b.cn是不同域),所以跨域就出现了.同域&#xff1a;简单的解释就是域名相同,端口相同,协议相同 为什么需要跨域&#xff1f; 在最一…

关于java方法定义的回顾

关于java方法定义的回顾 我们在上一篇文章中&#xff0c;对java的面向对象有了一个初步的理解&#xff0c;因为类里面方法是必不可少的&#xff0c;我们本篇文章对方法进行一个回顾&#xff0c;以便加深一下对方法的了解程度和使用&#x1f600;。 我们把前面讲解到方法的文章…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

Redis优化和解决缓存问题

目录 redis的2种持久化方式 RDB持久化 AOF持久化 redis优化 redis的三大缓存问题 缓存雪崩的解决方案&#xff1a; 缓存穿透的解决方案&#xff1a; 缓存击穿的解决方案&#xff1a; 如何保证 MySQL 和 redis 的数据一致性&#xff1f; redis的2种持久化方式 RDB持久化…

C桑(Cython)从入门到入土(2): np数组操作对比

C桑(Cython)从入门到入土 2. np数组操作对比 Node sc518 Copy has image data of type unsigned long long实际上, &#x1f446;&#x1f3fb;这个错误是我探索Cython的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针&#xff1a; cdef np.uint32_t[:,:,::1] …

The True Beauty; What is beauty;

Tiny syposis on Beauty Standards I) webpage addressII) text content excerption I) webpage address URL route II) text content excerption I am forensic artist 素描师&#xff08;法医的&#xff09;, worked for the San Jose Police Department 警局&#xff0c;f…