C++类和对象第一关

news2024/9/26 20:34:06

一:类的定义

(一)类的定义

(1)类的定义格式:

class name{
// 类成员变量
// 类方法(函数)
};

class是定义类的关键字,name为定义的类的名字,后面的花括号里面包含有两部分:成员变量成员函数

在c++中struct也可以定义类,有什么区别呢?

struct定义的类成员默认是public的,class定义的类默认是private的,struct照常可以定义结构体。

// 结构体
struct Stu {
	string _name;// 前置_
	float _height;// 后置_
	int _ID;//m_
	int _age;
};

// 学生类
struct Stu {
	// 成员变量
	string _name;
	float _height;
	int _ID;
	int _age;

	// 成员函数
	string GetName()
	{
		return _name;
	}
	int GetAge()
	{
		return _age;
	}
};

代码风格:为了使成员变量易于区分,通常在前面加_或者后面加_或者m_

class Stu {
	string _name;// 前置_
	float height_;// 后置_
	int m_ID;//m_
	int _age;

	// 成员函数
	string GetName()
	{
		return _name;
	}
	int GetAge()
	{
		return _age;
	}
};

(二)访问限定修饰符

访问限定修饰符是为了限制规定用户对类的使用权限

访问限定符有三个:

public

private

protected

public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问。

访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到}即类结束。

class Stu {
private:
	string _name;// 前置_
	float height_;// 后置_
	int m_ID;//m_
	int _age;

// private作用位置到这里
public:
	// 成员函数
	string GetName()
	{
		return _name;
	}

// 上一个public作用位置到这里
public:
	int GetAge()
	{
		return _age;
	}
};

代码风格:

⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。

(三)类域

上一篇C到C++基础知识入门提到C++中域有函数局部域,全局域,命名空间域,类域。
这里的类域就是其一种。因为类域也有隔离,所以,如果要在外部定义类的成员时要在类里面添加上声明,在定义的时候加上类的域解析(函数返回值+类名+函数名+::)

// 定义一个栈的类
class stack {
//private:
public:
	int _capacity;
	int* _arr;
	int _top;

public:
	// 函数声明
	void Init(int n = 4);// 缺省值给在声明里面
};

// 函数定义不在类里面就要使用::域解析运算符来定义
void stack::Init(int n)
{
	_arr = nullptr;
	_capacity = 0;
	_top = 0;
}

int main()
{
	stack st;
	st.Init();

	return 0;
}

二:对象——类的实例化

(一)对象的概念

(1)概念:对象是类的实例化,就像是一张设计图纸一样,根据图纸可以建造出很多的房子,而这里的房子就是对象,一张图纸可以建造出框架一样但是装修不一样的各式各样的房子,类和对象是一对多的关系。

(2)类也有空间,类在定义的时候就开辟了一段空间,遵从结构体内存对齐规则,它的大小在定义的时候就确定了。

(二)对象的大小

(1)对象和C的结构体一样,为了提高内存提取数据对的效率同样存从内存对齐规则。具体的内存对齐规则请看这篇文章结构体详解。

(2)对象只存储成员变量,不给成员函数分配空间,成员函数存储在代码段。

定义两个栈,有函数和没有函数大小都是一样的。

class stack {
	int _capacity;
	int* _arr;
	int _top;

	void init(int n)
	{
		_arr = nullptr;
		_capacity = 0;
		_top = 0;
	}
};

class stack2 {
	int _capacity;
	int* _arr;
	int _top;

	/*void init(int n)
	{
		_arr = nullptr;
		_capacity = 0;
		_top = 0;
	}*/
};

int main()
{
	stack st;
	stack2 st2;
	
	cout << "有函数:" << sizeof(st) << endl;
	cout << "没有函数:" << sizeof(st2) << endl;

	return 0;
}

(3)当对象没有成员的时候,会给对象分配一个字节的空间。

class stack {
	/*void Init(int n)
	{}*/
};

int main()
{
	stack st;
	
	cout << sizeof(st) << endl;

	return 0;
}

三:this指针

(1)定义:编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。

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

(3)this指针的定义:this指针是类类型的指针,默认使用const修饰,不可以修改,如:

this++;

这种是不行的

下面来看代码理解:

class Date {
private:
	int _year;
	int _month;
	int _day;

public:
	void init(int year, int month, int day) // 初始化
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}

	// 这里有一个影藏的this指针: void Print(Date* const this)
	void Print()
	{
		//this++;——这种是不允许的
		cout << this->_year << "/" << this->_month <<"/"<< this->_day << endl;
	}
};

int main()
{
	Date d1;
	Date d2;

	d1.init(2024, 06, 23);
	d1.Print();// 这里其实是隐含的&d1:Print(&d1)
	//这种是不允许的: d1.Print(&d1);不可以显示的使用

	d2.init(2034, 07, 03);
	d2.Print();// 同上,这里其实和C语言的函数传地址差不多

	return 0;
}

this指针是成员函数的形参,所以也不存储在对象中,有些编译器会存放在寄存器里(vs),一些会随函数存放到开辟的函数栈帧里。

欢迎留言讨论指出不恰当或者不对的地方。

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

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

相关文章

【高中数学/对数函数/零点】已知函数f(x)=1/x-log(2,x),在下列区间中,包含f(x)零点的区间是?

【题目】 已知函数f(x)1/x-log(2,x),在下列区间中&#xff0c;包含f(x)零点的区间是&#xff1f; A.(0,1) B.(2,3) C.(3,∞) D.(1,2) 【出处】 《高考数学极致解题大招》P136 第二题 中原教研工作室编著 【解答】 零点即01/x-log(2,x),移项得1/xlog(2,x) 两曲线y1/x…

【C++习题】2.双指针_移动零

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法&#xff08;快排的思想&#xff1a;数组划分区间 - 数组分两块&#xff09;&#xff1a;C 算法代码&#xff1a;图解 题目链接&#xff1a; 283.移动零 题目描述&#xff1a; 解法&#xff08;快排的思想&#xff1a;数…

聚铭下一代智慧安全运营中心荣获CNNVD兼容性资质证书

近日&#xff0c;聚铭网络旗下安全产品——聚铭下一代智慧安全运营中心正式通过了国家信息安全漏洞库&#xff08;CNNVD&#xff09;兼容性认证测试&#xff0c;荣获国家信息安全漏洞库兼容性资质证书。 关于CNNVD兼容性 国家信息安全漏洞库&#xff08;CNNVD&#xff09;是…

Iceberg 基本操作和快速入门

安装 Iceberg 是一种适用于大型分析表的高性能工具&#xff0c;通过spark启动并运行iceberg&#xff0c;文章是通过docker来进行安装并测试的 新建一个docker-compose.yml文件 文件内容 version: "3" services: spark-iceberg: image: tabulario/spark-iceberg co…

干部画像如何精准科学识别优秀干部

干部画像作为一种精准、科学的评价工具&#xff0c;在识别优秀干部方面发挥着关键作用。通过全面、深入、系统地收集、整理和分析干部的多维度信息&#xff0c;形成一幅反映干部综合素质和能力的立体画卷&#xff0c;为组织部门提供了详实可靠的依据。以下是干部画像在精准、科…

Colorful/七彩虹将星X15 AT22 2022 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

Exception in thread “main“ java.lang.CloneNotSupportedException 解决方案

目录 前言&#xff1a; 解决方案 后言&#xff1a; 结言&#xff1a; 前言&#xff1a; 今天在学习设计模式的时候&#xff0c;犯的一个错误。很低级的错误&#xff0c;不过也记录一下&#xff08;绝对不是想水文章&#xff09;。 解决方案 在使用克隆方法时抛出这个异…

2024年第五届电力工程国际会议(ICPE 2024)将在上海召开!

为了总结交流我国电力研究技术的最新研究成果&#xff0c;促进国内外电力技术发展与交流&#xff0c;开拓电力技术应用领域&#xff0c;将于2024年12月13-15日在 中国上海举办第五届电力工程国际会议 (ICPE 2024) 。 本次会议由IEEE、PES、上海电力大学主办&#xff0c;电子科技…

猜想的反例:DFS中结点顺序与后代关系的分析

猜想的反例:DFS中结点顺序与后代关系的分析 猜想分析与反例构造反例描述伪代码与C代码实现反例验证在图论中,深度优先搜索(DFS)是一种重要的图遍历算法,它可以生成一棵深度优先森林(DFS Forest),揭示结点之间的祖先-后代关系。本文探讨一个特定猜想:如果有向图G包含一…

Linux服务器安装Anaconda环境

Linux浪潮云服务器安装Anaconda环境 读研之后在导师的帮助下&#xff0c;获得了浪潮的一台公共云服务器。以后做实验跑代码就可以使用云服务器上的虚拟环境了。减少了自己笔记本的压力。在创建并保存完成镜像环境之后。最重要的就是安装好深度学习需要的Anaconda环境&#xff0…

vue-i18n在使用$t时提示类型错误

1. 问题描述 Vue3项目中&#xff0c;使用vue-i18n&#xff0c;在模版中使用$t时&#xff0c;页面可以正常渲染&#xff0c;但是类型报错。 相关依赖版本如下&#xff1a; "dependencies": {"vue": "^3.4.29","vue-i18n": "^9.1…

MES管理系统的工单管理功能模块有什么用

在当今制造业的快速发展中&#xff0c;企业对于生产流程的高效管理与优化需求日益迫切。MES管理系统作为集成了生产计划、物料追踪、工艺执行、设备监控以及质量管理等核心功能的综合性软件平台&#xff0c;正逐步成为企业转型升级的关键驱动力。MES管理系统不仅通过实时数据洞…

鸿蒙界面开发——组件(9):进度条Progress 滑动条Slider

进度条 (Progress) Progress(options: {value: number, total?: number, type?: ProgressType})其中&#xff0c;value用于设置初始进度值&#xff0c;total用于设置进度总长度&#xff0c;type用于设置Progress样式。 Progress有5种可选类型&#xff0c;通过ProgressType可…

必应bing搜索广告如何开户?投放需要多少钱?

网络营销已成为企业增长不可或缺的一部分&#xff0c;为了帮助企业更高效地触达目标客户&#xff0c;云衔科技携手必应Bing搜索引擎&#xff0c;提供专业、便捷的广告开户与代运营服务。无论您是希望扩大品牌影响力&#xff0c;还是提升产品销量&#xff0c;选择云衔科技&#…

阻塞型IO与非阻塞型IO

阻塞IO与非阻塞IO 一.IO模型 IO的本质是基于操作系统接口来控制底层的硬件之间数据传输&#xff0c;并且在操作系统中实现了多种不同的IO方式&#xff08;模型&#xff09;&#xff0c;比较常见的有下列三种 阻塞型IO模型非阻塞型IO模型多路复用IO模型(重点!重点!重点!) 二…

KVM 安装 Windows11

在 KVM 安装 Windows 比安装 Ubuntu 会复杂一些&#xff0c;去微软官网下载 Win11&#xff0c;同时要下载 Virtio 可以从 Fedora 下载 &#xff08;https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/&#xff09;。 安装Window 命令行输入以下命令&#xf…

uniapp数据缓存

利用uniapp做开发时&#xff0c;缓存数据是及其重要的&#xff0c;下面是同步缓存和异步缓存的使用 同步缓存 在执行同步缓存时会阻塞其他代码的执行 ① uni.setStorageSync(key, data) 设置缓存&#xff0c;如&#xff1a; uni.setStorageSync(name, 张三) ② uni.getSt…

Python 课程21-Django

前言 在当今互联网时代&#xff0c;Web开发已成为一项必备技能。而Python作为一门简洁、高效的编程语言&#xff0c;其Web框架Django以其强大的功能和快速开发的特点&#xff0c;受到了广大开发者的青睐。如果你想深入学习Django&#xff0c;构建自己的Web应用&#xff0c;那么…

呼吸自救防护器的使用方式

呼吸自救防护器是一种用于在紧急情况下提供呼吸保护的设备&#xff0c;通常用于矿井、化工厂、火灾等环境。当出现缺氧、有毒有害气体泄漏或烟雾等紧急情况时&#xff0c;呼吸自救防护器可以提供氧气或过滤空气&#xff0c;帮助使用者在短时间内安全呼吸&#xff0c;逃离危险区…

十大常用加密软件排行榜|2024年好用的加密软件推荐,企业必备!

在信息安全日益受到重视的当今&#xff0c;选择合适的加密软件对于企业保护敏感数据至关重要。以下是2024年十大常用加密软件排行榜&#xff0c;助您提升数据安全性。 Ping32 Ping32是一款功能强大的加密软件&#xff0c;支持多种文件格式加密&#xff0c;用户界面友好&#xf…