
2.2) C++
文章平均质量分 74
C++编程
聪明的笨蛋
这个作者很懒,什么都没留下…
展开
-
C++与C#对比学习:数字的故事
进制的故事 跟数字打交道时我们接触的最多的是十进制了,我们从小学到大学的数学课基本上都用的十进制.但实际上还存在各种各样的其他进制.比如时间就是60进制,中国古代用十六进制表示重量,十六两是一斤,所以有成语半斤八两. 而我们现在普遍使用的电脑跟二进制是离不开,可以说如果没有二进制的发明就没有计算机如今的普及,这就得感谢莱布尼兹这样的牛人了啊,其实计算机领域真正的原创 2012-09-11 12:21:27 · 1529 阅读 · 0 评论 -
C++与C#对比学习:多重继承
我们知道C++中类可以多重继承,这也符合现实情况,比如某个绿帽高戴的男同志身边的某位美女可能同时具备几个身份,老婆,小三,孩子他妈.这样的话这位美女得同时继承这三个类.不过由于多继承会有一些缺陷,比如二义性.而且虽然多继承方便直观点,但没有它也不是不行.其实少了类少了面向对象也不是就做不了啥事,像C语言没有类还不是用的好好的.所以啊这个世界上很多事并不是那么必不可不少的.比如你明天光荣牺牲了这个世原创 2012-09-11 16:57:46 · 2473 阅读 · 0 评论 -
C++与C#对比学习:多态,虚函数
地球人都知道面向对象的三个主要特征是封装,继承,多态.前面两个概念顾名思义,比较容易理解,封装就是所有的东东都给封装到一个个的class中,并通过public,private等访问修饰符提供一些权限控制.继承嘛就是子类能拥有父类的非私有的成员变量和函数,就像你能继承你老子的财产一样啊.多态光看名字可不好理解,可没变态那么通俗易懂啊.其实前面说的三个特性还有另外的版本,比如:数据抽象,继承,动态绑定原创 2012-09-11 20:29:18 · 2661 阅读 · 0 评论 -
C++与C#对比学习:面向对象,接口,抽象类
面向对象的小故事 面向对象程序语言中最重要的概念无疑是class,所谓一切皆对象.(不过要是老天天呆电脑前写代码研究面向对象语言,那要真找对象找老婆就很成问题.可不是满世界的美女们都皆是你对象.) 类是一个抽象的概念,和我们现实生活中对事物分类起名差不多,比如美女,帅哥,二奶,官二代这样的名词就是一个类,代表具有相似属性的一类事物.每一个类实例化之后就是对象.就像美女这原创 2012-09-08 12:07:48 · 3298 阅读 · 0 评论 -
C++与C#对比学习:内联函数,匿名函数
为啥用内联函数(inline functions) 在C++中函数调用需要建立栈环境,进行参数复制,保护调用现场,返回时进行返回值复制,恢复调用现场.这些操作都需要额外开销.那有啥好办法避免频繁的函数调用呢, 首先想到的可能是把函数中的代码直接拿来用,而不用先在某处弄个函数,然后再去调用,当然也只是函数比较简单时可行.但如果多处用到那函数的话,你全部替换会使得代码冗余,可读性下原创 2012-09-21 16:26:52 · 5172 阅读 · 0 评论 -
数组名不是指针
很多人认为数组名除了能使用中括号加下标这种特殊用法外就跟指针一样,就是一个指针.比如int arr[] = {1,2,3}; int* pInt = arr; //数组名直接赋值给指针 void Function(int* pInt) { cout } Functio原创 2012-09-21 11:47:00 · 2859 阅读 · 0 评论 -
void指针
我们知道用malloc函数申请一块内存后返回的是一个void指针,void指针又叫无类型指针,我们可以把它看成一个纯粹的指针,不指明它指向任何类型,但它可以转化成其他任何类型的指针.这其实很好理解,出于通用性考虑malloc申请了一块地址后然后用一个指针指向内存的首地址.因为不知道你申请内存给哪种类型.所以由你自己转换去. 其实我们从类的继承来考虑就比较容易理解.在MFC中所有类都继承原创 2012-09-22 14:32:54 · 2155 阅读 · 0 评论 -
C++与C#对比学习:让对象变得像常量
我们知道如果不希望改变某个变量的值就用const修饰它,让它变为常量.基本类型和指针类型都能用const来修饰.数组也可以用const来修饰.那你自然要问我们把class实例化成一个对象后,如果不希望修改对象中的成员变量,让对象变得像个常量一样该咋整呢?你首先自然会想到把类中所有的成员变量都用const修饰不就得了.其实这确实是个办法拉,但是如果我们只是想某个类的一个实例对象弄得像常量啊.原创 2012-09-22 16:39:56 · 1064 阅读 · 0 评论 -
C++与C#对比学习:模板,泛型
为啥要用模板 我们知道有很多不同的对象类型可能有相同的操作,基本类型如数值类型的都有加减乘除,比大小啊.一个个从现实中抽象出来的类就更是具体很多共性了.如果是同一类事物可以弄个父类出来就OK,比如动物都具体的某些通用操作就搞个animal基类完事.但如果不是同一类事物,就不容易整个继承关系出来啊.比如人有身高,可以计算体重,一块石头也有长宽高,可以计算体重.如果有一个计算体重的函数,大家都可以原创 2012-09-22 12:03:37 · 2111 阅读 · 0 评论 -
C++动态分配内存
为啥需要动态分配内存 数组是我们常用的一种数据结构.但它有一个缺点,就是用的时候必须确定数组大小.如果我们要用数组来保存的数据不确定可咋整啊?把数组定得太大浪费空间,太小的话又装不下.这是一种情况.另外就是对象太大.我们使用的数据大部分时候都默认保存在栈(stack)里面,由系统去管理,会自动给分配内存,自动给删除掉.但是stack很小,就那么几M,如果你读取一个几十M的文本内容然原创 2012-09-22 11:09:47 · 14568 阅读 · 2 评论 -
C++与C#对比学习:函数(一)C#参数传递存在的问题
函数可以把代码模块化,而且便于代码重复利用.继承自C++的C#,两者函数的用法大体差不多,不过的有些细小的差别.在整个C#的语法体系中对一些类型的检查相较C++更严,这样也减少了代码中可能潜在的错误.函数是由返回值类型,函数名,参数列表,函数体四大部分组成.我们知道每个变量都会取一个名字,在相同的作用域内不能定义两个相同名字的变量.函数自然也一样.不过区别函数不是只靠函数名,而是用函数名加原创 2012-10-12 22:18:02 · 3932 阅读 · 1 评论 -
C++与C#对比学习:函数(二)返回值,默认实参.this指针
函数返回值我们定义函数时会指定一个返回值类型,那在函数体中必须返回一个匹配的类型,或者隐式转换后能匹配的类型.不过有时存在这样的情况,如果函数体中存在一些分支语句,有些情况是可以返回一个值,但有时不会返回值.还是举个例子吧.有如下C++函数int FunArwen(int a , int b){if(a return 888;}很显然,上面的函数有时会返回原创 2012-10-13 16:47:26 · 2594 阅读 · 0 评论 -
C++与C#对比学习:函数(三)函数名与变量名同名问题
函数重载与函数重名 函数重名我们知道在相同的作用域中,不能定义两个名字相同的变量.那同样也不能定义两个"名字相同"的函数.不过我们判断两个函数是否同名不是仅仅根据函数名,而是根据函数签名.函数签名是由函数名和形参列表决定的.函数名字同不同我们瞧一眼就知道了.但形参列表同不同就比较复杂点了啊.形表列表中参数的个数不相同自然就是不一样的了.所以我们重点来看看参数个数相同的情况原创 2012-10-13 21:31:15 · 6026 阅读 · 0 评论 -
C++与C#对比学习:类初始化
类和柏拉图的理念世界 我们知道面向对象编程中到处是一个个的类,但类只是个概念性的东西,不是个实体,不占内存,你没实例化之前也不能用它.只有把类实例化成一个对象后,它才是一个真正存在的实体.占有内存,能被我们使用.类就有点像柏拉图所说的理念世界一样,柏拉图认为存在着两个世界,一个是我们生活于其中的现实世界,与之对立的是理念世界,理念世界有些啥东东呢?那是个永恒不变的世界,由一堆堆的理念组成,比原创 2012-09-23 13:44:14 · 2561 阅读 · 0 评论 -
C++与C#对比学习:函数(五)克隆函数,面向接口编程思想
我们知道C++中有复制构造函数的概念,C#其实也有复制构造函数的,但平时我们一般没有提到这个说法,而且基本上不这么用.C#中常用到的克隆函数.它们实现的功能基本类似,都是拷贝一些值.但复制构造函数是在调用构造函数实例化一个类时直接拷贝另外一个对象的值,而克隆函数是等你实例化完了之后再拷贝另外对象的值.为啥需要克隆函数克隆,顾名思义,是复制一个啥东西.我们有时需要把一个对象中的内容复制以原创 2012-10-14 11:24:26 · 2840 阅读 · 0 评论 -
C++与C#对比学习:消息,事件(一)
窗体(windows),事件(event),消息(message) 我们大部分人用的操作系统都是微软的windows系列.windows顾名思义是窗口,窗体.它最大的特点就是几乎所有操作都是图形界面.在面向对象开发中是一切皆对象,那在windows的操作中是一切皆窗体.窗体背后对应的是消息机制.是以消息以基础,以事件为驱动.所谓窗体就是我们能用眼睛看得到的一个个图形界面,几乎任何原创 2012-09-19 16:28:09 · 2486 阅读 · 0 评论 -
<<C++的设计与演化>>读书笔记(四)
>原文摘录与自己翻译及注解原文1:1.Even though support of concurrency and Simula-style simulations was a primary aim of C with Classes,the language contained no primitives for expressing concurrency;...........原创 2012-10-24 15:02:23 · 1065 阅读 · 0 评论 -
什么叫编译时和运行时
以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了.编译时编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我原创 2012-10-24 15:52:19 · 27897 阅读 · 17 评论 -
<<C++的设计与演化>>读书笔记(二)
>原文摘录与自己翻译及注解原文1:1.There is no agreement on what a programming language really is and what its main purpose is supposed to be.Is a programming language a tool for instruscting machines? A means原创 2012-10-23 21:01:20 · 955 阅读 · 0 评论 -
<<C++的设计与演化>>读书笔记(一)
初读此书感触 以前看些大家所谓的关于编程语言的经典著作时,觉得相较一般书籍来讲确实好很多,不仅讲怎么使用某个语言特性而且解释了为什么那样用,那样设计.我们不仅要知道how to do that,要想理解的更透彻还比较知道why to do that .而且在了解出于什么原因设计一个语言特性时,我们会想到为达到一个目的会有多种选择和取舍,而语言的设计者为什么会选择其中某一种呢? 关于why t原创 2012-10-23 16:31:41 · 1609 阅读 · 0 评论 -
C++与C#对比学习:预编译与编译机制(一)
源代码的翻译简介我们知道机器其实是比较笨的,它只认识0101这样的机器语言.你用高级语言写的源代码对机器来说就像地球人看火星文一样,没法整明白的.必须要经过中间很多翻译环节.通常来说分为如下四步,实际上每一步都相当于在做翻译中的一小部分工作.1.预编译阶段,也叫预处理.顾名思义就是在处理之前预先做些准备工作.比如你写的#include #define这样的预编译指令,还有一些注释,编译原创 2012-10-26 17:00:27 · 2528 阅读 · 0 评论 -
C++与C#对比学习:预编译与编译机制(二)
常用预处理指令 C++中常用预处理指令前面讲了主要有四种1.include引用头文件 2.条件编译#define #ifdef等 3.#define定义宏 4.progma 1.include引用头文件我们经常会看到#include "ABC.h" 和#include 这样的写法. "ABC.h"这样带个h的预编译时直接在当前项目目录上去找.而这样的是去系统目录中.那原创 2012-10-26 18:32:37 · 3207 阅读 · 0 评论 -
<<C++的设计与演化>>读书笔记(三)
>原文摘录与自己翻译及注解原文1:1.I find Kierkegaard's almost fanatical concern for the individual and keen psychological insignts much more appealing than the grandiose schemes and concern for humanity in the原创 2012-10-23 22:05:47 · 1009 阅读 · 0 评论 -
一个简单程序的创建与运行过程
在windows下创建一个简单程序的过程大概是这样几步1.编写源代码.(一般是在像VS这样的集成开发环境中,但也可以在一个文本文件中直接敲代码.)2.编译源代码.(就是把你能认识的代码转化成机器能认识的010这样的代码.一般是一成一个obj目标文件.实严格来说这一步是包括编译和汇编两步.先是编译成汇编语言,然后再用汇编器转换成机器语言)3.链接.(第2步只是把你写的代码生成目标文件.但原创 2011-11-16 12:05:36 · 1108 阅读 · 0 评论 -
C++默认参数注意事项
默认参数在函数参数较多时是非常有用的.可以只传必须的值,其它取默认值.使用方法如下: 1.默认参数是严格按照从左至右的顺序使用所以只有如下使用才是合法的(1)参数全部为默认值. void Fun( int a = 1, int b = 2, int c = 3)(2)void Fun(int a , int b = 2, int c = 3)(3)void Fun(int原创 2013-01-08 15:22:00 · 17987 阅读 · 0 评论 -
C++中char与wchar_t符号问题
对于C++中的其他整数和浮点数的符号问题我们是很清楚的.因为C++标准有明确规定.浮点型float和double是没有符号这一说.它们俩的表达范围是固定的.能表示正数和负数.如果你这样写unsigned float编译器会把unsigned标志忽略掉.整型short ,int , long 是不加指明就默认为signed. 但char , wchar_t这两个跟字符有关的类型就有点原创 2013-01-24 17:19:08 · 2875 阅读 · 1 评论 -
深入理解内存(1):原理简介
发现编程的很多问题最后整来整去,最后又是归结到内存上面来了.所以决定好好来研究下内存. 我们知道冯.诺伊曼体系结构中是把计算机划分为输入设备,输出设备,存储器,控制器,运算器. 输入设备主要是键盘,鼠标,输出设备主要是显示器,打印机控制器与运算器我们一般全称为CPU.存储器主要指硬盘与内存. 为啥windows上的应用软件都差不多一样我们开发软件时不会直接面对硬件(原创 2013-01-15 15:03:06 · 2040 阅读 · 0 评论 -
深入理解内存(2):发展历史,内存地址
事物的发展总是从简单到复杂,当然我们学习应该是先从简单到复杂学习,然后慢慢思考融汇贯通,最后又把复杂化为简单.我们先来看看在计算机刚出来不久内存是怎么被使用,然后随着技术的发展又是怎么演化的.当然这里的描述只是简单化的体现下那种思想,很多细节未必准确. 简单的历史故事1.单用户使用内存刚开始的时候电脑功能相当简单,而且用电脑的也都是些高手专家,对硬件相当的了解.此时也没有啥操作原创 2013-01-15 20:08:51 · 2015 阅读 · 0 评论 -
C++对象模型(1):对象内存布局简介
我们知道当实例化一个类时,也就是产生一个对象时需要分配内存空间.那一个对象具体需要多少字节的内存空间? 通过些什么规则计算出来的? 假如有如下一个类------------------------------------------------------------------------------------------------------------------------原创 2013-02-04 11:45:13 · 1412 阅读 · 0 评论 -
C++与C#对比学习:内存管理
我们知道计算机最重要的资源就是CPU和内存了.CPU的话我们貌似不能直接去操作,都是操作系统去管.而内存的话分为内核区和用户区.内核区是由操作系统管理,我们只能通过一些API去间接操作.而用户区就可以让应用程序去使用了.我们编程大部分时候就是在用户内存区中折腾来折腾去. C++内存分区C++的内存一般分为栈(stack),堆(heap),自由存取区,全局/静态存储区,常量存储区,代原创 2012-09-13 20:47:50 · 1979 阅读 · 0 评论 -
typeid运算符
一看到typeid你先顾名思义下,觉得这会是个啥东东.首先type自然是说类型,比如int , long ,自定义类型等.而id嘛就是身份的唯一标志嘛,像你的身份证号一样.C++刚开始的时候没有typeid这玩艺的,所以最初的MFC里面整出个叫RunTimeClass的宏来做这事,判断不同的变量的类型是否相同.到后面编译器支持该功能了,能简单的用运算符typeid来判断类型是否相同了.该功能又原创 2013-03-16 20:57:08 · 3342 阅读 · 0 评论 -
C++与C#对比:强制类型转换
强类型与弱类型语言像C++,C,Java,C#这些主流的编程语言都是强类型语言.而一些脚本语言则是弱类型的,比如vbscript , javascript.1.强类型语言简单的理解就是当定义了一个变量之后就会指定一个固定的类型,并对应一个固定的内存块大小.比如有int , double ,long这一个个的类型.并且一旦一个变量被指定为某个类型后就不能被当成其他类型用.除非做转换在C+原创 2012-12-29 21:07:32 · 6019 阅读 · 1 评论 -
C++编码规范(1):代码注释
C++编码规范(1):代码注释C++编码规范(2):命名规范 当你阅读别人的代码时如果没有注释那会是件比较痛苦的事.一说到注释我们马上想到是通过//或/* */这样来添加一些描述信息.这只是狭义的注释.广义的注释我们可以理解为,任何有助于理解代码的信息都可以看成注释.我们可以把写代码和写文章类比下.自然语言会有词法,句法,语义这几个概念.代码中的语法和句法就相当于一个编程语言中原创 2013-01-09 15:20:18 · 26525 阅读 · 0 评论 -
C++编码规范(2):命名规范
C++编码规范(1):代码注释C++编码规范(2):命名规范 如果你代码中的变量名,函数数,类名都取得很好,不仅是个有意义的词或短语,而且确切的表达了该变量或函数的功能.那读起代码来就像看文章一样,绝对是一种享受.当然理想是美好的,现实可是残酷的.很少有人能做到这样.一来嘛你英语词汇量得多,不样不容易找到那么多合适并贴切的词.二来就是有些词组合就会很长,这样不得不用些缩写,而缩原创 2013-01-09 17:01:20 · 3606 阅读 · 0 评论 -
MFC的Main函数跑哪去了
习惯的思维用习惯了C的人要看一个程序时首先会想到找到那个main函数在哪,然后再顺着往下看.因为main函数作为程序的入口点,整个程序都是从那开始执行的.当在C++中SDK(win32 API project)开发时也继承沿用C的思维,是有个main函数,不过现在的main函数改名字了,叫WinMain,当然有时还有变体,比如叫_tWinMain,反正名字中总会带个Main,让我们一看就知道....原创 2012-12-31 18:13:40 · 45503 阅读 · 5 评论 -
C++ 内连接与外连接
啥叫内连接 外连接我们知道编译的时候(假如编译器是VS),是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来.简单的说,如果一些变量或函数的定义是内连接的话,链接器链接的时候就不会拿它们去与obj比较看有重复定义不,一个源文件中的extern声明的变量或函数也不能使用另外一个源文件中的内连接的变量或函数.而如果是外连接的话则需要在不同的obj中原创 2013-02-21 15:23:40 · 3388 阅读 · 1 评论 -
类设计的5个基本原则
我们常说啥面向对象三大特性:封装,继承,多态.另一种说法是:抽象,继承,动态绑定然后就是面向对象五大设计原则,面向对象的设计其实说到底就是类的设计嘛,没有了类就自然不能叫面向对象了.当然了像C#中还有所谓的接口(interface),把它理解成一个特殊的类好了.我觉得面向对象的应用中最难的就是类的设计,怎么设计好一些类没有固定标准,只有一些参考原则.所以设计类不只是技术活,而且是个艺术活.原创 2013-03-15 03:49:20 · 18459 阅读 · 3 评论 -
C++与C#对比学习:函数(四)重载函数匹配
重载函数匹配与美女挑老公的对比我们知道重载函数中可以形参个数相同,但类型不同.而C++中双允许做比较灵活的隐式类型转换.所以调用函数时怎么精确的匹配到要想的函数就是一个问题.此时一般分三个步骤去匹配(1)先把所有重载函数找出来.把形参个数相同的先选出来.形参个数不同的就直接剔除掉.这相当于是海选,比如人家美女找老公,先看第一感觉,如果第一感觉不好.你进入海选的机会都没有.(2).然原创 2012-10-13 22:57:54 · 2247 阅读 · 0 评论 -
引用是特殊指针
很多人把指针和引用看成两个完全不同的东西,引用只是个别名,不占用实际内存,只不过操作起来有点像指针.实际上引用就是一个指针,只不过是个特殊的指针,编译器对它做了些特殊的处理.它也占用内存.但由于编译器做了特殊处理,你不能用&去取址,用sizeof得到的值也不会是4或者8,而是它引用的对象的size大小.其实我们想想也知道,如果引用真只是个别名,没啥其他意思.那真是叫饱了撑着搞个引用出来啊.直接原创 2012-09-21 15:09:03 · 1429 阅读 · 1 评论 -
类的构造(1):编译器自动添加的4个函数
假如我们这样简单的定义一个类class Arwen{public : int age;}然后实例化它 Arwen wen;虽然看这个类看起来什么函数也没有,但是编译器一般会默认添加4个函数进去,分别是如下4个函数无参构造函数析构函数复制构造函数重载赋值运算符 无参构造函数如果你自己显示写了构造函数的话编译器就不再会给你自动添加一个无参构造函数进去了.原创 2013-03-26 18:51:28 · 1701 阅读 · 2 评论