C++学习日记---第16天

笔记复习

1.C++对象模型

在C++中,类内的成员变量和成员函数分开存储

我们知道,C++中的成员变量和成员函数均可分为两种,一种是普通的,一种是静态的,对于静态成员变量和静态成员函数,我们知道他们不属于类的对象,事实上,非静态成员函数也即普通的成员函数也不属于类的对象。只有非静态成员变量也即普通的成员变量才属于类的对象。

下面是代码示例的完整代码:

#include<iostream>
using namespace std;class person {int m_A;static int m_B;void func() {}static void func1() {}
};void test01() {person p;cout << "size of p=" << sizeof(p) << endl;
}void test02() {person p;cout << "size of p=" << sizeof(p) << endl;
}int main() {test01();test02();system("pause");return 0;
}

在C++中,空对象的内存空间为一个字节,这是由C++编译器分配的,目的是为了区分空对象占内存的位置,这样每个对象都会有独一无二的内存地址,当我们删除person类中的代码运行程序后将会输出两个1

#include<iostream>
using namespace std;class person {
};void test01() {person p;cout << "size of p=" << sizeof(p) << endl;
}void test02() {person p;cout << "size of p=" << sizeof(p) << endl;
}int main() {test01();test02();system("pause");return 0;
}

 前面我们讲到只有成员变量才属于C++的对象,因此我们在空类的基础上写入成员函数,静态成员变量,静态成员函数,这个类的对象也依旧是空对象

#include<iostream>
using namespace std;class person {static int m_B;void func() {
}static void func1() {}
};void test01() {person p;cout << "size of p=" << sizeof(p) << endl;
}void test02() {person p;cout << "size of p=" << sizeof(p) << endl;
}int main() {test01();test02();system("pause");return 0;
}

 2.this指针

我们知道,当我们创建并调用类的对象时,这些对象会共用类中的成员函数,那么这些函数如何区分时哪个对象调用自己呢?这时候就有了this指针,C++通过提供this指针来解决该问题,。

this指针是一种特殊的指针,this指针指向被调用成员函数的所属的对象(this指向整个对象,而不只是对象里面的成员)。在非静态成员函数内部,你可以使用 this 指针访问调用对象的成员。this 实际上是当前类类型的指针,例如,对于类Kunkun的成员函数,this 是 Kunkun 类型的指针。

作用:

1)解决变量命名冲突

2)在类的非静态成员函数中返回对象本身,可使用return*this

(this指针还有更多用途,但过于复杂,这里不再介绍)

1)解决变量命名冲突

#include<iostream>
using namespace std;class person {
public:person(int age) {age = age;}int age;
};void test01() {person p1(18);p1.age = 18;
}int main() {test01();return 0;
}

在这份代码种,person有参函数中的age是赋值给形参,即形参赋值给形参,并没有将接收到的形参的值赋值给成员变量,因此成员变量未初始化,当我们运行这个代码的时候就会出现成员变量未初始化的问题,这时候我们需要使用this指针

#include<iostream>
using namespace std;class person {
public:person(int age) {this->age = age;}int age;
};void test01() {person p1(18);p1.age = 18;
}int main() {test01();return 0;
}

这里this指针指向被调用函数(person有参函数)所属对象(p1)的成员变量age,这样就把age区分开了,不过在实际的编程中我们会规范化命名尽量避免这种情况出现。

2)在类的非静态成员函数中返回对象本身,可使用return*this

#include<iostream>
using namespace std;class person {
public:person(int age) {this->age = age;}person& personaddage(person &p) {this->age += p.age;//将自身的年龄加上传入对象的年龄return *this;//this返回的是person类型的对象,因此函数要设置为person类型,&允许函数返回一个对象的引用而不是一个新的对象,返回对象的引用允许多个函数连续调用操作同一个对象}int age;
};void test02() {person p1(10);person p2(10);//链式调用:p2.personaddage(p1).personaddage(p1).personaddage(p1);//p2是对象,因此p2.personaddage(p1)语法正确,而如果没有return *this;//那么返回的数据类型就是int类型,int.personaddage(p1)不成立,因此需要返回对象cout << p2.age << endl;
}int main() {test02();return 0;
}

 细心的小伙伴可以发现,this指针指向一个值的时候我们修改了这个值,那么this指针能否修改指针的指向呢?答案是不能,因此this指针实际上是指针常量(指针指向的值可以改变,但指针的指向无法改变)

3.空指针访问成员函数

C++中空指针也可以访问成员函数

  1. 若成员函数中未使用到成员变量,可使用空指针调用该成员函数;

  2. 若成员函数中使用了成员变量,须对this进行判空操作,以防止程序崩溃。

对于第2点,也即C++无法用空指针来调用成员函数的成员变量

#include<iostream>
using namespace std;class person {
public:void showclassname() {cout << "this is person class" << endl;}void showpersonage() {if (this == NULL) {//没有判空操作时程序会报错return;}cout << "age=" << this->m_age << endl;//this指针指向p,p是一个空指针,是无法访问属性的}int m_age;
};void test01() {person* p = NULL;p->showclassname();p->showpersonage();
}int main() {test01();system("pause");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 每日一题 205.同构字符串

目录 问题描述 过题图片 示例 解决方案 代码实现 题目链接 总结 问题描述 给定两个字符串 s 和 t&#xff0c;判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t&#xff0c;那么这两个字符串是同构的。具体来说&#xff0c;每个出现的字符都应当映射…

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…

2.5 特征降维(机器学习)

2.5 特征降维 2.5.1 降维 降维&#xff1a;是指在某些限定条件下&#xff0c;降低随机变量&#xff08;特征&#xff09;个数&#xff0c;得到一组“不相关”主变量的过程。 ndarray 维数 嵌套的层数 0维 标量 1维 向量 2维 矩阵 3维 n维 二维数组 降低的维度…

【小白学机器学习41】如何从正态分布的总体中去抽样?比较不同的取样方差的差别

目录 1 目标&#xff1a;使用2种方法&#xff0c;去从正态分布的总体中去抽样&#xff0c;获得样本 1.1 step1: 首先&#xff0c;逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本&#xff0c;模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…

框架5:SpringBoot 2 - 核心功能

SpringBoot2 - 基础入门【一 ~ 五】&#xff0c;详见&#xff1a; 六、配置文件 6.1 properties文件格式 同之前的用法。 6.2 yaml文件格式【推荐】 YAML本意&#xff1a;“YAML”不是一种标记语言。但在开发中&#xff0c;实际把它理解为&#xff1a;“Yet Another Markup Lan…

行为型设计模式之《责任链模式》实践

定义 责任链模式&#xff08;Chain Of Responsibility Pattern&#xff09;顾名思义&#xff0c;就是为请求创建一条处理链路&#xff0c;链路上的每个处理器都判断是否可以处理请求&#xff0c;如果不能处理则往后走&#xff0c;依次从链头走到链尾&#xff0c;直到有处理器可…

Vue前端开发-路由树配置

一个配置路由的文件由导入路由模块、创建路由对象和导出路由对象三个部分组成&#xff0c;在创建路由对象时&#xff0c;需要构建路由数组&#xff0c;路由数组中包括一级、二级和多级路由结构&#xff0c;因此&#xff0c;这种结构的路由配置&#xff0c;又称为路由树配置。 …

2.mysql 中一条更新语句的执行流程是怎样的呢?

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。 相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又…

JavaScript根据数据生成柱形图

分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform&#xff0c;里面定义了两种操作&#xff0c;一个是将图像转换为Tensor&#xff0c;一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集&#xff0c;这个函数有四个常见的…

【AI系统】代数简化

代数简化 代数简化&#xff08;Algebraic Reduced&#xff09;是一种从数学上来指导我们优化计算图的方法。其目的是利用交换率、结合律等规律调整图中算子的执行顺序&#xff0c;或者删除不必要的算子&#xff0c;以提高图整体的计算效率。 代数化简可以通过子图替换的方式完…

多人聊天室项目 BIO模型实现

BIO模型聊天室项目大体设计 BIO编程模型 Acceptor是服务器端负责监听具体端口的Socket每有一个客户端Client连接到服务器端&#xff0c;Acceptor就创建一个新的线程Handler来处理客户端发送的消息每一个客户端都有一个唯一的Handler来对应处理其事务为保证线程安全&#xff0c…

腾讯云平台 - Stable Diffusion WebUI 下载模型

1&#xff09;进入控制台&#xff0c;点击算力连接 》 JupyterLab 2&#xff09;进入模型目录&#xff08;双击&#xff09; 3&#xff09;上传模型 例如&#xff1a;我要上传大模型

夜神模拟器+Charles+postern+Mgisk+TrustMeAlready实现抓包

[实测有用]夜神模拟器CharlesposternMgiskTrustMeAlready实现抓包 PS:此贴仅做为技术交流,禁止非法用途。 1.初始化条件 A.安装MUMU模拟器安卓12版本 B.按图示选择&#xff0c;设置好代理端口8889 C.查看本机IP地址 D.导出证书&#xff0c;安装配置&#xff0c;暂时保存…

【closerAI ComfyUI】物体转移术之图案转移,Flux三重控制万物一致性生图,实现LOGO和图案的精准迁移

更多AI前沿科技资讯,请关注我们:closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性! 【closerAI ComfyUI】物体转移术之图…

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力&#xff0c;贯彻落实“百县千镇万村高质量发展工程”&#xff0c;推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展&#xff0c;充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…

vue+mars3d给影像底图叠加炫酷效果

话不多说&#xff0c;直接上效果图&#xff1a; 在这里墙体其实是有一个不太明显的流动效果 实现方式&#xff1a;这里我使用了PolylineEntityWallPrimitive&#xff0c;开始我用的是polygonEntity但是发现实现效果并不好&#xff0c;所有直接改用了线 map.vue文件&#xff1…

【模电】常见电路参数计算

1.恒流源输出电阻 2.射极电压跟随器输出电阻 3.差分放大电路 3.1差模特性 3.1.1差模输入电阻Rid 3.1.2差模输出电阻Ro 3.1.3差模电压增益Avd 3.2共模特性 3.2.1共模输入电阻Ric 3.2.2共模电压增益Avc 4.组合放大电路 4.1单级放大器 4.1.1微变等效电路 4.1.1.1共射级 4.1.…

Linux-虚拟环境

文章目录 一. 虚拟机二. 虚拟化软件三. VMware WorkStation四. 安装CentOS操作系统五. 在VMware中导入CentOS虚拟机六. 远程连接Linux系统1. Finalshell安装2. 虚拟机网络配置3. 连接到Linux系统 七. 虚拟机快照 一. 虚拟机 借助虚拟化技术&#xff0c;我们可以在系统中&#…

Kafka如何保证消息可靠?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何保证消息可靠&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka如何保证消息可靠&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka通过多种机制来确保消息的可靠性&#xff0c;主要包…