孔乙己之

原创 2007年09月22日 17:09:00
 

HTML Tags and JavaScript tutorial



孔乙己之



/a> | 
下一篇: 只贴链接不说话: QQ的架构


function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}


 孔乙己之一----this


本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.
这是一个小问题, 孔乙己一把, 全当自娱. 今天在线上被问到一个问题, 描述如下:
#include  <iostream>
using namespace std;
class MyClass
{
public:
    MyClass(){};
    ~MyClass(){};
    void print()
    {
       cout << "hello!" << endl;
    }
};
int main()
{
    MyClass * pMyClass;
    pMyClass = new MyClass;
    pMyClass->print();                        // 1: 正确调用
    pMyClass[0].print();                      // 2: 正确调用
    pMyClass[1].print();                      // 3: 错误调用, 但结果正确
    pMyClass[10000000].print();               // 4: 错误调用, 但结果正确
    return 0;
}
这位兄弟有疑问的是: 为什么3和4两种方法, 下标不正确, 而其结果却完全正常? 显示的结果是:
hello!
hello!
hello!
hello!
我把程序改了改, 将类MyClass调整成以下结构:
class MyClass
{
public:
    MyClass(){ data1 =1; data2=2;};
    ~MyClass(){};
    int data1,data2;
    void print()
    {
       cout << "hello! data1: " << data1 << " data2: " << data2 << endl;
    }
};

再次编译(编译环境是gcc 4.2), 执行, 结果如下:
hello! data1: 1 data2: 2
hello! data1: 1 data2: 2
hello! data1: 0 data2: 135153
段错误
这其实又是一个老生常谈的问题. 要搞清这个问题, 就得先弄明白类函数是如何被编译以及如何被执行的? 关于这点, "C++对象模型"上有甚为详细的讲解, 在此一笔带过:
对于类成员函数而言, 并不是一个对象对应一个单独的成员函数体, 而是此类的所有对象共用这个成员函数体, 当程序被编译之后, 此成员函数地址即已确定. 我们常说, 调用类成员函数时, 会将当前对象的this指针传给成员函数. 没错, 一个类, 它的成员函数体只有一份, 而成员函数之所以能把属于此类的各个对象的数据区别开, 就在于每次执行类成员函数时, 都会把当前对象的this指针(也即对象首地址)传入成员函数, 函数体内所有对类数据成员的访问, 都会被转化为this->数据成员的方式.
说到这里, 问题也就清楚了. 当print函数里, 只有"cout << "hello" << endl;"这条语句时, 由于print函数并没有访问对象的任何数据成员, 那么此时传进来的对象this指针实际上是没有任何用处的, 这样的函数, 其特征与全局函数并没有太大区别. 但当后来把类MyClass结构作了调整后, 由于print函数要访问类的数据成员data1和data2, 而类的数据成员, 是伴随着对象声明而产生的, 但是, 我们只new了一个MyClass, 显然, 下标"1"和下标"10000000"的MyClass对象根本不存在, 那们对它们的数据成员访问也显然是非法的.
但是, 还有另一个问题, 当把类MyClass再作一次调整, 成这样:
class MyClass
{
public:
    MyClass(){ data1 =1;};
    ~MyClass(){};
    int data1;
    void print()
    {
       cout << "hello! data1: " << data1 << endl;
    }
};

也就是只含有一个int类型的数据成员时, pMyClass[1].print()的访问结果有时却是正确的(不同的机子上会有不同的结果). 我想, 这个只能解释为地址对齐所造成的了(暂时存疑, 查证中, 欲知后事, 下回分解).


"孔乙己"CS版本

学校旁边这家网吧的格局,和别处差不多:都是外面有个曲尺型吧台,吧台里面替人结帐,预备着鲜橙多之类的饮料。上学的人,傍晚放了学,每每花5块钱,玩两个小时――这是两年前的事,现在降到1块钱一小时了――找个...
  • fuxuan928
  • fuxuan928
  • 2007年05月17日 02:50
  • 633

石乙己——孔乙己程序员版

同学空间里转发的,看起来比较有意思。 中关村的公司的格局,是和别处不同的:都是进门左拐一个方形大立柜,柜里面预备着饮料,可以随时拿去喝。写代码的人,凌晨里散了工,每每走上前去,抽一瓶可乐,——这是几年...
  • john_bian
  • john_bian
  • 2017年07月19日 10:22
  • 287

Q版 孔乙己 --程序员 孔甲乙

  鲁镇的bar的风格,跟别的地方是不一样的:都是当街一个原木的大吧台,吧台里面放着大桶的冰块。   正如传闻中所说:“啤酒不冰的真难喝!”所以冰块对于一个bar来说,就好像拉面摊上的辣酱那么重...
  • ligaorenvip
  • ligaorenvip
  • 2007年01月23日 10:00
  • 2722

《孔乙己》之偷窥十舍版

      九舍南面宿舍的格局,是和别处不同的:都是对着十舍的一个方形大窗户,窗台上预备着望远镜,可以随时偷窥。住在北面宿舍的人,傍午傍晚放了学,每每花一块钱,租一台望远镜,——这是暑假以前的事,现在...
  • njsatanlong
  • njsatanlong
  • 2006年08月17日 21:10
  • 506

2012元旦小品 网络达人孔乙己参加招聘面试

过节了,准备个小品节目《(穿越)招聘》,以下是其中的一部分片段仅供娱乐。 原创作品,转载请注明出处blog.csdn.net/upi2u ...... 主持人:现在来看下一位,他是一个曾经生活在绍...
  • upi2u
  • upi2u
  • 2011年12月31日 09:20
  • 2928

谭浩强有点象孔乙己

以前我公司的老板要大家推荐学习C语言的教材,我奋力抗争后,把所有购买谭浩强的书的提议都给扼杀了,最后买了《the c programing language》,呵呵。谭浩强写书就好像孔乙己卖弄他的学问...
  • redguardtoo
  • redguardtoo
  • 2005年04月22日 12:04
  • 6292

孔乙己

学校旁边这家网吧的格局,和别处差不多:都是外面有个曲尺型吧台,吧台里面替人结帐,预备着鲜橙多之类的饮料。上学的人,傍晚放了学,每每花10块钱,玩两个小时――这是两年前的事,现在降到三块钱一小时了――找...
  • shuxin1979
  • shuxin1979
  • 2004年12月08日 08:54
  • 858

孔乙己之网吧版

  学校旁边这家网吧的格局,和别处差不多:都是外面有个曲尺型吧台,吧台里面替人结帐,预备着鲜橙多之类的饮料。上学的人,傍晚放了学,每每花10块钱,玩两个小时――这是两年前的事,现在降到三块钱一小时了―...
  • wangjun_pfc
  • wangjun_pfc
  • 2007年07月08日 09:48
  • 892

孔乙己之四----虚函数(中)

本文作者:sodme本文出处:http://blog.csdn.net/sodme声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明...
  • hejishan
  • hejishan
  • 2008年04月01日 17:06
  • 317

孔乙己之四----虚函数(中)

本文作者:sodme本文出处:http://blog.csdn.net/sodme声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息...
  • sodme
  • sodme
  • 2006年08月06日 19:44
  • 3447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:孔乙己之
举报原因:
原因补充:

(最多只允许输入30个字)