文档章节

C++对象原型

首席吹牛官
 首席吹牛官
发布于 2015/05/22 12:57
字数 533
阅读 3
收藏 0

C++的对象在内存中是怎么表示的,数据成员和成员函数之间有什么关系,this指针到底是干嘛的。

这里不考虑虚函数表

一个对象内存中占的大小其实就是他的数据成员的大小

   这是我用的例子

  

class T
{
public:
    T() {}
    void info() const {
        cout << "info\n";
    }
    void printValue() const {
        cout << "value is " << m_value << '\n';
    }
    void fun() const {
        cout << "fun!\n";
    }
private:
    int m_value;
};

注释掉fun函数和没注释的大小都是一个int的大小,4byte。

那么成员函数类是共用一份代码,但是我们在使用的时候,为什么感觉是每个对象都自己有一份,这和两个方面有原因。我们在施加一个动作给一个对象时,这个对象的状态只能由它的数据成员能够记录和表示,我们在需要施加操作的对象身上由它的对象的数据成员所代表的状态是我们预期的结果,是我们感觉是各自一份。还有就是this指针是造成假象的技术实现。

int main()
{
    T *p = NULL;
    p->info();
//    p->printValue();
//    t *p2 = NULL;
//    info(p2);
    
//    cout << sizeof(T) << endl;
    
    
    return 0;
}

我们在main函数中写了这段代码,你认为只是不可接受的,确实是,你不能对一个NULL执政施加操作,可是结果是

这样的

它很好的运行了。

现在我们写了这一段代码

struct t {
    int m_value;
};

void info(const t *p) {
    cout << "info\n";
}

void printValue(const t *p) {
    cout << "value is " << p->m_value << '\n';
}

在main函数中写了这段

int main()
{
//    T *p = NULL;
//    p->info();
//    p->printValue();
    t *p2 = NULL;
    info(p2);

//    cout << sizeof(T) << endl;


    return 0;
}

其实这两个已经可是了解C++对象的原型了,p2就是this指针,它是NULL,不过我们在info中没有使用它,所以它没什么影响,这就是第一段代码能够运行的原因,可是如果我们call了printValue函数,this是NULL,我们在函数中访问了它的m_value,我们省略了this->,这就和
void printValue(const t *p)
一样

一个内存段错误。




© 著作权归作者所有

上一篇: 最近的想法
下一篇: C++对象原型
首席吹牛官
粉丝 9
博文 368
码字总数 191938
作品 0
闵行
程序员
私信 提问
javascript原型的理解

JavaScript是一门面向对象的语言。在JavaScript中有一句很经典的话,万物皆对象。既然是面向对象的,那就有面向对象的三大特征:封装、继承、多态。这里讲的是JavaScript的继承,其他两个容后...

痴情小云
2018/06/26
0
0
Lynx技术分析-JS引擎扩展设计

JS Binding 技术 Lynx(一个高效的跨平台框架) 的 JS Binding 技术最主要的目的是搭建一个高效的与 JS 引擎解耦的通信桥梁,同时具备 JS 引擎切换的能力。该技术经历了多次迭代,最终通过抽...

hxxft
2018/05/15
0
0
使用 Google V8 引擎开发可定制的应用程序

V8 引擎概览 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM 的处理器,如 HTC G7 等 )。V8 最早...

IBMdW
2012/04/13
3.2K
5
函数类: unary_function Struct

unaryfunction有一个兄弟是binaryfunction,俩格的区别是一个为了使用一个参数输入的函数对象,另一个适合两个输入参数的函数对象。对于STL不熟悉的人,很难理解为什么好端端的函数对象, 为...

woodo
2014/04/10
75
0
C#调用C/C++封装的动态库(DLL)

本人初学C#,对C#里面的一些概念,比如委托之类的理解不是很深,现在需要用C#调用C++写的动态库,不知道怎么下手,还请大神帮忙。就是C#代码里面要怎么调用这些函数。 例如: dll里面的代码是...

惯犯
2018/09/06
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
19分钟前
2
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部