下列程序的输出结果是什么?

#include "stdafx.h"

#include <iostream>
using namespace std; class A
{
public:
int _a;
A()
{
_a = ;
}
void print()
{
cout << _a << endl;
}
};
class B : public A
{
public:
int _a;
B()
{
_a = ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.print();
cout<<b._a<<endl;
system("pause");
return ;
}

结果:

一开始很容易会误以为是22

首先,我们来看一下什么时候,输出会是22呢?

只要把B中_a定义这一行注释掉,就会是22了,至于为什么,对于一开始以为答案是22的朋友,显而易见。

那么为什么题中会是12呢?

我们可以将A,B两个类的大小(对象大小)输出:

int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl; B b;
b.print();
cout<<b._a<<endl;
system("pause");
return ;
}

可以看到,B的大小是A的2倍,这是因为在B中有两个int型变量:

A::_a

B::_a

如果我们在开始的地方加上断点调试就会发现,在B类实例初始化的时候,首先会把A::_a赋值为1,然后把B::_a赋值为2,而当执行print的时候,实际上是进入A中:

所以输出的当然是A::_a,实际上,如果把B中,定义_a的一行去掉,依然输出的是A::_a,如果想要输出B::_a,只有在B中增加print(),才行,而且此时输出的就会是22。

还有一题:

这个是从http://bbs.csdn.net/topics/330161711这里copy的,不过讲的挺好的

struct S
{
int i;
int *p;
}; main()
{
S s;
int *p = &s.i;
p[] = ; //把i的值改为4
p[] = ;//这个地方越界写了,把保存在int i下面的指针int* p的值给写为3了
s.p = p; //又把这个结构体s中指针p的值赋为上面int i的地址
s.p[] = ;//i下面的指针指向i的地址,现在把自身修改为1了
s.p[] = ;//再访问内容为1的指针所指空间就出错了,这行崩溃了
}

程序员面试宝典3TH-ch7.2的更多相关文章

  1. Android高薪之路-Android程序员面试宝典

    Android高薪之路-Android程序员面试宝典

  2. ASP.NET的几个试题(《C#与.NET程序员面试宝典》)

    更多参考:博客园笔记 :ASP.NET是什么 ASP.NET不是一种语言,而是创建动态Web页的一种强大的服务器端技术,它是Microsoft.NET Framework中一套用于生成Web应用程序和 ...

  3. 《JAVA 程序员面试宝典(第四版)》读书笔记之前言

    工作五年了一直在小的软件公司混,总感觉自己的专业知识没有太大的提升.当然了中间也换了一两家公司,面试的公司就很多家,总感觉正规的软件公司(无论大小)对于基础知识的考核都非常重视,而不管你说你之前服务过 ...

  4. 黑马程序员面试宝典(Java)Beta6.0免费下载

    场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? ...

  5. JAVA程序员面试宝典

    程序员面试之葵花宝典 面向对象的特征有哪些方面    1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...

  6. [Java程序员面试宝典]读书笔记

    ClassLoader具备层次关系,且不止一种.不同的类装载器分布创建的同一个类的字节码数据属于完全不同的对象,没有任何关联 通过Class.forName(String className),能够动 ...

  7. 【Java】Java程序员面试宝典(第三版)第5章----Java程序设计基本概念

    1.static静态变量,在次级作用域也可以被修改. 2.k++ + k++.第一个自加实际上只有在与计算+k++时补增.详情P36的题目. 3.Java数据类型从低到高分为(byte short c ...

  8. net 程序员面试宝典

    第1部分 求职过程 ------------------------------------------------------------------------------------------ ...

  9. java程序员面试宝典之——Java 基础部分(1~10)

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java"源文件中是否可以包 ...

  10. Java程序员面试宝典1 ---Java基础部分(该博文为原创,转载请注明出处)

    (该博文为原创,转载请注明出处   http://www.cnblogs.com/luyijoy/  by白手伊凡) 1.    基本概念 1)         Java为解释性语言,运行过程:程序源 ...

随机推荐

  1. Spark技术内幕: Shuffle详解(二)

    本文主要关注ShuffledRDD的Shuffle Read是如何从其他的node上读取数据的. 上文讲到了获取如何获取的策略都在org.apache.spark.storage.BlockFetch ...

  2. 1.关于QT中json数据处理和密码md5加密

     新建一个Qt空项目 17Json.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget ...

  3. Java并发框架——同步状态的管理

    整个AQS框架核心功能都是围绕着其32位整型属性state进行,一般可以说它表示锁的数量,对同步状态的控制可以实现不同的同步工具,例如闭锁.信号量.栅栏等等.为了保证可见性此变量被声明为volatil ...

  4. CONFIGURE ADFS 3.0 WITH SHAREPOINT 2013

     http://blogit.create.pt/miguelmoreno/2014/11/14/configure-adfs-3-0-with-sharepoint-2013/

  5. J2EE进阶(十)SSH框架整合常见问题汇总(一)

    SSH框架整合常见问题汇总(一) 前言 以下所列问题具有针对性,但是遇到同类型问题时均可按照此思路进行解决. HTTP Status 404 - No result defined for actio ...

  6. (九十)使用多个storyboard+代码实现控制器的分开管理

    使用单个storyboard会使得项目难与管理,使用纯代码又会过于麻烦,因此如果能将二者结合起来,并且使用多个storyboard,会使得项目简单简单.方便许多. 下面以一个简单的视图关系为例,介绍多 ...

  7. Win7 Eclipse Hadoop2.4插件配置

    准备工作: 1.下载hadoop2x-eclipse-plugin-master.zip Github地址:https://github.com/winghc/hadoop2x-eclipse-plu ...

  8. mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)

    Web绘图--mxGraph项目实战(精华篇) 声明     本文部分内容所属论文现已发表,请慎重对待. 需求 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式 ...

  9. Touch Handling in Cocos2D 3.x(四)

    创建触摸生命周期 让我们改善我们的应用程序.如果玩家可以触摸屏幕并且拖放英雄到指定位置不是更好吗? 为了完成这个功能我们必须使用Cocos2d 3.0提供的所有的触摸事件: touchBegan:在用 ...

  10. shell 常用正则表达式

    "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" ...