文档章节

C++对象原型

首席吹牛官
 首席吹牛官
发布于 2015/05/22 12:50
字数 533
阅读 0
收藏 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)
一样

一个内存段错误。




本文转载自:http://blog.csdn.net/zhx6044/article/details/9108399

首席吹牛官
粉丝 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

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
10
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
8
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部