C++之类(持续更新)

1、类的基础知识点

1.1、类和对象

        和C中的结构体不同,在C++类中不仅可以定义变量,也可以定义函数。【在C++结构体中也可以定义变量和函数,但是一般情况下都使用类】。

        类的成员属性默认都是private;结构体的成员属性默认都是public。

class student
{
public:
	// 共有成员(外部接口,可被使用该类的所有代码所使用的)
	student();
	~student();
	void set_age(int age_t);
private:
	// 私有成员(只允许本类中的函数访问,而类外部的任何函数都不允许访问)
	char name[50];
	int age;
protected:
	// 保护成员(与private类似,差别表现在继承与派生时)
};

        类中的元素称为类的成员;类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。

1.2、类中成员函数定义

(1)声明和定义都放在类体中

// .h文件中
class student
{
public:
	// 共有成员(外部接口,可被使用该类的所有代码所使用的)
	student();
	~student();
	void set_age(int age_t)
    {
        age = age_t;
    }
private:
	// 私有成员(只允许本类中的函数访问,而类外部的任何函数都不允许访问)
	char name[50];
	int age;
protected:
	// 保护成员(与private类似,差别表现在继承与派生时)
};

(2)声明和定义分离

// .h文件中
class student
{
public:
	// 共有成员(外部接口,可被使用该类的所有代码所使用的)
	student();
	~student();
	void set_age(int age_t);
private:
	// 私有成员(只允许本类中的函数访问,而类外部的任何函数都不允许访问)
	char name[50];
	int age;
protected:
	// 保护成员(与private类似,差别表现在继承与派生时)
};
// .cpp文件中
void student::set_age(int age_t)
{
	age = age_t;
}

1.3、类的作用域

        C++类重新定义了一个作用域,类的所有成员都在类的作用域中。在类外使用成员时,需要使用 ::(作用域解析符)来指明成员属于哪个类。

1.4、实例化

        用类去创建对象的过程,称为类的实例化。类只声明了类有哪些成员,而并没有为成员分配内存空间。一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

        类是对象的抽象和概括,而对象是类的具体和实例。

1.5、类对象的存储方式

C++程序占用的内存通常分为四个区:

        代码区(code area):存放着程序的二进制代码,由操作系统管理。

        全局区(static area):存放全局变量,静态变量,以及常量(字符常量和const修饰的全局变量)。

        栈区(stack area):存放所有的局部变量,其空间分配释放由编译器管理,当函数结束,局部变量自动被释放。

        堆区(heap area):存放所有动态开辟的变量,其空间分配释放由程序员管理。

类对象存储如下:

在类定义时:

        类的成员函数是被放在代码区。

        类的静态成员变量是存储在静态区的,即实例化的对象并不包括静态变量的创建。

        类的静态成员变量,在类的实例化过程中才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。

#include <iostream>
using namespace std;

class student_1
{
public:
	void set_age(int age_t);
private:
	char name[50];
	int age;
	static char aa[8];
}std_1;

class student_2
{
public:

private:
	char name[50];
	int age;
}std_2;

class student_3
{
}std_3;

int main(int argc, char argv[])
{
	cout << "  " << sizeof(std_1) << endl;
	cout << "  " << sizeof(std_2) << endl;
	cout << "  " << sizeof(std_3) << endl;
	return 0;
}

输出:

56
56
1

结论:

        一个类的大小,实际就是该类中“成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。

注意:

        这里的成员变量之和并不是简单的字节数相加,而是还要遵循内存对齐规则。

1.6、this指针


#include <iostream>
using namespace std;

class student
{
public:
	void set_id(int grade_id__t, int class_id_t);
	void display_id_0()
	{
		cout << "grade_id: " << grade_id << ", class_id: " << class_id << endl;
	}
	void display_id_1()
	{
		cout << "grade_id: " << this->grade_id << ", class_id: " << this->class_id << endl;
	}
private:
	char name[50];
	int age;
	int grade_id;
	int class_id;
};

void student::set_id(int grade_id__t, int class_id_t)
{
	grade_id = grade_id__t;
	class_id = class_id_t;
}

int main(int argc, char argv[])
{
	student std_1, std_2;
	std_1.set_id(10, 11);
	std_2.set_id(101, 34);
	std_1.display_id_0();
	std_1.display_id_1();
	std_2.display_id_0();
	std_2.display_id_1();

	return 0;
}

结果为:

grade_id: 10, class_id: 11
grade_id: 10, class_id: 11
grade_id: 101, class_id: 34
grade_id: 101, class_id: 34

问题一:

        对于上述程序,std_1和std_2各自有不同的内存空间,而成员函数set_id中却并没有指定要对哪一个对象的成员进行操作,那么当std_1调用时函数是如何知道操作的对象是哪一个呢?

答:

        C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this指针的特性:

        this指针的类型:类的类型* const,this在函数体内不可修改。

        只能在“成员函数”的内部使用。

        this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针。

        this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

问题二:

        this指针的存储位置在哪里?

答:

        临时变量都是存储在栈上的,因此this指针作为形参,存储在栈区。

问题三:

        this指针可以为空指针吗?

答:

        this指针可以为空指针,但切忌通过nullptr去访问指向的数据。


#include <iostream>
using namespace std;

class student
{
public:
	void set_id(int grade_id__t, int class_id_t);
	void display_id()
	{
		cout << "grade_id: " << grade_id << ", class_id: " << class_id << endl;
	}
	void display()
	{
		cout << "grade_id and class_id" << endl;
	}
private:
	char name[50];
	int age;
	int grade_id;
	int class_id;
};

void student::set_id(int grade_id__t, int class_id_t)
{
	grade_id = grade_id__t;
	class_id = class_id_t;
}

int main(int argc, char argv[])
{
	student *std_1 = nullptr;
	std_1->display();         // 执行成功
	std_1->display_id();      // 执行失败
	return 0;
}

        成员函数display()执行成功,而成员函数display_id()执行失败。首先nullptr地址我们是没有访问权限的,非法访问会使程序崩溃。

        display()执行成功,因为访问的是成员函数,成员函数不在对象内,就不会对指针解引用,std_1->的作用仅仅是指明了函数的类域,而函数内也没有使用到this指针,所以不会报错。

        display_id()执行失败,是因为在打印的时候调用了成员变量grade_id和class_id,而std_1又指向了nullptr,相当于访问了nullptr地址处的数据,因此程序崩溃。

2、

3、

4、

5、

End、结语

感谢参考的文档;参考的文档太多,不做一一列举。

感谢大家提供的建议;

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

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

相关文章

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

特殊文件——属性文件、XML文件

目录 特殊文件 ——属性文件、XML文件 特殊文件的作用 需要掌握的知识点 Properties文件 ​编辑 构造器与方法​编辑 使用Properties 把键值对数据写出到属性文件中 ​编辑 XML文件​编辑 XML文件的作用和应用场景 解析XML文件 使用Dom4J框架解析出XML文件——下载…

EXCEL+PYTHON学习3

1&#xff09; 遍历一个SHEET&#xff0c;无非就是两个循环&#xff0c;rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2&#xff09; 返回工作表的最小行数…

TCP/IP协议栈

TCP/IP协议栈&#xff08;Transmission Control Protocol/Internet Protocol Suite&#xff09;是互联网上进行数据通信的一系列网络协议的集合&#xff0c;它是现代计算机网络通信的基础架构。 它由多个不同的协议层构成&#xff0c;每层负责不同层面的数据处理和传输工作&…

PyQt5使用

安装Pyqt5信号与槽使用可视化界面编辑UI (Pyside2)ui生成之后的使用(两种方法)1 ui转化为py文件 进行import2 动态调用UI文件 安装Pyqt5 pip install pyqt5-tools这时候我们使用纯代码实现一个简单的界面 from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButto…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

openssl3.2 - note - Writing OpenSSL Provider Skeleton

文章目录 openssl3.2 - note - Writing OpenSSL Provider Skeleton概述笔记测试工程的建立复现的provider工程总结Provider包含的头文件openssl/core.h中的数据结构实现 OSSL_provider_init()看一下openssl自带的提供者provider的openssl命令行测试provider的本质是hook了opens…

RabbitMQ高级-高级特性

1.消息可靠性传递 在使用RabbitMQ的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式 1.confirm 确认模式 确认模式是由exchange决定的 2.return 退回模式 回退模式是由routing…

数据结构-红黑树

1.容器 容器用于容纳元素集合&#xff0c;并对元素集合进行管理和维护&#xff0e; 传统意义上的管理和维护就是&#xff1a;增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0e; 我们分析每种类型容器时&#xff0c;主要分析其增&#xff0c;删&#xff0c;改&#xff…

NFTScan 正式上线 Blast NFTScan 浏览器和 NFT API 数据服务

2024 年 3 月 15 号&#xff0c;NFTScan 团队正式对外发布了 Blast NFTScan 浏览器&#xff0c;将为 Blast 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Blast 是继 Bitcoin、Ethereum、BNBChain、…

wifi7有哪些新特性?看这份文档

更多内容在 这是H3C发布的关于wifi7的介绍文档。 回顾802.11协议发展历程&#xff0c;初版802.11协议速率仅为2Mbps。802.11b使用新的编码形式&#xff0c;将速 率提升到11Mbps。802.11a利用新的5GHz频段&#xff0c;引入OFDM技术并采用64-QAM调制将无线速 率提升到54Mbps。80…

sqllab第二十六关通关笔记

知识点&#xff1a; 空格替换 %09 %0a %0b %0c %0d %a0 (%2b)or替换&#xff1a;|| ||是不需要空格区分的and替换&#xff1a;&& &&同样不需要空格区分的双写绕过&#xff0c;但是绕过后需要和内容进行空格区分的&#xff0c;要不然不发挥作用&#xff1b;这关…

免费阅读篇 | 芒果YOLOv8改进113:注意力机制ShuffleAttention:深度卷积神经网络的随机注意力

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 该篇博客为免费阅读内容&#xff0c;YOLOv8ShuffleAttention改进内容&#x1f680;&…

矩阵中移动的最大次数

文章目录 所属专栏:BFS算法 题目链接 思路如下&#xff1a; 1.首先我们需要从第一列开始遍历&#xff0c;寻找每一个都能够满足条件的位置&#xff0c;将它插入到数组里面 2.第一列遍历完了后我们先判断第一列的数是否都满足条件插入到数组里面&#xff0c;如果数组为空&#…

JAVA13多行文本java14模式变量

文章目录 多行文本模式变量 多行文本 在JAVA13中&#xff0c;终于是支持多行文本字面量了。而且最关键的是为了源代码更加美观&#xff0c;还自动去掉了每行文本前面的空格。如下面的例子&#xff1a; public class MultilineStringDemo {public static void main(String[] ar…

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层&#xff0c;允许你在类 Unix 操作系统&#xff08;包括 Ubuntu&#xff09;上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤&#xff1a; 在 Ubuntu 上安装 Wine&#xff1a; 更新软件包列表&#xff1a; 打开终端并运行以下命令以…

【Miniconda】一文了解conda虚拟环境的作用

【Miniconda】一文了解conda虚拟环境的作用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支持~ &am…

macOS 安装 NetLogo 6.4.0

netlogo 下载地址 NetLogo-6.4.0.dmg参考 netlogo 官网

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…

快递批量查询神器:一键解锁物流数据,高效管理轻松实现!

在这个信息爆炸的时代&#xff0c;拥有「多维度快递查询分析工具」&#xff0c;就意味着拥有了洞悉市场脉动的能力。让您的商业决策更加明智&#xff0c;让您的企业在竞争中脱颖而出。现在就加入我们的行列吧&#xff01;一键掌握物流数据&#xff0c;洞悉市场脉动&#xff0c;…