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

news2024/11/24 3:24:40

一.类的引入

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;
}

 

 

 

 

 

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

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

相关文章

时间复杂度考点总结

【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;所以循环次数…

wy的leetcode刷题记录_Day82

wy的leetcode刷题记录_Day82 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-6 前言 目录 wy的leetcode刷题记录_Day82声明前言2917. 找出数组中的 K-or 值题目介绍思路代码收获 143. 重排链表题目介绍思路代码收获 146. LRU 缓存…

【C/C++】结构体内存对齐 ----- 面试必考(超详细解析,小白一看就懂!!!)

目录 一、前言 二、引出 ---- 结构体内存对齐 &#x1f34e;结构体偏移量计算&#xff1a;offsetof &#x1f95d;结构体内存对齐详解 &#x1f4a6;规则介绍&#xff08;重点&#xff01;&#xff01;&#xff09; &#x1f4a6;例题解析 三、习题演练 &#x1f34d;练习① …

Vue.js+SpringBoot开发森林火灾预警系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

JAVA毕业设计633—基于Java+ssm的医院挂号系统(源代码+数据库+11000字论文+开题)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于Javassm的医院挂号系统(源代码数据库11000字论文开题)633 一、系统介绍 本系统分为管理员、医生、用户三种角色 1、用户&#xff1a; 注册、登录、医生预约、评价、收藏、健…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

循环神经网络(RNN)算法详解

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 引言 在之前的博文中&#xff0c;我们探讨了全连接神经网络&#xff08;FCNN&#xff09;和卷积神经网络&#xff08;CNN&#xff09;的结构&am…

C及C++每日练习(2)

1.选择&#xff1a; 1.使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A.%-30.4e B.%4.30e C.%-30.4f D.%-4.30 在上一篇文章中&#xff0c;提到了…

Miniconda3迁移(附图详细过程)

背景&#xff1a; 磁盘占满了&#xff0c;本来根目录下是100%&#xff0c;所以想着将conda的环境换个大点的盘&#xff0c;我这里是将miniconda3从[ / ]移到了[ /data1 ] 解决方法&#xff1a; 1.首先停止所有与miniconda相关进程 conda deactivate2.移动miniconda到新的目…

微信小程序开发系列(七)·如何实现小程序页面的快速跳转、小程序样式·尺寸单位rpx以及全局样式和局部样式的区别

微信小程序开发_时光の尘的博客-CSDN博客 目录 1. 小程序样式和组件介绍 2. 如何实现页面的快速跳转 3. 小程序样式尺寸单位rpx 3.1 使用px 3.2 使用rpx 4. 全局样式和局部样式 4.1 全局样式 4.2 局部样式 1. 小程序样式和组件介绍 在开发 Web网站的时候&am…

【学习笔记】卫星基础知识

一、什么是卫星以及它如何工作&#xff1f; 通信卫星是一种人造卫星&#xff0c;通过使用转发器在源和接收器之间中继和放大无线电电信信号。卫星的工作原理是接收从地球发送的无线电信号并将无线电信号重新发送回地球。卫星使用从大型太阳能电池阵列收集的太阳能&#xff0c;…

利用axios库在Node.js中进行代理请求的实践

前言 随着互联网的蓬勃发展&#xff0c;Web应用程序越来越依赖于从外部服务器获取数据。在这个过程中&#xff0c;我们经常需要通过代理服务器来访问外部资源。本文将介绍如何充分利用axios库&#xff0c;在Node.js中进行代理请求的最佳实践&#xff0c;并通过一个实际案例来展…

安防视频监控系统EasyCVR新版本支持用浏览器直接播放视频流

智慧安防视频监控平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理。平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷传输&#xff0c;支持对外分发多格式的视频流&#…

【计算机考研择校】四川大学vs电子科技大学哪个难度更大?

川大在文科&#xff0c;经管方面比科大强&#xff0c;医学在国内都很强。但工科方面特别是电子信息领域明显是科大强于川大。毕竟一个是综合大学&#xff0c;一个是工科大学不可同日而语。 就业上&#xff0c;电子科大在IT领域的社会声誉口碑不错。就业一向都很好。这个多问问…

AES加密学习

AES&#xff08;高级加密标准&#xff09;是一种对称密钥加密算法&#xff0c;用于加密和解密数据。它被广泛应用于各种安全领域&#xff0c;包括但不限于网络通信、数据存储和软件保护。 历史背景 AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael算法演变而…

【YOLO v5 v7 v8 v9小目标改进】新CNN架构 InceptionNeXt:怎么让大卷积核既好用又快

新CNN架构 InceptionNeXt&#xff1a;怎么让大卷积核既好用又快 提出背景问题: 如何提高大核心卷积的效率&#xff0c;同时保持或提升模型性能&#xff1f; 改进思路MetaNeXtInception深度卷积InceptionNeXt 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背…

EC600模块通过AT指令接入阿里云物联网平台并发布属性

摘要&#xff1a;本文介绍一下如何通过EC600模块的AT指令&#xff0c;将设备属性值发送到阿里云物联网平台的方法。 这个模块供电可以是 5-16V 和电脑通过USB串口连接&#xff0c;4线即可。未来集成到自己的系统中的时候&#xff0c;可以直接发送指令即可。 使用的软件是FreeAT…

Apache ECharts数据可视化技术

介绍 官方地址:Apache ECharts 快速入门案例echarts.init //初始化方法 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件 --><script src"echart…

4.Rust中的所有权(Rust成名绝技)

Rust成名绝技 Rust 之所以能成为万众瞩目的语言&#xff0c;就是因为其内存安全性。在以往&#xff0c;内存安全几乎都是通过 GC 的方式实现&#xff0c;但是 GC 会引来性能、内存占用以及全停顿等问题&#xff0c;在高性能场景、实时性要求高和系统编程上是不可接受的&#x…

代码随想录-贪心算法

贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 455. 分发饼干 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;int sIndex s.length - 1;for (int i g.length - 1; i > 0; i--) …