【C++第二课 - 类和对象上 - 入门知识】struct类、class类、访问限定符、this指针

目录

  • 面向过程与面向对象初步认识
  • 类的定义
    • struct定义类
    • class定义类
  • 类的访问限定符及封装
    • 访问限定符
  • 声明与定义分离
  • this指针
    • 类成员的命名问题
    • this
  • 类的实例化
  • 类的对象大小的计算
    • 成员函数为何不在对象里面
    • 类对象大小计算

面向过程与面向对象初步认识

C语言面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
在这里插入图片描述

类的定义

struct定义类

C++在C语言的基础上将struct升级成了类
1、struct使用上的升级,不用typedef就可以直接用类名,类名就是类型

struct Stack
{
	int* a;
	int top;
	int capacity;
};

int main()
{
	Stack s1;

	return 0;
}

在这里插入图片描述
2、类里面可以定义函数

struct Stack
{
	int* a;
	int top;
	int capacity;

	void Init()
	{
		a = nullptr;
		top = 0;
		capacity = 0;
	}

	void Push(int x)
	{
		//...
	}
};

int main()
{
	Stack s1;
	s1.Init();
	s1.Push(1);
	s1.Push(2);

	return 0;
}

class定义类

C++更喜欢用class定义类
用class之后会有不同,而这个不同就得因为访问限定符

class className
{
	// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号

类的访问限定符及封装

访问限定符

在这里插入图片描述
【访问限定符说明】
(1) public修饰的成员在类外可以直接被访问
(2) protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
(3) 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
(4) 如果后面没有访问限定符,作用域就到 } 即类结束。
(5) class的默认访问权限为private,struct为public(因为struct要兼容C)
私有与保护在继承那块有区别,这里可以先认为没有区别
在这里插入图片描述

声明与定义分离

C语言是函数放函数的声明,结构体直接在.h里面
C++类,类的成员放.h里面,类的函数只放声明
变量的声明与定义的区分,要看有没有开空间

Stack.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

class Stack
{
	int* a;
	int top;
	int capacity;

public:
	void Init();
	void Push(int x);
};
test.cpp
#include "Stack.h"

void Stack::Init()
{
	a = 0;
	top = 0;
	capacity = 0;
}

void Stack::Push(int x)
{
	//...
}

int main()
{
	Stack s1;
	s1.Init();
	s1.Push(1);
	s1.Push(2);

	return 0;
}

::这是域作用限定符
在这里插入图片描述
默认是内联,但也不一定会展开,最终展不展开还是看这个函数长不长、编译器的最终决定。
在这里插入图片描述

类规范定义:
长的函数声明与定义分离
短小的函数可以直接在类里面定义

this指针

类成员的命名问题

下列这个问题并不会报错,但d不会被初始化,解决方法:
(1)改变参数的名称(不常用)
(2)改变成员变量的名称(eg:_year,这根据每个公司可能会不一样)

在这里插入图片描述
在这里插入图片描述

this

编译器会处理成下列的样子,不能显示的写

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

public:
	void Init(Date* this, int year, int month, int day)
	{
		this -> _year = year;
		this -> _month = month;
		this -> _day = day;
	}
};

int main()
{
	Date d;
	Date d2;
	d.Init(&d, 2024, 1, 21);
	d2.Init(&d2, 2022, 10, 7);
	
	return 0}

类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
    有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个
    类,来描述具体学生信息。
    2.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  2. 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
    计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
    才能实际存储数据,占用物理空间
    在这里插入图片描述

类的对象大小的计算

类的大小只算成员变量的大小,成员函数不在对象里面。
在这里插入图片描述
在这里插入图片描述

成员函数为何不在对象里面

不同对象的成员函数是一样的
不同对象的成员变量是不一样的

因为成员函数用的都是一样的,如果每个对象都有成员函数,那么就白白浪费空间了。
在这里插入图片描述

类对象大小计算

要考虑内存对齐
内存对齐规定:
对于一个变量:要取其自己的对齐数与默认对齐数小的那个
这个类的大小是8
在这里插入图片描述

class Test2
{};

int main()
{
	Test2 B;
	return 0;
}

B的大小是 : 1,因为要占位。无成员变量的类(可以有成员函数),对象大小开一个字节,这个字节不存储有效数据,标识定义的对象存在过。
【C++第一课 - C++入门】相关软件(vs、gitee)、命名空间、输入输出流、缺省参数、函数重载、引用、内联函数、auto、范围for(语法糖)、nullptr

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

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

相关文章

线程和进程的区别(从JVM角度出发)

进程与线程的区别 线程具有许多传统进程所具有的特征&#xff0c;故又称为轻型进程(Light—Weight Process)或进程元&#xff1b;而把传统的进程称为重型进程(Heavy—Weight Process)&#xff0c;它相当于只有一个线程的任务。在引入了线程的操作系统中&#xff0c;通常一个进…

Linux 的提示符太长了,帮你精简一下

普通用户修改文件 ~/.bashrc 修改 50 行左右的代码&#xff0c;将两个w改为大写的W 如果是root用户则修改文件/root/.bashrc&#xff0c;同样的方法。

自然语言推断:注意力之注意(Attending)

注意&#xff08;Attending&#xff09; 第一步是将一个文本序列中的词元与另一个序列中的每个词元对齐。假设前提是“我确实需要睡眠”&#xff0c;假设是“我累了”。由于语义上的相似性&#xff0c;我们不妨将假设中的“我”与前提中的“我”对齐&#xff0c;将假设中的“累…

数据结构——循环链表

1.循环单链表 最后一个结点的指针不是NULL,而是指向头结点 单链表和循环单链表的比较&#xff1a; 单链表&#xff1a;从一个结点出发只能找到该结点后续的各个结点&#xff1b;对链表的操作大多都在头部或者尾部&#xff1b;设立 头指针&#xff0c;从头结点找到尾部的时间…

《Windows核心编程》若干知识点应用实战分享

目录 1、进程的虚拟内存分区与小于0x10000的小地址内存区 1.1、进程的虚拟内存分区 1.2、小于0x10000的小地址内存区 2、保存线程上下文的CONTEXT结构体 3、从汇编代码角度去理解多线程运行过程的典型实例 4、调用TerminateThread强制结束线程会导致线程中的资源没有释放…

代码随想录 Leetcode1047. 删除字符串中的所有相邻重复项

题目&#xff1a; 代码(首刷自解 2024年1月21日&#xff09;&#xff1a; class Solution { public:string removeDuplicates(string s) {if (s.size() < 2) return s;stack<char> t;for (int i 0; i < s.size(); i) {if (t.empty()) t.push(s[i]);else {if (s[i…

shell编程学习

shell编程学习 变量的高级用法变量替换字符串处理获取字符索引获取子串长度抽取字符串中的子串 案例测试 变量的高级用法 变量替换 ##变量替换&#xff08;贪婪&#xff0c;从前往后匹配&#xff0c;匹配到进行删除&#xff09; test1I love you,you love me echo $test1 han…

人工智能攻克奥数几何难题:AlphaGeometry 接近金牌选手水平

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

PLC物联网网关BL104实现PLC协议转MQTT、OPC UA、Modbus TCP

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 无缝衔…

更新Ubuntu并同步网络时间

ubuntu环境搭建专栏&#x1f517;点击跳转 Ubuntu系统环境搭建&#xff08;九&#xff09;——更新Ubuntu并同步网络时间 文章目录 Ubuntu系统环境搭建&#xff08;九&#xff09;——更新Ubuntu并同步网络时间1.更新Ubuntu1.1 查看ubuntu版本和详细信息1.2 创建root用户1.3 更…

jS-正则表达式(六)

• 介绍 什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象 使用场景&#xff1a; 1.例如验证表单&#xff1a;用户名表单只能输入英文字母、数字或者下划线&#…

【深度学习每日小知识】NLP 自然语言处理

自然语言处理 (NLP) 是人工智能 (AI) 的一个子领域&#xff0c;处理计算机和人类&#xff08;自然&#xff09;语言之间的交互。它涉及使用算法和统计模型使计算机能够理解、解释和生成人类语言。 NLP 是人工智能领域的重要工具&#xff0c;广泛应用于语言翻译、文本分类和聊天…

96.乐理基础-记号篇-装饰音记号(四)回音

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;95.乐理基础-记号篇-装饰音记号&#xff08;三&#xff09;波音-CSDN博客 理解了波音&#xff0c;再看回音会很简单。 回音&#xff1a;分两种类型 1.顺回音&#xff0c;样子如图1 2.逆回音&#xff0c;样子看图5…

(蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)

能够表示为某个整数的平方的数字称为“平方数 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。因为平方数的末位只可能是:0,1,4,5,6,9 这 6 个数字中的某个。所以&#xff0c;4325435332 必然不是平方数。 如果给你一个 2 位或 2 位以上的数字&am…

web蓝桥杯真题--12、由文本溢出引发的“不友好体验”

背景介绍 通常情况下&#xff0c;为保证布局的稳定性&#xff0c;以及遵循在有限的空间展示更多内容的原则&#xff0c;页面的某块区域不会随内容的增多而无限增高或增宽&#xff0c;一般会有一个约束。 例如&#xff1a;整体元素过多可以使用滚动条&#xff1b;文字内容过多…

企业级存储使用的SSD磁盘的健康度问题探讨

写在前面&#xff0c;我的主要工作是销售企业级存储系统的备品备件和提供一些额外的增值服务。谈到销售备件&#xff0c;很重要的就是备件质量了。现在SSD磁盘使用越来越广泛&#xff0c;对于SSD磁盘的健康度就是甲方爷爷们非常关心的一个问题。本文就是想梳理一下企业级SSD固态…

【前端设计】card

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

Android 基础技术——View 的宽高

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 View 的宽高 Activity Resume 的时候设置或者获取view的宽高是否有效? 回答&#xff1a;不确定。 首次 onResume 无效&#xff0c;二次 onResume 就有效了。 回顾「Android 基础技术——addView 流…

力扣509. 斐波那契数

动态规划 思路&#xff1a; 斐波那契数通式&#xff1a;F(n) F(n - 1) F(n - 2)&#xff1b;以此为状态转移方程&#xff0c;对其进行动态规划&#xff1b;边界条件&#xff1a; F(0) 0F(1) 1使用两个变量来存储上一组结果&#xff1b; class Solution { public:int fib(…

详解Python程序结构

Python是一种简单易学、功能强大的编程语言&#xff0c;它的程序结构简洁清晰&#xff0c;使得开发者能够高效地编写和维护代码。本文将重点介绍Python程序的结构&#xff0c;包括模块、包、函数、类等内容&#xff0c;以帮助初学者更好地了解Python的基本组织形式。 模块是Pyt…