`
LeslieWei
  • 浏览: 14107 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的一个小问题

阅读更多
先看下面一段代码:
  1/*******************************************
  2 * Author: Leslie Wei
  3 * Created Time: 2012年04月22日 星期日 21时35分58秒
  4 * File Name: nullObj.cpp
  5 * Description:
  6 * @Copyright reserved
  7 ********************************************/
  8
  9 #include <stdio.h>
10 class nullObj
11 {
12 public:
13     void Print()
14     {
15         int a = 10;
16         printf("a's value is %d\n", a);
17     }
18 };
19
20 int main(int argc, char *argv[])
21 {
22     nullObj *nobj = NULL;
23     nobj->Print();
24     return 0;
25 }

觉得这段代码有问题吧?22行的nullObj为空,下面怎么能访问了空指针啊?这不是致命的空指针错误么?
别急,先去test下,你一定很惊讶,访问空指针程序居然能正确运行!
为什么呢?对应到汇编代码中去看吧?编译器是怎么把C++类编译成汇编代码的呢?我们都知道,程序的函数定义最后是装载到内存的静态内存区的。也就是说不管是C程序还是C++程序,经编译后的函数是没什么区别的,那么编译器怎么实现C++对对象的支持呢?其实编译器只是做了个很看似很简单的操作,就是在编译C++函数的时候将C++的this指针传给了该函数,我们在创建一个对象的时候,会自动把创建的对象赋值给this指针,这里的nullObj *nobj = NULL;说明了this指针为空,但是Print()函数的定义是固化到代码区的,而Print函数中并没有访问this指针,所以即使这里的nobj 为空,函数一样能正确执行!
偶然发现了这个小问题,特此记录下来。
分享到:
评论

相关推荐

    一个免费的c++小游戏集合

    这个集合中的每个游戏都是一个独立的学习实例,你可以逐个研究,理解其背后的算法和数据结构。对于初学者来说,这是实践理论知识、提高编程技能的绝佳途径。而对于有一定基础的开发者,这些游戏也可以作为进一步优化...

    c++ 几个实用小程序

    C++是一种广泛应用于...总的来说,这些C++小程序涵盖了语言的基础概念,是初学者建立编程思维、掌握C++语法和编程技巧的理想实践资源。通过分析和修改这些代码,你可以逐步熟悉C++编程,为更复杂的项目打下坚实基础。

    C++小球碰撞C++ 小球碰撞

    - **包围盒检测**:为每个物体定义一个简单的几何体(如矩形或圆形),通过检测这些简单几何体是否相交来判断原物体是否碰撞。 - **精确检测**:使用物体的实际形状进行检测,适用于形状复杂或精度要求高的情况。 #...

    最小二乘法的C++实现

    例如,对于一个简单的线性回归问题,我们可以收集一些(x, y)数据点,构建设计矩阵X,其中每一行是一个数据点的自变量向量(包含1作为截距项),然后使用上述C++代码求解最小二乘解。 4. 扩展: 对于非线性问题,...

    用C++实现小人跳舞

    本项目"用C++实现小人跳舞"正是这样一种实践,它利用C++语言的基本控制结构和输出功能,构建了一个简单的字符动画,模拟小人跳舞的情景。 首先,我们要理解C++语言的基础知识。C++是静态类型的、编译式的、通用的、...

    c++小球反弹运动

    这个项目,"c++小球反弹运动",旨在实现一个窗口,其中一个小球按照45度角进行直线运动,并在碰撞窗口边缘或其他物体时按照物理规则进行反弹。以下是对这个项目的详细说明: 首先,我们需要理解小球的运动规律。...

    c++ 百钱买鸡问题 百鸡问题

    百鸡问题的解决方案不止一个,可能有多个解。例如,公鸡10只、母鸡30只、小鸡60只,或者公鸡20只、母鸡20只、小鸡60只等。在运行上述C++代码后,我们会得到这些解。 在C++编程中,解决问题的关键在于理解问题背后的...

    使用Dev c++实现小游戏俄罗斯方块 C++版

    本资源提供了一个使用C++语言在Dev C++环境下实现的俄罗斯方块小游戏,对于想要学习游戏设计或者C++编程的人来说,这是一个很好的起点。 俄罗斯方块是一款经典的电子游戏,它的规则简单但富有挑战性。玩家需要控制...

    C++ 最短哈米尔顿回路问题

    在计算机科学领域,哈米尔顿回路(Hamiltonian Cycle)是一个经典的图论问题,它涉及到找到一个图中从某一点出发经过所有其他顶点恰好一次并返回起点的路径。这个问题在许多实际应用中都有所体现,例如旅行商问题、...

    C++的一个小游戏代码

    标题 "C++的一个小游戏代码" 暗示我们...总的来说,通过分析这个C++小游戏代码,初学者可以学习到C++的基础语法、面向对象编程的概念以及项目开发的基本流程,这对于提升编程技能和理解软件开发的全貌都是非常有益的。

    C_C++ Wavelet小波分析之一维小波分解与重构

    MATLAB是一个强大的数学计算环境,内置了丰富的小波函数库,方便研究人员进行小波分析。开发者为了便于理解和使用,已经将这些功能移植到了C++中,用户可以使用DB4(Daubechies4)和SYM4(Symlet4)两种小波基。DB4...

    c++工作分配问题的最优解

    在C++编程中,工作分配问题是一个典型的优化问题,它涉及到如何有效地将一系列任务分配给一组工作者,以达到最大效率或最小成本。这个问题在实际应用中广泛存在,比如任务调度、资源分配、项目管理等领域。下面我们...

    c++括号匹配问题 c++括号匹配问题

    在C++编程中,括号匹配是一个至关重要的概念,它涉及到程序的正确性与语法合法性。括号匹配通常指的是确保程序中的所有开启括号(如`(`、`[`、`{`)都有对应的关闭括号(`)`、`]`、`}`)。在C++中,括号用于控制代码...

    约瑟夫问题 c++实现

    在C++中,可以使用while循环,每次循环检查链表是否只剩一个节点,若不是则继续报数和移除。 总的来说,约瑟夫问题的C++实现主要涉及了链表的基本操作,包括创建、插入、遍历和删除节点。循环链表的特性使得问题的...

    用C++实现的经典小游戏源代码

    在本资源中,标题"用C++实现的经典小游戏源代码"揭示了主要的主题,即使用C++编程语言编写的经典小游戏的源代码。这通常包括一些基础和进阶的编程概念,适合学习C++和游戏开发的初学者,以及希望巩固编程技能的...

    用c++编写输油管道问题

    从给定的代码片段来看,这是一段使用C++(虽然包含了C风格的头文件)编写的程序,旨在解决一个特定的问题,即寻找一组数据的中位数,并基于该中位数计算所有数据与中位数差值的绝对值之和。这个场景可以类比于在一...

    c++小游戏(附源码)

    C++是一种强大的面向对象编程语言,它以其高效性、灵活性和广泛的库支持而闻名,尤其在游戏开发领域中被广泛使用。"C++小游戏"这个标题暗示了...总的来说,"C++小游戏"不仅是一个学习平台,也是一个实践和创新的乐园。

    自己用c++做的一个弹球小游戏

    在本项目中,你将了解一个使用C++编程语言实现的简单弹球小游戏。这个小游戏的设计目的是让初学者能够熟悉C++的基本语法、输入/输出处理以及基本的图形用户界面(GUI)编程概念。让我们逐步深入这个弹球游戏的各个...

    《小学生C++创意编程》第1单元课件-软件下载安装

    在第一课“走进神秘的C++——软件下载、安装”中,首先介绍了编程的基本概念,通过一个小故事激发学生对编程的兴趣。故事中的主角牛牛看到学长们用编程软件实现了电脑与人的互动,感到好奇并想尝试。学习C++的第一步...

Global site tag (gtag.js) - Google Analytics