第三天之C++面向对象模型初探(this指针)

article/2025/9/11 12:13:33

前言

C++对象模型可以概括为以下2部分:

  1. 语言中直接支持面向对象程序设计的部分,主要涉及如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等。
  2. 对于各种支持的底层实现机制。
    在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数据和函数,来实现数据和函数直接的绑定。
    概括来说,在C++类中有两种成员数据:static、nonstatic;三种成员函数:static、nonstatic、virtual。
    在这里插入图片描述

基础知识

C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类。从计算机的角度,程序依然由数据段和代码段构成。
C++编译器如何完成面向对象理论到计算机程序的转化?
换句话:C++编译器是如何管理类、对象、类和对象之间的关系
具体的说:具体对象调用类中的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那?

//思考下面代码的运行结果#include "iostream"using namespace std;class C1
{
public:int i;  //4int j; //4int k;  //4
protected:
private:
}; //12class C2
{
public:int i;int j;int k;static int m; //4
public:int getK() const { return k; } //4void setK(int val) { k = val; }  //4protected:
private:
}; //24 16 12(铁钉的不对)struct S1
{int i;int j;int k;
}; //struct S2
{int i;int j;int k;static int m;
}; //int main()
{printf("c1:%d \n", sizeof(C1));printf("c2:%d \n", sizeof(C2));printf("s1:%d \n", sizeof(S1));printf("s2:%d \n", sizeof(S2));system("pause");
}

在这里插入图片描述
通过上面的案例,我们可以的得出:
1)C++类对象中的成员变量和成员函数是分开存储的
成员变量:
普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式
静态成员变量:存储于全局数据区中
成员函数:存储于代码段中。
问题出来了:很多对象共用一块代码?代码是如何区分具体对象的那?

换句话说:int getK() const { return k; },代码是如何区分,具体obj1、obj2、obj3对象的k值?

2)C++编译器对普通成员函数的内部处理
在这里插入图片描述实际上使用了this指针。

总结

1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!
2、C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。
3、静态成员函数、成员变量属于类
静态成员函数与普通成员函数的区别:
静态成员函数不包含指向具体对象的指针
普通成员函数包含一个指向具体对象的指针

在这里插入图片描述


http://chatgpt.dhexx.cn/article/wOnBKO3m.shtml

相关文章

一个简单的智能合约模型

我问过的每个人对“智能合约”有着不同的定义。下面是我的智能合约定义。 最近这些天,我听到越来越的人谈论“智能合约”。但是,当你让他们对“智能合约”这一术语下一个定义的时候,他们不能清晰地表达,这一个概念就像从他们手中溜…

HBase数据模型与整体架构

目录 1.HBase的特点 2.HBase数据模型 2.1.HBase逻辑架构 2.2.HBase物理存储 3.HBase整体架构 HBase原理深入: HBase原理深入_李嘉图呀李嘉图的博客-CSDN博客 HBase优化:https://blog.csdn.net/qq_42029989/article/details/126607734 1.HBase的特点 海量存储&…

数据结构与算法--图的深度优先搜索 (DFS)

深度优先搜索即是 从起点出发,从规定的方向中选择一个不断往前走,走到头为止,然后尝试另一种方向直到最后的终点。 DFS解决的是连通性问题,即从A是否能到达B。 采用DFS进行遍历的话,必须依赖栈,后进先出。 …

国际经济学——期末复习

这里写自定义目录标题 李嘉图模型相对价格与供给贸易所得相对工资多种、连续产品的拓展其他概念 专用要素模型孤立经济的情况在国际贸易中贸易模式影响 Heckscher-Ohlin模型要点表述 中略新贸易理论垄断竞争模型(1979)CES效用函数规模报酬递增由于不考所以只写重要结论和推导思…

经济学中的李嘉图模型

前言 因为模型里要用到很多数学推导,所以这篇文章用word写成。然后再截图发上来 原文楼主放在百度网盘里了,链接如下: https://pan.baidu.com/s/14sxnllQ44Wu88moH5_NzTw 定义 一个简单的基础模型 引入技术优势 一个极端的假设 悖论 贸易的…

java中Long型和long型的比较大小

一. Long数据的大小的比较 对于Long类型的数据&#xff0c;这个数据是一个对象&#xff0c;所以对象不可以直接通过“>”,“”&#xff0c;“<”的比较&#xff0c;如果要比较两个对象的是否相等的话&#xff0c;我们可以用Long对象的.equals&#xff08;&#xff09;方…

【Java】Long型与String型互转

String转Long Long.valueOf(str)Long.parseLong(str) Long转String String.valueOf(num)Long.toString(num) import java.util.Arrays; import java.util.List;public class Test {public static void main(String[] args) {String str "100";Long one Long.va…

Long型数据精度丢失问题

数据库中有一个bigint类型数据&#xff0c;对应java后台类型为Long型&#xff0c;在某个查询页面中碰到了问题&#xff1a;页面上显示的数据和数据库中的数据不一致。例如数据库中存储的是&#xff1a;1475797674679549851&#xff0c;显示出来却成了1475797674679550000&#…

vue前端处理后台返回的Long型数据精度丢失

vue前端处理后台返回的Long型数据精度丢失 问题描述 开发时后端返回的id为Long型&#xff0c;结果发现俩id怎么会一样呢&#xff1f;如下图是控制台Preview返回的数据 正以为是后端那边数据有误时&#xff0c;我点开Response发现这边的id是正常的… Preview和Response的数据…

C语言中的long型是究竟占4个字节还是8个字节?

今天在复习C语言的时候踩了一个很有意思的坑。 #include <stdio.h>int main() {printf("long int : %d\n", sizeof(long));return 0; }上面是我在IDE中使用的测试代码&#xff0c;执行它我的第一反应是会得到 4 的长度。 但实际的结果如下图所示&#xff1a;…

c java long_C语言中输出long long型数据怎么输出

展开全部 C语言中输出long long型数据使用%lld格式输出的方法: 1、32313133353236313431303231363533e59b9ee7ad9431333366303761 long long 是C99标准对整型类型做的扩展,每个long long类型的变量占8字节,64位。其表示范围为-9223372036854775808~9223372036854775807。 2、…

解决问题:long型数据精度丢失

在数据库中id设置为bigint且自增在java中对应long型数据 而在前台传输过程中键值过长导致精度丢失 原因是JS内置number类型的安全整数是53位&#xff0c;而Long为8个字节64位&#xff0c;会发生精度丢失 解决办法1&#xff1a; 点击设计表查看选项&#xff0c;发现自动递增数字…

浏览器接收Long型数据精度丢失问题的解决方案

问题描述 当我们后端返回前端Long类型的数据时&#xff0c;后三位会变成0&#xff0c;导致精度丢失。 有意思的地方是&#xff0c;postman测试接口时&#xff0c;查看返回值精度并未丢失&#xff0c;是字符串。 解决方案 在需要保留精度的属性上使用JsonSerialize(using To…

long型长整数字在前端页面显示异常及其解决方法

文章目录 1.引子2.解决问题&#xff08;1&#xff09;初试EL表达式取long型数值&#xff08;2&#xff09;再探EL表达式取字符串格式long型数值&#xff08;3&#xff09;最后一试---给EL表达式加引号 3.总结 1.引子 在做项目中&#xff0c;发现了一个诡异的事情&#xff0c;后…

long 型应该加上 l或者L

Long类型定义数字的L或LL后缀 如果数字后面不加L&#xff0c;默认的取值范围是int&#xff08;整型&#xff09; 比如&#xff1a; 给a赋值&#xff1a;long a&#xff1d;2147483648; &#xff08;数字超出int型取值范围&#xff09; 给a赋值&#xff1a;long a&#xff1…

JAVA生成20位LONG型UUID

编者在开发过程中用postman测试接口&#xff0c;发现要求id为必填且不能含有英文字母&#xff0c;问了对面开发人员才知道需要自己生成20位Long型uuid&#xff0c;写法大概如下&#xff0c;在需要生成的部分调用这个类即可。 package nc.bs.task.util;import java.text.Simple…

解决页面js接受Long型损失精度问题

目录 一、场景描述 二、问题分析 三、解决方法 一、场景描述 在下面这个后台管理中&#xff0c;当我们点击禁用后&#xff0c;会向服务器发送一个请求&#xff0c;同时携带这个员工的19位数字的id。 请求方式为PUT 这里的禁用对应employee表中的status字段&#xff0c;1为启…

java long格式化输出_C语言中输出long long型数据怎么输出?

展开全部 C语言中输出long long型数据使用%lld格式输出的e68a843231313335323631343130323136353331333365633838方法&#xff1a; 1、 long long 是C99标准对整型类型做的扩展&#xff0c;每个long long类型的变量占8字节&#xff0c;64位。其表示范围为-9223372036854775808~…

long型数字计算

在进行以亿为单位的数字计算时&#xff0c;int型往往会有溢出的问题&#xff0c;这时我们需要使用long型数字进行计算 public class demo04 {public static void main(String[] args) {//JDK7新特性&#xff0c;数字之间可以用下划线分割int money 10_0000_0000;int years 2…