上一页 1 2 3 4 5 6 7 8 9 10 ··· 12 下一页
摘要: 在C++中,静态成员函数只能访问静态成员,原因在于没有this指针。这已经是常识了。其实,成员函数在编译时,编译器会自动加上this指针。比如A a;a.func(1);会当做A::func(&a, 1);成员函数的原型是A::func(int);编译器处理后等价于A::func(A* const ... 阅读全文
posted @ 2014-05-11 23:09 IT屁民 阅读(4375) 评论(0) 推荐(0) 编辑
摘要: 最近看了下汇编,主要是想了解下cdecl和stdcall的区别。之前没有汇编基础,只知道少许简单的汇编指令,如mov等等。这两天看了若干,总结一下吧,当然只是部分知识点,对我而言已经很受用了。1. cdecl 和 stdcall 的区别(从汇编层面解释)其实在选择这两者时,最主要的考虑是可变参数的问... 阅读全文
posted @ 2014-05-06 11:34 IT屁民 阅读(3050) 评论(0) 推荐(0) 编辑
摘要: 今天遇到了一个问题,大致描述一下就是有两个类A和B。我想达到如下效果:B是A的友元,同时A是B的类类型成员。第一次尝试,在B.h中包含A.h,在A.h中包含B.h,在A类中声明friend class B,在B类的定义中加入A a;这一次尝试必然失败,编译报错,缺少分号什么的,原因是相互包含头文件。... 阅读全文
posted @ 2014-01-08 22:31 IT屁民 阅读(1383) 评论(0) 推荐(0) 编辑
摘要: C语言标准(不管是ANSI 还是ISO)包含2部分,一部分是语言本身的标准,另一部分是C标准函数库。C标准函数库规定了函数的原型和功能,但是并没限定这些函数要怎么实现。所谓满足标准C规定的C编译器,不仅指这个编译器满足C语言本身的标准,还指这个编译器提供了一组满足C标准库的库函数。这组库函数是由编译器厂商实现,并且满足标准C规定的功能和接口的。这些库函数,厂商并不一定要提供给用户源文件给用户编译用,可以是二进制目标文件给用户链接用(我猜这就是叫着运行库的原因之一,你看不到源码,能看到运行是的汇编码)。所以说,不管是哪个厂商的CRT,只要他宣称他是标准的C编译器,那他的CRT就肯定是满足C标准中 阅读全文
posted @ 2013-12-18 19:42 IT屁民 阅读(1101) 评论(0) 推荐(0) 编辑
摘要: 一旦DLL的文件映像被映射到调用进程的地址空间中,DLL的函数就可以供进程中运行的所有线程使用。实际上,DLL几乎将失去它作为DLL的全部特征。对于进程中的线程来说,DLL的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。当一个线程调用DLL函数时,该DLL函数要查看线程的堆栈,以... 阅读全文
posted @ 2013-12-18 19:40 IT屁民 阅读(2160) 评论(0) 推荐(1) 编辑
摘要: 一个模块一个堆,一个线程一个栈。dll里malloc的内存,在exe里free会出错。CRT(C运行时期库)不是使用进程缺省的堆来实现malloc(new中调用malloc)的,而是使用一个全局句柄 HANDLE _crtheap来分配内存的。这个_crtheap是在XXXCRTStartUp(CRT提供的进口点函数)中创建的。由于CRT静态连接,则楼主的DLL里有也有一个CRT,因此也有一个_crtheap。而在dll中的new使用dll中的_crtheap句柄分配 堆,在exe中的delete使用exe中的_crtheap释放堆,当然失败!解决办法:1。在DLL中输出一个函数给EXE调用, 阅读全文
posted @ 2013-12-18 17:34 IT屁民 阅读(8607) 评论(0) 推荐(0) 编辑
摘要: 在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是msdn上面的解释:MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dllMDd:MT+DLL+debug,多线程动态调试库,连接MS 阅读全文
posted @ 2013-12-18 15:46 IT屁民 阅读(21631) 评论(2) 推荐(3) 编辑
摘要: .h文件主要是提供函数签名原型至于函数的实现有两种库:动态库:dll静态库:lib当使用动态库dll的时候,有两种情况1,只有dll而没有.h和.lib而有api文档的情况下,可以通过LoadLibrary动态加载dll,并通过GetProcAddress来获取函数地址并使用。2,有dll,有.h,有lib的话,在编译选项里正确链接lib,并在代码头文件中includ.h文件即可使用其中dll存储了函数具体的执行代码和资源,.h文件给出了函数的原型,.lib文件给出了函数在dll中的内存偏移地址。使用时dll与exe文件在同一目录即可注意的是:此时的lib是导出文件,而不是静态库而只有dll, 阅读全文
posted @ 2013-12-18 15:20 IT屁民 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是 阅读全文
posted @ 2013-12-17 19:35 IT屁民 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱。 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分。 Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类local inner class 匿名内部类anonymous inner class静态内部类Static Inner Class 最简单的内部类形式。 类定义时加上static关键字。 不能和外部类有相同的名字。 被... 阅读全文
posted @ 2013-11-26 22:28 IT屁民 阅读(343) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 12 下一页