|
| |
|
|
| |
·您的文章很好,真的. |
|
| |
·写的真好 本来不是很理解的typedef 现在相当好理解了 |
|
| |
·哥们 谢谢你做这么好的网站 以前怎么不知道呢 以后天天来 |
|
| |
·谢谢你,我算是明白了。 |
|
| |
·那是c 语言之父自己说的。。。 |
|
| |
·是这样的,我们不应该怪C标准不好,虽然它不能让result =&nbs |
|
| |
·我觉得象这个max()和以前的数组越界一类的事,都可以归纳为一句话,那就是,C为 |
|
| |
·好几天没来看你了,你又有进步了。 |
|
| |
·晕,我忘了相乘了,哈哈。 |
|
| |
·居然可以这样写.我也不知道.呵呵. |
|
| |
·阶乘的函数写错了.int factorial(int val |
|
| |
·简单地说,每次调用函数的时候,形参把实参克隆了一次,你再怎么折腾形参,也与实参无 |
|
| |
·偷猫你好~ 今天我也在看这本书,但是太长了...其实我对C++没什么兴 |
|
| |
·自从和草莓对骂以来,你就学会了狡辩。我有跟你讨论机器码吗?程序设计的风格是为了程 |
|
| |
·我的文章是不允许一目十行地看的,我在文中已经提到了有时候确实不需要break,那 |
|
| |
·函数的参数当然不能使用类似int i,j的方式,因为调用函数的时候,涉 |
|
| |
·错误捕捉是很烦人,我的感觉是能在try代码段外解决的错误,就尽量在外头自己解决, |
|
| |
·不主张使用GOTO语句是为了让程序看起来顺眼而己.看:模块化的代码.其实的确没什 |
|
| |
·要不要break也要看程序要求.有时候不加上break可以在某条件满足的时候,同 |
|
|
|
|
|
|
|
| |
| |
 |
文章列表 |
|
|
| |
| 1
2
3
|
之所以在学习到“类”以后要重提内联函数,是因为定义类的成员函数与全局函数在这方面有区别。区别在于,如果把函数的实体放在类的定义内,则该函数将自动成为内联函数。如: classMyClass { public: voidFunctionA(void); voidFunctionB(void) { cout<<"这是内联函数。"<<endl; } } voidMyCla... |
| 关键词:C++,VC,Primer,MFC,编程 |
2006-09-17 22:15:32 |
|
|
|
以前我知道可以用typedef来为类型起个别名,如“typedeflongINDEX;”。给long这样的类型起别名主要目的不是简化程序的书写,它有两个用处:一是表明该类型的特殊作用,二是将来有可能要改变这种类型(比如提高精度),如果直接声明为long型则失去了程序的可惟护性——每一个变量的声明都要改动;而声明为INDEX则使维护程序变得十分简单——只要改一下typedef语句即可。 然而今天我才发现,这么长时间以来我一直是“只知其一不知其二”,今天才发现这个语句也可以在类里面定义... |
| 关键词:C++,VC,Primer,MFC,编程,优化,健壮 |
2006-09-16 23:55:51 |
|
|
|
程序员在编写程序时,总是把运行应用程序的人看作用户。但是,类的出现使这个身份发生了微妙的变化。 类并不会直接给普通计算机用户使用,而是给其他程序员使用。于是,编写类的程序员需要将使用类的程序员视作用户。 这样细化将程序员分成两种,也许在某些时候类的设计者和使用者是同一个人——比如我,我单位一共只有一个程序员。但是在编写程序中时刻记住这个分工是有好处的。将程序员细分为两种至少有以下好处: 一、在考虑最终软件功能时,不需要考虑类功能的实现细则,只要知道调用接口即可。... |
| 关键词:C++,VC,Primer,MFC,编程 |
2006-09-15 23:41:40 |
|
|
|
引用:类是C++中最重要的特征。C++语言的早期版本被命名为“带类的C”。 引用:最简单地说来,类就是定义了一个新的类型和一个新的作用域。 写本文之前,我曾停下来考虑过:怎样才能概括出类?确切地说,我们从依葫芦画瓢开始一步一步写自己的类,慢慢地都会把类给学会。这中间可能要走一段弯路,总有一天会“蓦然回首,那人却在灯火阑珊处。”但是,要自己总结出什么是类,似乎还有点难度。 C++之前的struct被叫做“结构体”,这个名字起得好,把一定的数据按某个结构组织起来,要... |
| 关键词:C++,VC,Primer,MFC,编程 |
2006-09-15 23:40:31 |
|
|
|
我还真没想到字符串流的作用在哪里。字符串本身就存放在内存里,对它进行读取是从内存读到内存,对它进行写入也是从内存写到内存。那么,剩下的就是所谓的优化程序了? 本书在讲解字符串流的读入时,举的例子是先用getline来获得整行,然后借>>操作来获取每一个单词。那么,我想,既使我不使用getline,也未必不可以直接获取单词。 倒是在讲解字符串流的写操作时让我想到了一点用处:它可以将不同类型的数据一下子转化成字符串,还可以任意组合。 intval1=512,... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-12 01:19:27 |
|
|
|
文件流对象和控制台流对象的区别有以下两点: 一、文件流对象需要声明,cin、cout和cerr等不需要声明,也不允许声明。 二、文件流对像要与特定的文件绑定,并且需要自己管理文件的打开与关闭。因为cin的目标就是标准控制台,而文件流却可以操作不同名称的文件。 文件的打开有两种方式:一是在流对象的定义时直接用文件名来初始化,二是调用open函数。前者是方便一点,不过对象只能初始化一次。如果一个流对象要访问多个文件,还得用open。 在open与close... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-12 01:04:55 |
|
|
|
“PleaseInputYourName:_” 如果您编写的程序有以上功能,在显示一行提示语后等待输入,可惜的是用户只看见了光标在一闪一闪,却没看见那行提示语,那岂不是一片好心喂了狗了? 将信息写入控制台、磁盘文件之前都会在缓冲区中呆上一会儿,这么做的优点不用我来说,但是缺点也很明显:如果没有及时刷新缓冲区,将可能会造成损失。比如程序的崩溃会造成磁盘文件的残缺,给调试带来麻烦。 那么,我们要做的就是在必要的时候亲自刷新缓冲区。“endl”的作用就突显出来了。... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-12 00:19:25 |
|
|
|
如果你的程序期待用户输入一个整数,而用户偏偏输入了“abc”怎么办?放心,cin可以直接放入if或while的括号中,原因是cin可以通过标准转换变成bool变量。 进而,如果我们设计的程序须要更人性化的功能,仅判断流的一个状态是不够的,标准流为我们提供了“bad”、“fail”、“eof”有“good”成员,还提供了“setstate”和“clear”方法。充分使用这些,可以在用户输入错误类型数据时尽量恢复。 说实话,我用MFC习惯了,UpdateData()函数多好啊... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-11 23:46:37 |
|
|
|
即使你没有学到这一章,你也早该认识到cin和cout的特殊性,至少你应该发现,这两个对象是不用你声明的。 说它们是特殊的,除cin和cout不需要声明以外,包括它们在内的所有流操作对象也不允许被复制和赋值。 有时,程序员未必是有意复制和赋值的,比如把标准IO对象于在值传递的函数参数中,或者用值传递的方式作为函数的返回值。 ofstreamout1,out2; out1=out2; ofstreamprint(ofstream); out2=prin... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-11 23:45:26 |
|
|
|
我撰写的《C++Primer阅读笔记》第五篇《cout<<(wchar_t类型变量)体验》事后被证明是一篇错误的文章,错误在于我误解了书中的内容,将只能用于char类型的cout用来输出wchat_t类型数据。文章发表后不久就有人为我指出了这个错误,在此感谢文章的读者为我细心纠错与大方的指导。 事实上,为了提供对国际字符的支持,标准IO库提供了一套复制品,它们专们用于对宽字符进行处理。 当计算机们被联成网络、当世界上产生了即时共享信息的须求。字符集就是一个令人... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-11 23:23:26 |
|
|
|
 |
流 (点击:243) |
进入第8章学习。 我翻一下目录,在想一个问题:第8章以及接下来的几章是读下去还是跳过?跳过的原因是这些章节讲述的东西我自己在编程中一般是不用的。就拿IO来说,我编写MFC程序,从来不使用IO似乎也没什么问题;再拿容器来说,我经常亲自管理链表而不使用vector,即使有时想用容器,也是用了MFC中的CPtrList。 最终决定继续读下去而不跳过它们,原因是本书经常会不经意间讲述一些真知。 标准IO给我的感觉就是对“流”的成熟控制和安全封装。虽然早期的C语言中也有流... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-11 23:05:53 |
|
|
|
打架了!打架了! 谁跟谁打?两个不同的概念呗。 “重载函数”是“作用域相同函数名相同而参数表不同的函数”,它弱化了返回值,强调了函数名和参数表; “指向函数的指针”是“指向同一类型函数的指针”,它弱化了函数名,强调了返回值和参数表——因为“函数类型”是由返回值和参数表决定的; 那么,这三个元素放在一起考虑会怎样呢? 如果仅有返回值不同,则它们是不同类型的函数,它们的地址不可以交叉给指针赋值,但是它们不属于重载而属于错误声明; 如果仅... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-10 00:52:17 |
|
|
|
本文已经写到第四篇了,破例先公布程序代码,再来讲述“所以然”。 //假定intBigger(int)和intSmaller(int)已经声明 //请参照上文《指向函数的指针二》 typedefint(*cmpFun)(int);//定义一个别名 cmpFunGetFun(void)//用别名来声明GetFun的返回值 { returnBigger; } cmpFunGetFun1(void) { returnSmaller;... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-10 00:20:49 |
|
|
|
“指向函数的指针”既然是指针,当然也就是变量喽,它也可以作为参数在函数调用中传递,还可以作为函数的返回值。不过使用起来比指向变量的指针要复杂一点。 理解了“指向函数的指针”的声明,就不难理解将这个声明放入另一个函数的声明中,作为该函数(即“另一个函数”)的一个参数或返回值。比如: //假定intBigger(int)和intSmaller(int)已经声明 //请参照上文《指向函数的指针二》 voidCallByPoint(inti,int(*pFun)(int)... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-09 23:51:32 |
|
|
|
我使终这么认为:要理解指向函数的指针,首先要深刻理解指向变量的指针。所以,我在写作的时候总是会拿这两者来对比。 使用指针有什么好处?作为C语言的初学者,使用指针可能是为了在函数间进行“按地址传递”,然而这叫做知其然不知其所以然。指针的本质作用是可以用一个变量来灵活地代表一组变量中的任何一个。在处理数组、链表等数据结构时,指针的这个功能就很明显地表现出来。如: intMaxVal=*p;//假定p指向的数组有10个int型元素 for(int*i=p+1;i<p+1... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-09 00:03:54 |
|
|
|
要完全区分一个函数,可以凭几个特征:一是返回值、二是函数名、三是参数类型与个数。前文提到函数重载时,返回值不作为特征来区分(即只有返回值不同的函数不视为重载函数,第二个视为错误声明)。本文要提到“函数类型”,您将发现函数名不作为特征。 引用:函数类型由其返回值类型及形参表确定,而与函数名无关。 之所以要提函数类型这个概念,是因为本文要弱化函数的名称了。原因很简单,有了指针就不用管它所指对象的名称了,也不能管。 要彻底理解指向函数的指针,我认为还得先回顾指向变量的... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-08 23:24:58 |
|
|
|
函数调用时从来没有在匹配上冒出过大问题,直到重载概念的到来。因为重载函数允许一批函数共用一个函数名。 以往调用函数是依赖函数名的,直接找到对应的函数名,检查一下参数个数和类型是否符合即可。现在就只好凭函数名和参数一起来确定该调用哪个函数了。 若是凭参数能唯一确定函数那自然好,可是参数还存在类型转换与区配的问题。这就增加了函数匹配的难度,有时甚至明明有多个函数供选择却找不到能匹配的。 书上为重载确定整理了以下几个步骤:“候选函数”、“选择可行函数”、“寻找最佳匹配... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-08 21:50:56 |
|
|
|
本文还是对前文的补充。 在《重载函数的概念》一文中,提到过“Recordlookup(Phone);”和“Recordlookup(constPhone);”并不是重载,因为形参仅仅区别在是否const。在那篇文章的结尾,还留了一句话:“有的时候可以凭是否const来重载,比如引用传递和指针传递。” 这里就有必要知道引用传递、指针传递和值传递前加const的实质了。 首先要说的是,非const的引用和非const的指针都可以传递给const的形参。也就是说,即使... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-03 23:27:49 |
|
|
|
前文说过,重载不仅仅是函数名相同而形参不同,还有一个非常重要的特性就是相同的作用域。那么不同的作用域主要有什么表现呢? 本书在这个章节只提了嵌套与被嵌套的作用域,也许是因为本书的内容还没有进入到对类的详细讲述。那么,我自己感觉就是,作用域主要有全局、局部和类作用域几种。全局作用域作用范围最大,局部作用域之间有不同的范围(可能包含可能不包含),类作用域之间完全独立(类对象的继承与类的派生不在这个考虑之列)。 可以这么说,一般情况下作用域大的对象(包括变量名和函数名)在小的作... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-09-03 22:48:05 |
|
|
|
重载函数是C++提出来的概念,但是在C中却未必没有。比如“1+3”和“1.0+3.0”,虽然都是加法,做的却不是同的操作:编译器要因操作数的不同而调用不同的加法操作。只是C语言中除了内部类型变量可以参与运算以外,没有“类”这么高深的概念。“结构体”也只是内存数据的组织方法,而不涉及对整个结构体的处理。所以,在C语言时代编译器明明做了类似于重载的事情,却可以像雷锋一样“做好事不留名”。 C++发展出了类,并且赋予了“类”很高的期望,类的对象也能像内置类型对象一样参与一切运算。那么,就... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-27 21:34:29 |
|
|
|
引用:出现在相同作用域中的两个(可以是两个以上——偷猫注)函数,如果具有相同的名字而形参表不同,则称为重载函数。 本节开头第一句话就给出了重载函数的定义:重载函数必须符合两个条件:一是出现在相同的作用域中、二是函数名字相同而形参表不同。 其中第一个条件一般人往往是不去想的,其实函数名相同而作用域不同的函数大大存在,比如在MFC中就有。它们是完全不相干的函数。 第二个条件还可以详说一下:函数名字相同当然不在话下,这是函数被称为“重载”的根源。之于形参表不同,可能表... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-27 20:51:29 |
|
|
|
一个程序往往由多个源文件组成,这些代码究竟应该放在哪个源文件里、哪些代码可以放在同一个源文件里、哪些代码必需分开放。这是一个管理层面的问题。 说它是管理层面的问题,是因为这些代码的组织往往没有惟一的准则。但是它们还是有一定的规律的。 首先,软件的维护是一个复杂的系统工程。代码的组织应该有利于维护。应该尽量把直接相关的内容放在同一文件、不相关的内容放在不同的文件里。如果这些代码还有亲和疏,那就要分不同的文件夹来存放了。 其次,软件的代码是一个严格的组织体系。不同的... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-16 21:49:43 |
|
|
|
引用:构造函数是特殊的成员函数。 笔记:构造函数的确是一类“特殊”的成员函数。它的特殊性至少表现在以下几个方面:一是它的调用不用程序员操心,只要类对象被创建它就会被调用,而且它不允许被程序员显式地调用。二是它们是必需的,如果程序员偷懒,编译器将自动创建简单的构造函数。三是它们的名字不用程序员多考虑,直接与类名相同。四是它们没有返回值。 下面详说这几个特性: 一、它们在类对象被创建时自动调用,创建对象可能有以下方法:程序中用声明变量的语句直接声明创建,或者在程序中... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-15 23:43:33 |
|
|
|
类与C语言中的结构体最大的区别就是类可以带函数,而结构体只是一个内存组合。所以,要提类就不得不提成员函数。 类的成员函数与普通函数(全局函数)相比,最根本的区别是实现了类的封装性。封装性的第一个表现是访问权限:都是函数,但是你能访问哪个不能访问哪个却可以设定。第二个表现是直观,通过类成员(或指针)来调用函数,给人的直觉就是“这是类提供的功能”。你好像“Bird.Fly();”一样一目了然。 在理解this指针以前要想彻底理解成员函数是有困难的,我就曾以为在类的实例中保存了... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-11 02:46:34 |
|
|
|
| 内联函数应该是为了改善C语言中的宏替换的不足而产生的吧。因为宏替换是预编译中直接展开的,展开过程中将产生意想不到的结果。典型的有“#defineMAX(a,b)(a)>(b)?(a):(b)”。“result=MAX(i,j)+2;”将被展开为“result=(i)>(j)?(i):(j)+2;”。虽然外面再加一对括号可以解决以上问题,但是“result=MAX(i++,j);”被展开后将导致i被自增1了两次。(以上例子摘自林锐博士的《高质量C++/C编程指南》第66页,林锐管这... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-05 00:32:00 |
|
|
|
本节首先向读者说明了“名字的作用域”和“对象的生命周期”这两个概念,不难,理解了就行了。前者是空间概念:指程序还处在代码阶段的时候这个名字的可见范围,后者是时间概念:指程序运行过程中对象的存在时间。 函数的形参以及函数内部声明的对象都是局部对象,它们的作用域就是函数内部,但是它们的生命周期却未必是函数的执行过程。这看起来有点摸不着头脑,原因在于C++的函数中允许存在以关键字“static”声明的静态对象。 也就是说,静态对象是这样一个对象:它的生命周期很长,可以跨越该函数... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-04 23:48:56 |
|
|
|
没什么比偷懒更舒服的了,所以我喜欢允许默认实参的函数,我还喜欢写允许默认实参的函数。 在形参表中,如果允许某些形参具有默认值,则它们必须按从右到左的方向排列。以上这个规定C++与BASIC是一样的,但是C++与BASIC还有一点区别,就是在函数调用时,C++必须从右边开始缺省实参,而BASIC却可以任意缺省而不顾次序(只要有逗号表示那里缺了个东西即可)。所以,同样设计函数,C++比BASIC要多考虑一个问题:“设计带有默认实参的函数,其中部分工作就是排列形参,使最少使用默认实参的表... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-03 09:34:04 |
|
|
|
注:本书中提到了“声明”与“定义”两个词。我倒是认为将后者改为“实体”更好。 函数的实体就是实实在在的函数内容,它规定了这个函数怎样执行,这没有什么好说的。那么函数为什么还要有声明呢? 这样做的目的之一是告诉编译器:虽然你还没有见到函数本身,不知道函数是怎样执行的,但是我先告诉你这个函数的名称、参数与返回值,你就先编译吧。至于这个函数究竟干什么,等到连接的时候再说。 设计合理的程序,其代码存放在不同的文件中,函数的实体只能有一个,存放在某一个源文件中。其它源文件... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-02 23:15:36 |
|
|
|
 |
递归 (点击:221) |
引用:直接或间接调用自己的函数称为递归函数。 引用:递归函数必须定义一个终止条件,否则函数将永远递归下去,这意味着函数会一直调用自身直到程序耗尽。 初识递归的时候,的确有些不容易搞明白。记得当时的教科书为此画一个图,用一组箭头来表示要计算A必须先计算B、要计算B又要先计算C、……,用另一组箭头表示算好了C就可以算B、算好了B就可以算A。……实例程序与一个图结合,如此摆事实讲道理,要说明递归自然稍容易些。 要写递归函数就得领悟递归的妙用,要写没有错误的递归函数则要... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-02 05:07:32 |
|
|
|
引用:return语句用于结束当前正在执行的函数,并将控制权返回给调用此函数的函数。 引用:return语句有两种形式:reutrn;returnexpression;……第二种形式提供了函数的结果。 笔记:以上第一句话说了return的两个作用之一:结束函数。return的作用之二是提供函数的返回值。 对于return语句的两种形式,情式一只能用于无返回值的函数,情式二可以用于有返回值的函数也可用于无返回值的函数。 如果函数有返回值,就必须用形式二来... |
| 关键词:C++,MFC,VC,Primer,编程,教程,读书 |
2006-08-01 01:24:47 |
|
|
|
| 1
2
3
|
|
|
|
|
|
|