指针的使用在编程过程中至关重要.docx
- 文档编号:2370287
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:27
- 大小:40.30KB
指针的使用在编程过程中至关重要.docx
《指针的使用在编程过程中至关重要.docx》由会员分享,可在线阅读,更多相关《指针的使用在编程过程中至关重要.docx(27页珍藏版)》请在冰豆网上搜索。
指针的使用在编程过程中至关重要
指针的使用在编程过程中至关重要,恰到好处并能正确无误的使用指针不但能够提高程序自身的运行效率,而且有助于节省程序执行所需要消耗的资源。
指针对应着某个数据在内存空间中的地址,得到了指针就可以自由地修改该数据。
句柄代表指针的“指针”,也可以将其比作表中数据项的索引值( 表对应某个进程自身的内存空间)。
句柄是间接的引用对象。
指针和句柄的不同之处:
∙句柄所指的可以是一个很复杂的结构,并且很有可能与系统有关的,比如上面所说线程的句柄,它指向的就是一个类或者结构,它和系统有很密切的关系。
当一个线程由于不可预料的原因而终止时,系统就可以通过句柄来回收它所占用的资料,如CPU,内存等等。
反过来想,这些句柄中的某一些,是与系统进行交互用的。
∙指针它也可以指向一个复杂的结构,但通常是由用户自我定义的,所以一些必需的工作都要由用户自己完成,特别是在删除的时候。
∙另外需要注意的是句柄往往有自己的存在区限,比如一个进程,如果将其传递到另一个进程中,句柄也就失去了意义( 表中数据项的索引值,索引离开了具体的表也就失去了意义)。
具体转换:
( 句柄转为指针)
CWnd* pWnd=FromeHandle(hMyHandle);
pWnd->SetWindowText("HelloWorld!
");
or
CWnd* pWnd;
pWnd->Attach(hMyHandle);
MFC类中有的还提供了标准方法,比如Window句柄:
static CWnd* PASCAL FromHandle(
HWND hWnd
);
HWND GetSafeHwnd( ) const;
对于位图:
static CBitmap* PASCAL FromHandle(
HBITMAP hBitmap
);
static CGdiObject* PASCAL FromHandle(
HGDIOBJ hObject
);
HGDIOBJ GetSafeHandle( ) const;
当然,更详细的信息需要在具体使用中自我查询。
建议:
指针和句柄的使用属于比较复杂、危险性较高的应用,在具体实践中,如果可以,尽量不要使用指针和句柄,最好选择现有的、封装完好的方式来实现,更别提指针同句柄的转换了,它更加危险。
比如在操作字符串时,尽量使用CString类来实现,通过定义好的构造、析构函数来完成分配和回收,最好不要通过指针来动态操作。
深度探索C++对象模型
(1)
读完这一章使我想到了一个很久以前看到的一个笑话,编写一个HELLOWORLD的程序,随着水平和职务的不一样,程序代码也随着变化。
当初看时完全当作笑话来看,现在看来写此笑话的人水平不一般。
如果要使你的代码能够最大限度的适应不同的运行环境,和最大限度的复用,则在设计和编写的过程中需要考虑的问题很多,因此代码已变的不在具有C语言的简洁,高效。
而牺牲了这些优势换来的是更好的封装。
当然如果你只是要打印HelloWorld则不必这样做了。
以C++的思维方式解决问题,对于对C语言已经很熟悉的人来说会很不能适应。
需要一段时间来适应,不然会将代码写的似是而非。
而且不能邯郸学步,必须从思想上彻底的C++(OO),如果只是依葫芦画瓢,那结果很可能是用C++的语法编写C式的程序。
本人曾经犯的典型的低级的错误之一,就是无意识的一个类无限制的扩充,完全没有考虑到类的多层结构(基类-派生类),需要属性或方法便在类中增加,虽然也用到了多态、重载等一些OO的设计方式,但最后这个类庞大无比,除了在当前系统中任劳任怨的工作外,一点复用的可能都没有,如果另一个系统还需要一个类似的东西,那只能重新设计实现一个新的类。
并且最致命的是在维护更新时带来得麻烦,需要不断全部编译不说,而且代码在用了大量注释后,在过一段时间读起来也是一件重脑力劳动。
及失去了C的简洁清晰和高效,也不完全具备C++的面向对象的特性。
这根本不能叫C++程序。
(我想有时间重写一下以前代码也会有很多收获,温故而知新吗)C和C++在编程思想上是相互矛盾的。
这也就是说如果你想学C++,完全可以不学C,只需要一本好书和一个不太笨的大脑再加上努力就可以了,如果你已有C的经验在一定的情况下反而会捣乱。
本章是对对象模型的一个大略浏览。
既然我们选择了C++而不是C作为开发工具,那我们的编程思想也应该转为C++的,而不能再延续C的Procedural方式。
我们必须学会C++的思考方式。
采用抽象数据类型或用一个多层的class体系对数据以及数据处理函数进行封装,只有摆脱C程序的使用全局数据的惯性,才能充分发挥出C++对象模型的强大威力。
在C++中有两种数据成员static和nonstatic,以及三种成员函数static、nonstatic和virtual。
C++对象模型对内存空间和存取时间做了优化,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。
static和nonstatic成员函数被放在类对象之外。
而virtual函数是由类对象的一个指向vtbl(虚函数表)的指针vptr来进行支持。
而vptr的设定和重置由类的构造函数、析构函数以及copyassignment运算符自动完成。
我们设计的每一个类几乎都要有一个或多个构造函数、析构函数和一个Assignment运算符。
他们的作用是构造函数产生一个新的对象并确定它被初始化。
析构函数销毁一个对象并确定它已经被适当的清理(避免出现内存泄露的问题),Assignment运算符给对象一个新值。
这是第一章的第一部分,由于雷神最近几天在做模式小组的主页,时间周转不开了。
本想写完整个一章再发,考虑一下还是先发一部分吧。
原因有2。
1、第一章的后半部可能又要拖上10天半个月的。
2、笔记实在难写,我不愿意将笔记做成将书上的重点再抄一边,而是喜欢尽量将自己的理解描述出来,谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生。
所以本着对大家和自己负责的态度,雷神准备再看它3遍在说。
突然发现自己的C++还差的很远,好可怕呀。
OO的设计方式,但最后这个类庞大无比,除了在当前系统中任劳任怨的工作外,一点复用的可能都没有,如果另一个系统还需要一个类似的东西,那只能重新设计实现一个新的类。
并且最致命的是在维护更新时带来得麻烦,需要不断全部编译不说,而且代码在用了大量注释后,在过一段时间读起来也是一件重脑力劳动。
及失去了C的简洁清晰和高效,也不完全具备C++的面向对象的特性。
这根本不能叫C++程序。
(我想有时间重写一下以前代码也会有很多收获,温故而知新吗)C和C++在编程思想上是相互矛盾的。
这也就是说如果你想学C++,完全可以不学C,只需要一本好书和一个不太笨的大脑再加上努力就可以了,如果你已有C的经验在一定的情况下反而会捣乱。
本章是对对象模型的一个大略浏览。
既然我们选择了C++而不是C作为开发工具,那我们的编程思想也应该转为C++的,而不能再延续C的Procedural方式。
我们必须学会C++的思考方式。
采用抽象数据类型或用一个多层的class体系对数据以及数据处理函数进行封装,只有摆脱C程序的使用全局数据的惯性,才能充分发挥出C++对象模型的强大威力。
在C++中有两种数据成员static和nonstatic,以及三种成员函数static、nonstatic和virtual。
C++对象模型对内存空间和存取时间做了优化,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。
static和nonstatic成员函数被放在类对象之外。
而virtual函数是由类对象的一个指向vtbl(虚函数表)的指针vptr来进行支持。
而vptr的设定和重置由类的构造函数、析构函数以及copyassignment运算符自动完成。
我们设计的每一个类几乎都要有一个或多个构造函数、析构函数和一个Assignment运算符。
他们的作用是构造函数产生一个新的对象并确定它被初始化。
析构函数销毁一个对象并确定它已经被适当的清理(避免出现内存泄露的问题),Assignment运算符给对象一个新值。
这是第一章的第一部分,由于雷神最近几天在做模式小组的主页,时间周转不开了。
本想写完整个一章再发,考虑一下还是先发一部分吧。
原因有2。
1、第一章的后半部可能又要拖上10天半个月的。
2、笔记实在难写,我不愿意将笔记做成将书上的重点再抄一边,而是喜欢尽量将自己的理解描述出来,谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生。
所以本着对大家和自己负责的态度,雷神准备再看它3遍在说。
突然发现自己的C++还差的很远,好可怕呀。
深度探索C++对象模型
(2)
笔记贴出后,有朋友便给我提出了一个很好的建议,原文如下:
史列因:
我刚看了你写的“深度探索C++对象模型
(1)”,感觉很不错。
不过我有一个建议:
你说“谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生”是很自然的。
第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了。
第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了。
这本书中很多内容都是前后重复的。
我建议你先不管看懂看不懂,只管向后看,之后再从头看几遍,那样效果好得多。
我想史列因说的应该是一种非常好的阅读方式,类似《深度探索C++对象模型》这样的技术书籍,需要的是理解,和学习英文不同,不能靠死记硬背,如果出现理解不了的情况,那你不妨将书放下,打一盘红警(俺骄傲的说,我是高手)。
或者跳过去也是一个不错的方法。
好了,我们还是继续研究C++的对象模型吧。
简单的对象模型
看书上的例子(注释是表示solt的索引)
ClassPoint
{
public:
Point(floatxval);//1
virtual~Point();//2
floatx()const;//3
staticintPointCount();//4
protected:
virtualostream&print(ostream&os)const;//5
float_x;//6
staticint_point_count;//7
}
每一个Object是一系列的Slots,每一个Slots指向一个members。
表格驱动对象模型
当构造对象时便会有一个类似指针数组的东西存放着类数据成员在内存中位置的指针,还有指向成员函数的指针。
为了对一个类产生的所有对象实体有一个标准的表达,所以对象模型采用了表格,把所有的数据成员放在数据成员表中,把所有的成员函数的地址放在了成员函数表中,而类对象本身有指向这两个表的指针。
为了便于理解,雷神来举个不恰当的例子说明一下,注意是不很恰当的例子
我们把写字楼看成一个类,写字楼中的人看成是类的数据成员,而每一个租用写字楼的公司看成类的成员函数。
我们来看一个实体,我们叫它雷神大厦。
雷神大厦的物业管理部门需要登记每个出入写字楼的人,以便发通行证,并且需要登记每个公司的房间号,并制作了一个牌子在大厅的墙
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 使用 编程 过程 至关重要