c++的学习之路:5、类和对象(1)

news2024/11/24 10:48:26

一、面向对象和面向过程

在说这个定义时,我就拿c语言举例,在c语言写程序的时候,基本上就是缺什么函数,就去手搓一个函数,写的程序也只是调用函数的,而c++就是基于面向对象的开发,他关注的不再是单单的程序编写,在c语言编程过程中,我当时学习时,记得特别清楚的一句话就是,把这道题目分析一下,有几种情况,有什么极端条件,然后去根据问题写函数,在调用,就是一个面向过程的开发,而c++就是比较注重,把这个问题拆分成几块,中间有什么联系,去进行交互的,不需要关注类似于c语言的栈是怎么实现的,这个就是面向对象。

二、类的定义

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:
之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数,如下方代码所示,可以看出利用c语言创造结构体的方式可以在struct里面写一个函数,这就是一个类,但是c++兼容c所以可以这样写,但是c++一般喜欢利用class来表示这个类。

#include <iostream>
using namespace std;

struct t
{
	int test1()
	{
		return 1;
	}
};

int main()
{
	t t1;
	cout << t1.test1() << endl;
	return 0;
}

 如下图可以看出在我把struct换成class后编译就会报错,这是为啥?这是因为c++是面向对象的,在使用过程中肯定有一些不想让别人使用的东西,这时c++ 就提出了一个公有私有保护的概念,这里先介绍私有和公有,就是用两个英文单词中private和public一个是私人的,一个是公有的,就是在public后面就是别人可以访问的,在private后面就是不能访问的,如下方代码与图二所示可以看出,把函数放在公有区就可以正常访问了,而在这个类的里面虽然变量在后面,但是函数依然可以访问,在c++中类中函数与变量如果没定义的话,就会默认为私有。

  

class t
{
public:
	int test1()
	{
		return a+b;
	}
private:
	int a = 1;
	int b = 2;
};

int main()
{
	t t1;
	cout << t1.test1() << endl;
	return 0;
}

还有我们定义变量名一般都不是abcd这样,最起码都是英文单词,例如data数据,但是在进行更改变量时,如下代码该咋办,会不会很不好,这时可以更改下变量名,例如mydata,但是一般都是使用_data,我看到很多书中都是这么写的代码,上网搜了下,才知道是为了区分自己代码中变量和别的地方别冲突,这样可读性就会变高,如下方第二个代码所示

class Test
{
public:
    
    void Test(int data)
    {
        data = data;
    }

private:
    int data;
};

class Test
{
public:

    void Test(int data)
    {
        _data = data;
    }

private:
    int _data;
};

三、类的限定符及封装

上文已经说了类是有私有和公有的,就是类的访问限定符,访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别,这里总的说一下有五点,如下:

1. public修饰的成员在类外可以直接被访问

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4. 如果后面没有访问限定符,作用域就到 } 即类结束。

5. class的默认访问权限为private,struct为public(因为struct要兼容C)

面向对象的三大特性:封装、继承、多态。在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理,让用户更方便使用类,简单来说就是我把类的函数放在一起,封装起来,你想用哪个我提供那个给你用。

四、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域,这里最明显的就是声明与定义分离时,是最明显的,这里如下代码所示,就是一个明显的使用,在类外面定义函数时需要加上作用域操作符,要不会访问不到的。

class Test
{
public:
    void test();
private:
    int _data1;
    int _data2;
};

void Test::test()
{
    
}

五、类的实例化

用类创建对象的过程就是实例化,我想了感觉咋说都有点变扭,最后想出来,实例化就有点像我在这里存在过,这里说明这个类就是实实在在的占了内存的空间,就是和人一样存在这里,是一个实实在在存在的,这个就是实例化,就如下方代码T1就是利用Test创建了一个T1,这里就是一个实例化。

class Test
{
public:
    void test();
private:
    int _data1;
    int _data2;
};

void Test::test()
{
    
}

int main()
{
    Test T1;
    return 0;
}

六、类的对象模型

首先讲到这里肯定要计算下类的大小,这里类的计算就是只计算变量,不计算函数,这里的计算方式和c语言中的结构体计算一样就不过多解释了,对齐规则如下。

1. 第一个成员在与结构体偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

类的函数时放在公共的代码段中,如果不是在代码段中,每一次创建类的时候就会非常占内存所以,这里就是放在代码段里面,然后每次都去调用。

七、tihs指针

比方说在一个类的传参中,是如何进行传参的?在c语言中是利用指针进行传参,这里只需要调用是什么原理,这时我看到了this指针,这个就是c++里面的在传参过程中,是编译器调用了一个指针,叫做this他就代表这个类,但是这指针我们可以定义吗,如下方代码可以看出这是个正常使用的并且正常打印了,结果如下图。

struct Test
{
public:
	void test(int data1, int data2)
	{
		_data1 = data1;
		_data2 = data2;
	}
	void print()
	{
		cout << _data1 << ' ' << _data2 << endl;
	}
private:
	int _data1;
	int _data2;
};

int main()
{
	Test T1;
	T1.test(1, 2);
	T1.print();
	return 0;
}

可是他是如何知道我要打印的是T1的数据呢,这时如果把this指针带上结果是啥?报错吗?可以看出下图输出正常。

 

可是如果把this定义在形参里还可以正常使用吗,可以看出结果是报错了,可以看出,他是有一个隐藏的指针this支持使用,但是不能定义。

最后说一下this指针的四个特性:

1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。

2. 只能在“成员函数”的内部使用

3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。

4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递 

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

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

相关文章

AXI Memory Mapped to PCI Express 学习笔记(五)—— Test Bench

本文包含有关Vivado Design Suite环境中提供的测试平台&#xff08;Test Bench&#xff09;的信息。 一、Endpoint的Root Port模型测试平台 PCI Express Root Port Model是一个强大的测试平台环境&#xff0c;它提供了一个测试程序接口&#xff0c;可以与提供的PIO设计&#…

【技术】实现MES系统与其他系统集成的关键步骤和技术

在当今数字化的制造环境中&#xff0c;MES系统&#xff08;制造执行系统&#xff09;已成为企业提高生产效率和管理水平的重要工具。然而&#xff0c;要实现MES系统与其他系统的集成&#xff0c;充分发挥其潜力&#xff0c;并非易事。本文将探讨实现MES系统与其他系统集成的关键…

Matplotlib数据可视化实战-2绘制折线图(2)

2.11营业额可视化 已知某学校附近一个烧烤店2022年每个月的营业额如下图所示。编写程序绘制折线图对该烧烤店全年营业额进行可视化&#xff0c;使用红色点画线连接每个月的数据&#xff0c;并在每个月的数据处使用三角形进行标记。 烧烤店营业额 月份123456789101112营业额/万…

8.HelloWorld小案例

文章目录 一、Java程序开发运行流程如何理解编译&#xff1f; 二、HelloWorld案例的编写1、新建文本文档文件&#xff0c;修改名称为HelloWorld.java。2、用记事本打开HelloWorld.java文件&#xff0c;输写程序内容。代码要跟我编写的完全保持一致。3、ctrl s 保存&#xff0c…

基于springboot实现图书个性化推荐系统项目【项目源码+论文说明】

基于springboot实现图书个性化推荐系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个图书个性化推荐系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”&#xff0c;组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…

技术导读 | 如何为SecOps插上AI的翅膀

随着数字经济的蓬勃发展&#xff0c;数据安全和网络安全的重要性日益凸显。在数字经济时代&#xff0c;数据已成为企业的核心资产&#xff0c;而网络安全则是保障数据安全的基石。然而&#xff0c;面对不断变化的攻击模式、扩大的攻击面以及日益复杂的安全事件&#xff0c;许多…

国内IP切换软件:解锁网络世界的新钥匙

在数字化快速发展的今天&#xff0c;互联网已成为我们生活中不可或缺的一部分。然而&#xff0c;伴随着网络使用的深入&#xff0c;许多用户逐渐意识到&#xff0c;不同的IP地址可能会带来截然不同的网络体验。为了应对这一问题&#xff0c;国内IP切换软件应运而生&#xff0c;…

阿里云倚天服务器是什么?倚天服务器c8y、g8y和r8y详细介绍

阿里云倚天云服务器CPU采用倚天710处理器&#xff0c;租用倚天服务器c8y、g8y和r8y可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持&#xff1a; 阿里云倚天云服务…

证书(公钥):网络安全的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【软考】UML中的图之状态图

目录 1. 说明2. 图示 1. 说明 1.状态图&#xff08;State Diagram&#xff09;展现了一个状态机。2.由状态、转换、事件和活动组成。3.关注系统的动态视图。4.对于接口、类和协作的行为建模尤为重要。5.强调对象行为的事件顺序。6.通常包括简单状态和组合状态、转换&#xff0…

TensorRT的两种INT8量化方式: QTA, PTQ

TensorRT的两种INT8量化方式: QTA, PTQ 深度学习 (DL) 模型的训练阶段包括学习大量密集的浮点权重矩阵&#xff0c;这导致推理过程中需要进行大量的浮点计算。 研究表明&#xff0c;可以通过强制某些权重为零来跳过其中许多计算&#xff0c;而对最终精度的影响很小。 与此同时…

【学习】企业申请DCMM原来有这么多的好处

DCMM&#xff0c;即数据管理能力成熟度评估模型&#xff08;Data management Capability Maturity Model&#xff09;&#xff0c;是我国在数据管理领域首个正式发布的国家标准。DCMM的核心目的是帮助企业利用先进的数据管理理念和方法&#xff0c;建立和评价自身的数据管理能力…

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

U盘未格式化?数据恢复大揭秘!

在日常办公和生活中&#xff0c;U盘已成为我们不可或缺的数据存储工具。然而&#xff0c;有时我们会遇到这样一个令人头疼的问题&#xff1a;原本正常使用的U盘&#xff0c;突然提示“未格式化”&#xff0c;里面的文件似乎都消失不见了。面对这种情况&#xff0c;很多人会感到…

[2021]Zookeeper getAcl命令未授权访问漏洞概述与解决

今天在漏洞扫描的时候蹦出来一个zookeeper的漏洞问题&#xff0c;即使是非zookeeper的节点&#xff0c;或者是非集群内部节点&#xff0c;也可以通过nc扫描2181端口&#xff0c;获取极多的zk信息。关于漏洞的详细描述参考apache zookeeper官方概述&#xff1a;CVE-2018-8012: A…

FPGA时钟资源详解(2)——Clock-Capable Inputs

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 1.1 为什么使用CC 1.2 如何使用CC 二、Clock-Capable Inputs 2.1 SRCC 2.2 MRCC 2.3 其他用途 2.3.1…

Day23 代码随想录(1刷) 二叉树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

安踏,步入“高端化”的甜蜜陷阱

文丨黄小艺 2023年3月14日&#xff0c;徐阳重回安踏担任CEO的第二天&#xff0c;就颇为急切地拉了一场高层会议。 面对在场的安踏老人们&#xff0c;徐阳提了两个很终极的问题&#xff0c;“是什么让过去30年的安踏获得了成功&#xff1f;”“未来30年&#xff0c;如果安踏想…

mysql80-DBA数据库学习1-数据库安装

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…