【C++】类与对象(上篇)

一.类的引入

C++与C语言比较起来,C++引入了一个新的概念,叫做。那么在C++中,类又是什么呢?

 在C++中,类与C语言中的结构体相似,但不同的是,C++中的类中,不仅可以定义变量,还能定义函数

同时C++为了兼容C语言,struct定义的结构体依然可以使用,并且C++中的struct定义结构体也能定义函数。

C++中定义类的两种方法

//用struct定义类
struct Date
{
	void Show()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

	int _year;
	int _month;
	int _day;
};

//用class定义类
class date
{
	void Show()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

	int _year;
	int _month;
	int _day;
};

在C++中,有两种方法来定义类,但是在C++中,用class来定义类更常见 。

二.类的定义

知道了C++中多了类,那么类一般是如何定义的?

一般来说,类的定义有两个方式。

函数的声明和定义放一起

类的成员函数的声明和定义都放在类中

class date
{
	void Show()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

	int _year;
	int _month;
	int _day;
};

需要注意的是,如果函数的声明和定义都放在一起,编译器可能会将函数当成内联函数来处理。 

函数的声明和定义分开 

 函数的声明在类中,而函数的定义单独放置

注意:在定义成员函数前,要在函数前面加类名。

class Data
{
public:
	void Show();

	int _year;
	int _month;
	int _day;
};

void Data::Show()
{
	cout << _year << "-" << _month << "-" << _day << endl;
}

三.类的访问限定符 

在C++类中,有三种访问限定符:public(公有的)private(私有的)protected(保护的)

public:public修饰的成员在那都能访问到。

private和protected:这两个修饰的成员只能在类中被访问。 

访问限定符的作用域,如下所示,从第一个访问限定符开始到下一访问限定符开始或类结束为结束。

class Data
{
public:
	void Show();
private:
	int _year;
	int _month;
	int _day;
};

struct和class定义类的区别

struct和class定义类的最大的区别是:

struct定义的类,默认访问限定符public,而class定义的类的默认访问限定符为private。 

四.类的实例化

类的实例化就是在内存中创建一块真实存在的空间来存放类的变量。 

#include<iostream>
using namespace std;

class Data
{
public:
	void Show();
private:
	int _year;
	int _month;
	int _day;
};

void Data::Show()
{
	cout << _year << "-" << _month << "-" << _day << endl;
}

int main()
{
	Data d1;//实例化类Data
	d1.Show();
	return 0;
}

五. 类实例化对象的大小计算

类实例化的大小只需要计算类的成员变量即可,一个实例化对象只会创建一块空间来存成员变量,而且存放规则跟结构内存对齐是一样的,不懂结构体内存对齐的同学,可以看看下面的博客,那么成员函数又存储在哪呢,类的成员函数是存放在内存中的公共代码段里。

那为什么要这样做呢?

【C语言】结构体内存对齐-CSDN博客

因为如果实例化一个类,这个类的成员函数与成员变量一起存放,那么如果实例化多个类就会浪费很多的空间,因为成员变量可以是不同的,而成员函数大家都是一样的,所以说只需要在内存中存放一个即可。

 

空类的大小

空类的大小默认为1,因为即使是空类,在实例化时都要在内存中开辟一块空间来表示占位。 

 

六.this指针

#include<iostream>
using namespace std;

class Data
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Show()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1;
	Data d2;
	d1.Init(2024, 3, 5);
	d2.Init(2024, 3, 6);

	d1.Show();
	d2.Show();
	return 0;
}

如上面代码所示,在我们初始化d1,d2时,明明函数参数没有对象d1,d2的指针或者引用,那么它们是怎么准确的给d1,d2赋值的呢。

这里面其实隐含着一个this指针,这个this指针存放着对象的地址。

#include<iostream>
using namespace std;

class Data
{
public:
	void Init(Data* this,int year, int month, int day)//隐含着this指针
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}

	void Show(Data* this)
	{
		cout << this->_year << "-" << this->_month << "-" << this->_day << endl;//隐含着this指针
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data d1;
	Data d2;
	d1.Init(&d1,2024, 3, 5);
	d2.Init(&d2,2024, 3, 6);

	d1.Show();
	d2.Show();
	return 0;
}

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最简单 导航栏 html css

dhl.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><link type"text/css" rel"stylesheet" href"css/dhl.css"></head><div class"dhl&quo…

java编程的简化表达方法——Lambda表达式及方法引用概述

前言&#xff1a; 学到简化写法了&#xff0c;感觉需要对代码非常熟悉才能用得好&#xff0c;整理下写法。打好基础&#xff0c;daydayup! Lambda表达式 Lambda表达式是JDK8开始新增得一种语法形式&#xff1b;作用&#xff1a;用于简化匿名内部类的代码写法。 Lambda表达式的格…

汉服文化平台网站|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的汉服文化平台网站设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 系统详细设计 前台首页功能模块 管理员功能 用户功能 系统结构设计 数据库设计 摘 要 研究内容 文末获取源码 系统详细设计 前台首页功能模块 管理员功能 用户功能 系统结构设计 数据库设计 论文参考 摘 要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台…

前端 css 实现标签的效果

效果如下图 直接上代码&#xff1a; <div class"label-child">NEW</div> // css样式 // 父元素 class .border-radius { position: relative; overflow: hidden; } .label-child { position: absolute; width: 150rpx; height: 27rpx; text-align: cente…

支持多平台,无需GPU!仅需8G内存即可部署运行大模型

随着ai技术不断发展&#xff0c;一直想本地运行一个大模型玩玩&#xff0c;奈何GPU价格不低...... 最近找到一款只需要8G内存即可运行的大模型&#xff0c;速度还挺快&#xff0c;特别分享出来。 本地安装前提 内存 8G 安装运行简要概述 首先运行服务端然后运出客户端即可本地…

06 - 镜像管理之:基础知识

1 了解镜像 Docker镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。 但注意&#xff0c; 镜像不包含任何动态数据&#…

Operator开发

概述 基于k8s做扩展的时候&#xff0c;一种典型方式则是 operator 开发&#xff0c;通过 CRD(CustomResourceDefinition) 来定义自定义资源&#xff0c;开发对应的 controller 来做业务控制&#xff0c;以期实现特定的业务需求。那么其本质是什么&#xff1f;是事件驱动。与我…

图像超分辨率:Fast Nearest Convolution for Real-Time Efficient Image Super-Resolution

9.Fast Nearest Convolution for Real-Time Efficient Image Super-Resolution 提出一种适用移动端的超分网络 一些tensor op 的推理时间 一些卷积结构的推理时间 网络结构NCNet 主干网络预测的是 残差&#xff0c;什么的残差&#xff1f; 是最近邻插值图像与 ground-truth的…

基于springboot+vue的疫苗发布和接种预约系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

时间复杂度考点总结

【2022统考真题】下列程序段的时间复杂度是( )。 int sum0; for(int il;i<n;i*2) for(int j0;j<i;j) sum; 这道题容易错选为C,正确答案是B 解答&#xff1a;i1时循环1次&#xff0c;i2时循环2次&#xff0c;i4时循环4次&#xff0c;所以循环次数…

Premiere快速闪光特效视频转场Pr项目模板视频剪辑素材

Premiere转场模板&#xff0c;包含15种快速闪光特效视频转场过渡效果PR项目模板视频剪辑素材&#xff0c;动态效果与动画纹理的组合方式。包含视频教程。提供4K和HD两种版本。来自PR模板网&#xff0c;下载地址&#xff1a;https://prmuban.com/38081.html

微信小程序-4

自定义组件 创建组件 在项目的根目录中&#xff0c;创建 components 文件夹&#xff0c;在里面编写我们的自定义主键&#xff0c;如下所示&#xff1a; 引用组件 局部引用&#xff1a; index.json // 在页面的 .json 文件中&#xff0c;引入组件 {"usingComponents&q…

区间合并(超详细逐步讲解/例题/思路分析/参考代码)

区间合并超详解 区间合并是什么&#xff1f;例1问题描述输入输出数据规模输入输出思路分析代码 例2问题描述输入输出数据规模输入输出思路分析代码 例3问题描述输入输出输入输出思路分析代码 例4问题描述输入输出输入输出参考代码 区间合并是什么&#xff1f; 我们要了解区间合…

下载中心-异步下载

下载中心 文章目录 下载中心一. 概要二. 实现逻辑 下载中心一. 概要二. 实现逻辑三. 主要代码逻辑1.生成任务2.消费任务3.查询方法是如何存入内存中的4.DCGenerateComponent 反射调用查询数据方法 总结 一. 概要 功能概览&#xff1a;将文件下载修改为异步下载&#xff0c;引入…

Ubuntu18.04安装RTX2060显卡驱动+CUDA+cuDNN

Ubuntu18.04安装RTX2060显卡驱动CUDAcuDNN 1 安装RTX2060显卡驱动1.1 查看当前显卡是否被识别1.2 安装驱动依赖1.3 安装桌面显示管理器1.4 下载显卡驱动1.5 禁用nouveau1.6 安装驱动1.7 查看驱动安装情况 2 安装CUDA2.1 查看当前显卡支持的CUDA版本2.2 下载CUDA Toolkit2.3 安装…

1.4 Word2Vec是如何工作的? Word2Vec与LDA 的区别和联系?

1.4 Word2Vec&#xff1a;词嵌入模型之一 场景描述 谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。 Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构&#xff0c;分别是CBOW(Continues Bag of Words)和Skip-gram。 知识点 Word2Vec,隐狄利克雷模型(LDA),…

软件测试之接口测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组…

通信网优岗位真实面经分享!

春招来临&#xff0c;不少网优人已经踏上了面试的征程。网优面试具体涉及哪些环节&#xff1f;主要问题有哪些&#xff1f; 本文收集并整理已经获得高薪offer的优橙学员的相关简历&#xff0c;为正在投递网优岗位的你提供经验&#xff0c;也希望网优人能早日找到满意工作。 通信…

uniapp 滑动页面至某个元素或顶部

直接上代码&#xff1a; uni.pageScrollTo({selector: #top, // 需要返回顶部的元素id或class名称duration: 300 // 过渡时间&#xff08;单位为ms&#xff09; }); 官方文档&#xff1a;

计及电池储能寿命损耗的微电网经济调度(matlab代码)

目录 1 主要内容 储能寿命模型 负荷需求响应 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约…