C++--类和对象(一)

news2024/11/15 3:44:13

C++是一个面向对象的编程语言,而面向对象编程有四大特性:封装,抽象,继承,多态。类和对象就是对应其中的封装,在C++中将数据和对数据的操作都封装在一个class(类)的结构体中。

目录

类的定义:

访问限定符:

类域:

对象实例化:

对象的大小:

*this指针:


类的定义:

1.class为类的关键字,类名可以自己定,{};中为类的主体,在类体中的内容称为类的成员:类中定义的变量可以称为成员变量或类的属性,类中定义的函数被称为成员函数

2.C++中也可以使用struct定义类,C++兼容C中struct的用法,同时也可定义类,明显的变化就是struct中可以定义函数,但一般还是使用class定义类(两者还是有那么一丢丢小差别)

3.定义在类里的函数默认是内联函数(inline)

注意:

(1)        不管是class还是struct,{}的尾巴上的分号不能省略

(2)        如果不想将成员函数变成内联函数只要将函数的声明和定义分离开即可

class arr
{
public:
	int _z = 0;
	arr(int x=0,int y=0)
	{
		_x = x;
		_y = y;
		cout << "arr(int x,int y)" << endl;
	}
    //声明
	void add();
private:
	int _x;
	int _y;
};
//定义
void arr::add()
{
	cout << _x + _y << endl;
	cout << "add()" << endl;
}

访问限定符:

1.C++一种实现封装的方式,用类将对象的属性结合在一起,使得对象更加完善,通过访问权限可以选择性的开发接口给外部的用户使用

2.在上面的代码中使用public(公共)修饰的成员可以在类外面直接访问,而private(私有)则不行但成员函数可以访问,protected和private是⼀样的,但以后继承章节才能体现出他们的区别

3.访问权限的作用域在一个访问限定符出现后直到下一个访问限定符出现为止,都是属于该限定符属性的成员函数或成员变量,直到};也就是类的结束为止

4.类里没有定义访问限定符的情况下,class默认是私有(private),struct默认是共有(public)

5.一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会为public

调用上面的代码(用vs编译器示范):

可以看到我无法访问私有的成员,但是放在public(公有)的add函数和_z变量可以直接访问

类域:

1.定义类和定义一个命名空间一样都会产生域,也称为类域,在类外定义成员时,需要使用::作用域操作符来表示该成员属于哪个域 

2.类域和命名空间都是影响编译的查找规则,如果不表明该成员属于哪个域,编译器不会进到域里面查找,那么编译时就会报错。用::作用域操作符指明成员属于哪个域后在编译器知道了它是成员函数,在当前域中找不到就会进到类域里面去找

class arr
{
public:
	arr(int x=0,int y=0)
	{
		_x = x;
		_y = y;
		cout << "arr(int x,int y)" << endl;
	}
    //声明
	void add();
private:
	int _x;
	int _y;
};
//定义
//使用::声明是哪个类域
void arr::add()
{
	cout << _x + _y << endl;
	cout << "add()" << endl;
}

int main()
{
    arr a1(2,3);
    a1.add();
    return 0;
}

对象实例化:

类和对象,那么对象是什么,类就好比是一张房子图纸,它只能告诉你该怎么建,但建出来房子并不是图纸而是人,而建出来的房子过程就是对象实例化

1.用类类型在物理内存中创建对象的过程就是类实例化出对象

2.类是对象的一种抽象描述,它就只是限定了类的有哪些成员变量,但是!它们就仅仅只是声明,在没有实例化之前是不开空间的

3.一个类可以实例化多个对象,每个实例化的对象都各自占用实际空间

注意:类里面的成员函数只是被类域所限制了,实例化对象后,如果成员变量没有进行初始化但通过成员函数调用访问会出现随机数

对象的大小:

类实例化出的每个对象,都是独立的空间,所以对象大小肯定包含成员变量,那么问题来了,成员函数也会包含其中吗?首先函数被编译后是一段指令,对象中没法储存,这些指令储存在单独的区域(代码段),如果硬要储存的话就只能储存函数指针,但是真的有必要储存指针的必要吗?如果要实例化100个对象,那每个对象就都要存一次函数指针,这样就太麻烦了,所以对象的大小并不包含函数

注意:C++中类实例化的对象也要符合内存对齐的规则,如果类的定义中没有设立变量,那么这个对象的大小是1字节表示这个对象存在

*this指针:

1.*this指针是成员函数中特有的指针,编译器在编译后,类的成员函数默认都会在形参的第一个位置增加一个当前类型的指针也就是*this指针,用上面的add函数作示例,它的真实原型是:void add(arr*const this)

2.类的成员函数中访问成员变量本质都是通过*this指针访问的,就像上面代码的_x + _y,本质是:this->_x+this->_y;

3.C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针

class arr
{
public:
	arr(int x=0,int y=0)
	{
		_x = x;
		_y = y;
		cout << "arr(int x,int y)" << endl;
	}

	void add()//this指针不显示
    {     
	    cout << _x + _y << endl;
    	cout << "add()" << endl;
    }
private:
	int _x;
	int _y;
};

本篇文章到这里就结束了,希望本篇能够对刚接触到类和对象的读者提供帮助,谢谢你的阅读

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

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

相关文章

【C++二分查找】2187. 完成旅途的最少时间

本文涉及的基础知识点 C二分查找 LeetCode2187. 完成旅途的最少时间 给你一个数组 time &#xff0c;其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续 完成多趟旅途&#xff0c;也就是说&#xff0c;一辆公交车当前旅途完成后&#xf…

TCP如何建立长连接

文章目录 TCP建立长连接长连接和短连接长连接的优势TCP KEEPALIVE 心跳包心跳检测步骤 断线重连断线重连函数实现 实例服务端客户端程序功能演示效果 TCP建立长连接 长连接和短连接 长连接是指不论TCP的客户端和服务器之间是否有数据传输&#xff0c;都保持建立的TCP连接&…

Docker最佳实践(三):安装mysql

大家好&#xff0c;欢迎各位工友。 本篇呢我们就来演示一下如何在Docker中部署MySQL容器&#xff0c;可以按照以下步骤进行&#xff1a; 1. 搜索镜像 首先搜索MySQL镜像&#xff0c;可以使用以下命令&#xff1a; docker search mysql2. 拉取镜像 根据需求选择MySQL或Maria…

Oracle|DM 常用|不常用 SQL大口袋

目录 一、前言 二、SQL写法 1、sql获取某一条数据中的前一条和后一条 2、实现like多个值的查询&#xff08;Oracle和dm支持&#xff0c;MySQL未试过&#xff09; 3、start with connect by prior 使用方法 4、用hextoraw解决select、update、delete语句执行慢 5、ORA-00…

叉车数字化安全管理平台,安全管控升级,打造智慧监管新模式

近年来&#xff0c;国家和各地政府相继出台了多项政策法规&#xff0c;从政策层面推行叉车智慧监管&#xff0c;加大叉车安全监管力度。同时鼓励各地结合实际&#xff0c;积极探索智慧叉车建设&#xff0c;实现作业人员资格认证、车辆状态认证、安全操作提醒、行驶轨迹监控等&a…

场外个股期权的投资技巧:把握机遇与风险平衡

【来源&#xff1a;期权圈&#xff0c;场外个股每日询价】 在金融投资的领域中&#xff0c;场外个股期权作为一种新兴且具有吸引力的投资工具&#xff0c;为投资者提供了独特的机会和挑战。掌握有效的投资技巧&#xff0c;对于在这个领域中取得成功至关重要。 首先&#xff0c…

C++ | Leetcode C++题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map<string, priority_queue<string, vector<string>, std::greater<string>>> vec;vector<string> stk;void dfs(const string& curr) {while (vec.count(curr) &am…

How we design Kola

How we design Kola - ApiHugKola background, Kola a consumer driver tester frameworkhttps://apihug.com/zhCN-docs/kola/002_design_of_kola Kola background, Kola a consumer driver tester framework ​BDD 行为驱动开发(BDD)是一种软件团队工作方式,可以缩小业务人…

基于STM32F429移植UCOSIII

μC/OS-III&#xff08;Micro C OS Three&#xff09;是一个可升级的、可固化的、基于优先级的实时内核&#xff0c;它是Micrium公司出品的RTOS&#xff08;实时操作系统&#xff09;类实时操作系统的一个版本。以下是对μC/OS-III的详细描述&#xff1a; 1. 基本特性 多任务管…

智能制造与工业互联网有何关联?工业互联网如何推进智能制造?

随着信息技术的飞速发展&#xff0c;智能制造和工业互联网已经成为当今产业变革的核心。智能制造&#xff0c;以其深度融合的设计、生产、管理、营销和售后服务等环节&#xff0c;代表了先进制造模式的典范。而工业互联网则作为智能制造的神经中枢&#xff0c;通过连接机器、人…

【初阶数据结构题目】17.用栈实现队列

用栈实现队列 点击链接答题 思路&#xff1a; 定义两个栈&#xff1a;pushST&#xff08;入数据&#xff09;和popST&#xff08;出数据&#xff09; 假设我们要在队列里放123&#xff0c;出队列123 我们先在pushST里面放进去1 2 3 然后把pushST里面的数据拿到popST里面&#…

会务要闻|向绿提质:上市企业ESG评级提升

在全球市场对环境、社会和治理&#xff08;ESG&#xff09;指标的关注与日俱增的大背景下&#xff0c;中国正积极拥抱ESG理念&#xff0c;将其作为推动经济与社会全面绿色转型的催化剂&#xff0c;更被企业视为长期主义投资策略的基石。面对日益严格的国际ESG尽职调查要求&…

信息论在机器学习中的实际应用

目录 一、说明 二、什么是信息论&#xff1f; 2.1 信息论中的关键概念 2.2 熵与信息 2.3 相互信息 2.4 Kullback-Leibler 背离 三、信息论在机器学习中的应用 3.1 功能选择&#xff1a; 3.2 计算边际概率分布 3.3 决策树&#xff1a;Information 增益 3.4 评估具有 KL 背…

FastAPI+Vue3工程项目管理系统项目实战私教课 上课笔记20240808 课程和学习计划制定

学习目标 将Word和Excel做的东西放到数据库里面去工程类公司&#xff0c;甲方&#xff0c;劳务存到数据库存储的信息主要是人员的信息 基本信息&#xff1a; 人员信息&#xff0c;资料库&#xff0c;甲方的人出现在哪些项目上&#xff0c;考勤材料信息&#xff0c;进货记录&…

yolov5更换主干网络shufflent

目录 1.网络结构解析 1.1创建yolov5s_shufflent_v2_X0_5.yaml文件 2.对common.py末尾进行添加 3.修改yolo.py 1.网络结构解析 1.可以先看看shufflenet_v2的网络结构 import torch from torch import nn from torchvision import models from torchinfo import summaryclas…

利用vscode-icons-js在Vue3项目中实现文件图标展示

背景&#xff1a; 在开发文件管理系统或类似的项目时&#xff0c;我们常常需要根据文件类型展示对应的文件图标&#xff0c;这样可以提高用户体验。本文将介绍如何在Vue3项目中利用vscode-icons-js库&#xff0c;实现类似VSCode的文件图标展示效果。 先看效果&#xff1a; 一…

Flink任务提交流程和运行模式

任务提交流程 Flink 的提交流程随着部署模式、资源管理平台的不同&#xff0c;会有不同的变化。这里做进一步的抽象&#xff0c;形成一个大概高视角的任务执行流程图&#xff0c;如下&#xff1a; Flink按照集群和资源管理的划分运行模式有&#xff1a;Standalone、Flink On…

你是否陷入了惯性思维的陷阱?

如何突破惯性思维&#xff1f; 文 / 周妙錥&#xff08;MEOW EE CHEW&#xff09;13-02-2024 什么是惯性思维&#xff1f; 惯性思维&#xff08;Inertial Thinking&#xff09;是指我们在面对问题、决策或行为选择时&#xff0c;倾向于依赖过去的经验、习惯或想法&#xff0…

SubtitleEdit:一个基于.Net开发的开源字幕编辑器

现在是短视频的时代&#xff0c;对视频的字幕编辑需求非常多&#xff0c;今天介绍一个功能强大的开源视频字幕编辑器。 01 项目简介 Subtitle Edit 是基于.Net开发的开源项目&#xff0c;支持跨平台使用&#xff0c;包括Windows、Linux 和 macOS。这个软件不仅支持多种字幕格…

打开 Mac 触控板的三指拖移功能

对于支持力度触控的触控板&#xff0c;可以选择使用三指手势来拖移项目。 相应的设置名称会因你使用的 macOS 版本而有所不同&#xff1a; 选取苹果菜单  >“系统设置”&#xff08;或“系统偏好设置”&#xff09;。 点按“辅助功能”。 点按“指针控制”&#xff08;…