当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 面向对象与现代软件组件系统 (V0.01) 本文档从较低层的角度分析面向对象和现代软件组件系统,文档中部分看法与目前流行看法可能有不同,仅代表笔者个人观点。
 

 

    摘要: 在使用atl中所带智能指针ccomptr和ccomqiptr时要小心。以下代码假设存在一个组件testcomptr,其组件的clsid为clsid_testcomptr,向客户曝露一个接口itestcomptr。int main(){ hresult l_hr; coinitialize(null); ccomptr <itestcomptr> l_sptestcomptr; l_h......
 ·身份证15位升18位的算法    »显示摘要«
    摘要:   现在新的身份证已经从15位升到了18位了,很多软件都可能用到身份证的输入、校验的工作,关于新身份证的编码似乎文章很少,我在2000年的时候找到了计算机世界的一篇文章,发现现在的身份证校验码居然可能是英文字母x(其实这个x是罗马字母,表示10的意思),为什么用字母呢?谁知道? 起码电话上数字键就输不进去新的号码。(现在的办法是使用*替代,好在还有#*2个键,我也做过cti的,呵呵),然后我写了......


面向对象与现代软件组件系统

面向对象与现代软件组件系统

本文档从较低层的角度分析面向对象与现代软件组件系统,文档中部分看法与目前流行看法可能有不同,仅代表笔者个人观点.本文档适合对面向对象或者com有一定基础的读者阅读. 【程序编程相关:Generic<Programmi

(v0.01) 【推荐阅读:在MFC下使用OpenGL的一个简单的例

本文档中,未经特殊说明,不加区分地使用“属性(property)”/“成员变量(member variable)”与“方法(method)”/“成员函数(member function)”词汇. 【扩展信息:No MFC,Only API

本文档中的“属性(property)”一词,如果未特殊说明“com接口属性”.“自动化属性”等与com/activex相关的“属性”,相当于c++中的成员变量(member variable)或者object pascal/delphi中的字段(field),通常泛指对象的特征,与com/activex中通常相当于一对get/set方法的属性不同.

本文档中的com,未经特殊说明,泛指com/dcom/mts/com+ 1.0.

本文档中的源程序,未经特殊说明,均使用visual c++ .net(visual c++ 7.0)开发.

第1篇  面向对象

第1章  对象与类的本质

1.1.对象(object)的本质

许多面向对象java/j2me/code/ target=_blank>程序设计或者c++的书上都会这样说:“对象有属性(property)与方法(method).”

但是在真实世界中,说“对象”有“属性”说得通,但是“对象”有“方法”吗?假设有一辆自行车,把自行车看作“对象”,那么“自行车对象”确实有“属性”,例如自行车是26的还是28的,是男式的还是女式的,是黑色的还是银灰色的……这都是实实在在的“属性”,也就是具体对象的特征.但是如果说“自行车对象”有“方法”,这话可就有些不通了,例如说自行车对象有“行驶”或者“停止”“方法”,那倒要问问:谁能从一辆自行车上“看出”它有“行驶”或者“停止”“方法”?除非他有特异功能!

属性是静态的(但是不是不可变的),反映了一个具体对象的特征,但是方法是动态的,是对象的使用者(或者调用者)对于对象具体的操作,也就是说方法是针对对象的,只能说方法可用于(或者适合)对象,也可以说对象支持方法,不应该说对象有方法.对象只有属性(或者特征),但是对象支持方法,而且通常方法可以操作属性.

一般程序员不容易接受笔者的看法,因为编写程序时,是通过对象调用方法的,为此笔者编写了一个简单的c++实例程序,试图说明该问题.程序通过简单的类抽象模拟“神舟”飞船(仿照“inside visual c++”/«visual c++技术内幕»一书),并创建模拟飞船对象.程序工程是简单的win32控制台(console)工程,在命令行(ms—dos方式)下执行,主程序源程序如下(shenzhou_classandobject.cpp):

// shenzhou_classandobject.cpp : 定义控制台应用程序的入口点.

//

#include "stdafx.h"

file://模拟“神舟”飞船类

class cshenzhou

{

public:

 int m_position;

 cshenzhou();

 void fly();  file://模拟飞船飞行

 int getposition();  file://模拟航天测控(获取飞船位置)

};

cshenzhou::cshenzhou()

{

 m_position=100;

}

void cshenzhou::fly()

{

 _tprintf(_t("fly!\n"));

}

int cshenzhou::getposition()

{

 return m_position;

}

int _tmain(int argc, _tchar* argv[])

{

 cshenzhou shenzhou1;  file://模拟飞船对象

 _tprintf(_t("the size of the shenzhou1 object: %d\n"),sizeof(shenzhou1));

 shenzhou1.fly();

 _tprintf(_t("the position of the shenzhou 1 spaceship: %d\n"),shenzhou1.getposition());

 return 0;

}

程序运行结果如下:

the size of the shenzhou1 object: 4

fly!

the position of the shenzhou 1 spaceship: 100

有1个成员变量与3个成员函数(其中1个是构造函数)的类的对象,大小(所占内存空间)只有4字节,正好相当于1个成员变量(int数据类型)的大小,显然,成员函数并不包含在对象中.

上例可以证明:对象中只包含属性,并不包含方法.

那么为什么编写程序时,是通过对象调用方法呢?将上例的工程编译成exe文件(使用release配置),然后用ida pro v4.17反汇编,检查部分反汇编程序(部分注释是笔者加的):

……

; cshenzhou类的构造函数

sub_0_401000 proc near  ; code xref: sub_0_401030+5p

  mov eax, ecx

  mov dword ptr [eax], 64h

  retn

sub_0_401000 endp

……

; cshenzhou::fly成员函数

sub_0_401010 proc near  ; code xref: sub_0_401030+1dp

  push offset afly ; "fly!\n"

  call sub_0_401070

  pop ecx

  retn

sub_0_401010 endp

……

; cshenzhou::getposition成员函数

sub_0_401020 proc near  ; code xref: sub_0_401030+26p

  mov eax, [ecx]

  retn

sub_0_401020 endp

……

; _tmain函数


...   下一页
 ·edsger dijkstra经典言论    »显示摘要«
    摘要: 1. 编程的艺术就是处理复杂性的艺术。 2. 优秀的程序员很清楚自己的能力是有限的,所以他对待编程任务的态度是完全谦卑的,特别是,他们会象逃避瘟疫那样逃避 “聪明的技巧”。——1972年图灵奖演讲 3. 计算机科学是应用数学最难的一个分支,所以如果你是一个蹩脚的数学家,最好留在原地,继续当你的数学家。 4. 我们所使用的工具深刻地影响我们的思考习惯,从而也影响了我们的思考能力。 5. 实......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE