⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_66290.htm

📁 vc
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<blockquote><p>
回复者:loveyjohn 回复日期:2003-12-30 17:56:09
<br>内容:ding
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ljl 回复日期:2004-01-06 10:17:30
<br>内容:第四章&nbsp;&nbsp;&nbsp;&nbsp;表达式<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;static_cast&lt; int &gt;(byte_value) 称为显式类型转换(explicit type conversion) 或强制类型转换(cast).<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;标准C++头文件limits提供了与内置类型有关的信息,例如一个类型能表示的最大值和最小值。另外,C++编译系统也提供了标准C头文件climits和cfloat,他们定义了提供类似信息的预处理宏。<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;对于逻辑与操作符(exp1 &amp;&amp; exp2),一个很有价值的用法是:在某些使expr2的计算变得危险的边界条件出现前,先使expr1计算为false,如<BR>while( ptr != 0 &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;prt -&gt;value &lt; upperBound &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr -&gt;value &gt;= 0 &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;notFound( ia[ ptr-&gt;value ] ))<BR>{ … }<BR>值为0的指针不指向任何对象,所以当判断ptr !=0 为false后,后面的不予执行,也就避免了操作空指针的麻烦。同样,只有当前三个操作数计算的结果全为true,最后一个操作数才会安全的被计算。<BR>对于逻辑或,应该也存在同样的问题,只要第一个判断式为true,整个条件就为true,不过这也为测试带来了“隐患”,必须用false || true进行一遍。<BR>4.&nbsp;&nbsp;&nbsp;&nbsp;一个对象只能被初始化一次(定义的时候),但是可以被赋值多次。赋值操作符的左操作数必须是左值 --- 有一个相关联的、可写的地址值。但是,只有左值还不够,如: const int i = 1; i = 2;是错误的,因为有const修饰符。又如,对于数组ia:ia=pia;是错误的,尽管ia也是左值。<BR>5.&nbsp;&nbsp;&nbsp;&nbsp;只有每个被赋值的操作数都是相同的数据类型,赋值操作符才可以被连接在一起使用:int a, b; a = b = 2; 正确!<BR>6.&nbsp;&nbsp;&nbsp;&nbsp;可以用成员访问语法来读取实部或虚部:complex_obj.real()和complex_obj.imag(),或者real(complex_obj)、imag( complex_obj )<BR>7.&nbsp;&nbsp;&nbsp;&nbsp;sizeof操作符:返回一个对象或类型名的字节长度,有三种形式,返回值的类型是size_t。<BR>#include &lt;cstddef&gt;<BR>int ia[] = { 0, 1, 2};<BR>size_t array_size = sizeof ia; //返回整个数组的大小(整个数组的字节长度,而不是第一个元素的长度,也不是ia包含的元素的个数)<BR>size_t element_size = array_size / sizeof( int );//返回int类型的大小<BR><BR>又如,int *pi = new int[ 3 ];<BR>size_t pointer_size = sizeof( pi );<BR>返回的值是指向int型的指针的字节长度,而不是pi指向的数组的长度<BR><BR>l&nbsp;&nbsp;&nbsp;&nbsp;sizeof操作符应用在char类型上时,在所有的C++实现中都是1。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;sizeof操作夫在编译时刻计算,因此可被看作常量表达式,可用作数组的维数或模板的非类型参数。<BR>8.&nbsp;&nbsp;&nbsp;&nbsp;new和delete表达式<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;系统为每个程序都提供了一个在程序执行时可用的内存池,被称为程序的空闲存储区(free store)或堆(heap),运行时刻的内存分配被称为动态内存分配。<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;所有从空闲存储区分配的对象都是未命名的。New表达式并不返回实际被分配的对象,而是返回这个对象的地址。对象的所有操作都通过这个地址间接来完成。<BR>9.&nbsp;&nbsp;&nbsp;&nbsp;逗号操作符的表达式从左向右计算,结果是最右边的表达式的值。<BR>10.&nbsp;&nbsp;&nbsp;&nbsp;位操作符<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;强烈建议使用无符号类型整数作为位向量。<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;bitset类 #include &lt;bitset&gt;, 相关的成员函数见139页<BR>11.&nbsp;&nbsp;&nbsp;&nbsp;<BR>第五章&nbsp;&nbsp;&nbsp;&nbsp;语句<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;几个编码规则:<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;避免使用全局变量,并适当地使用 namespace<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;尽可能把所有的声明置于块一开始的地方,以便能轻易看见所有被定义以及被使用的对象<BR>3)&nbsp;&nbsp;&nbsp;&nbsp;当声明涉及许多修饰词时,每一个应占用独立的一行,以免产生“究竟是那一个对象被修饰”的困惑。<BR>4)&nbsp;&nbsp;&nbsp;&nbsp;为所有的变量设立初值。<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;isalpha()是标准C库的一个例程:如果它的参数是一个英文字母,则返回true,头文件为 ctype.h。<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;把一条声明语句放在与case或default相关联的语句中是非法的,除非放在一个语句块中,如:<BR>case illegal_definition:<BR>//错误:声明语句必须放在语句块中<BR>string file_name = get_file_name();<BR>break;<BR>上面须在case后加{ … }<BR>4.&nbsp;&nbsp;&nbsp;&nbsp;do <BR>statement <BR>while(condiction)&nbsp;&nbsp;结构至少可以保证循环一次,而while(condiction)则有可能一次都不执行。<BR>5.&nbsp;&nbsp;&nbsp;&nbsp;abort()终止整个程序,包含在c头文件cstdlib中;一般情况下,应该避免终止程序。一般来说,抛出异常比终止程序更好一些。<BR>6.&nbsp;&nbsp;&nbsp;&nbsp;关于成员函数重载的问题:当你写了一个带有默认参数的函数时,你可以在调用时不特别声明那些默认的参数。反过来就是说,当你调用了一个find(int)时,它可以匹配那个不带默认参数的函数定义,也可以匹配那个带有默认参数的定义。这样它就不知道到底需要调用那个函数了。如:<BR><BR>#include &lt;iostream&gt;<BR>using namespace std;<BR><BR>class test<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;test(){}<BR>&nbsp;&nbsp;&nbsp;&nbsp;~test(){}<BR>&nbsp;&nbsp;&nbsp;&nbsp;void fun( int );<BR>&nbsp;&nbsp;&nbsp;&nbsp;void fun( int, int );<BR>};<BR><BR>void test::fun(int i){&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; &#34;One Parameter!&#34; &lt;&lt; endl; }<BR><BR>//void test::fun(int i, int j = 0 )//错误<BR>void test::fun(int i, int j ) //正确<BR>{&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; &#34;Two Parameter!&#34; &lt;&lt; endl; }<BR><BR>int main(){&nbsp;&nbsp;&nbsp;&nbsp;test myTest;&nbsp;&nbsp;&nbsp;&nbsp;myTest.fun( 1 );&nbsp;&nbsp;&nbsp;&nbsp;return 0; }<BR>7.&nbsp;&nbsp;&nbsp;&nbsp;<BR>第六章&nbsp;&nbsp;&nbsp;&nbsp;抽象数据类型<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;顺序容器拥有由单一类型元素组成的一个有序集合。<BR>a)&nbsp;&nbsp;&nbsp;&nbsp;两个主要的顺序容器是list和vector,还有双端队列deque;关联容器支持查询一个元素是否存在,并且可以有效地获取元素,如map(映射)和set(集合).map是一个键/值(key/value)对:前者用于查询,值包含我们希望使用的数据。如map可以很好地支持电话目录,键是人名,值是相关联的电话号码。Set包含一个单一键值,有效支持关于元素是否存在的查询。map和set都只包含每个键的唯一出现,multimap和multiset支持同一个键的多次出现。<BR>b)&nbsp;&nbsp;&nbsp;&nbsp;容量是指在容器下一次需要增长之前能够被加入到容器中的元素的总数(容量只与连续存储的容器相关,如vector、deque或string.list不要求容量)。可用capacity()获得一个容器的容量,而长度(size)是指容器当前拥有元素的个数,可用size()操作。<BR>c)&nbsp;&nbsp;&nbsp;&nbsp;表6.1&nbsp;&nbsp;&nbsp;&nbsp;长度、容量、以及各种数据类型<BR><BR>数据类型&nbsp;&nbsp;&nbsp;&nbsp;长度(字节)&nbsp;&nbsp;&nbsp;&nbsp;初始插入后的容量<BR>Int&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;256<BR>Double&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;128<BR>简单类(simple class)&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;85<BR>string&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;85<BR>大型简单类&nbsp;&nbsp;&nbsp;&nbsp;8000&nbsp;&nbsp;&nbsp;&nbsp;1<BR>大型复杂类(large complex class)&nbsp;&nbsp;&nbsp;&nbsp;8000&nbsp;&nbsp;&nbsp;&nbsp;1<BR><BR>关于插入时间的比较,参见p216页<BR><BR>结论:对于小的数据类型,vector的性能要比list好得多,而对于大型的数据类型则相反,list的性能要好得多。区别是由于vector需要重新增长以及拷贝元素。<BR>但是,数据类型的长度并不是影响容器性能的唯一标准,数据类型的复杂性也会影响到元素插入的性能。因为简单类对象和大型简单类对象通过按位拷贝插入(一个对象的所有位被拷贝到第二个对象的位中),而string类对象和大型复杂类对象通过调用拷贝构造函数来插入。<BR><BR>d)&nbsp;&nbsp;&nbsp;&nbsp;一些操作函数:<BR>l&nbsp;&nbsp;&nbsp;&nbsp;reserve()操作允许程序员将容器的容量设置成一个显式指定的值。如:vec.reserve(32);<BR>l&nbsp;&nbsp;&nbsp;&nbsp;empty()判断是否为空<BR>l&nbsp;&nbsp;&nbsp;&nbsp;push_back()插入容器尾部<BR>l&nbsp;&nbsp;&nbsp;&nbsp;对于list和queue,也支持push_front(),插入前端。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;resize():重新设置容器的长度<BR>l&nbsp;&nbsp;&nbsp;&nbsp;容器可以比较大小:相等(所有元素相等而且含有相同数目的元素);大于小于(比较第一个不相等的元素来决定)<BR>l&nbsp;&nbsp;&nbsp;&nbsp;insert(p1,p2): p1参数指向容器中某个位置的iterator,第二个参数p2是要插入的值。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;insert(p1,p2,p3): p1同上;p2是插入数量;p3是插入值。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;insert(p1,p2,p3): p1同上;p2-p3是指插入范围值。P225。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;find(p1,p2,p3): P1-p2指起始范围,p3查找值。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;erase(): 删除一个或一段元素<BR>l&nbsp;&nbsp;&nbsp;&nbsp;pop_back()删除容器末元素---它不返回元素,只是简单的删除它。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;swap()对换元素。<BR>l&nbsp;&nbsp;&nbsp;&nbsp;istream&amp; getline( istream &amp;is, string str, char delimiter ); 读取istream对象,向string对象插入字符,包括空格,直到遇到分割符、文件结束,或者被读入的字符序列等于string对象的max_size()值,在该点处读入操作失败。<BR>e)&nbsp;&nbsp;&nbsp;&nbsp;能够定义的容器类型有三个限制(只适用于用户定义的类类型,所有预定义类型包括指针都满足这些限制)<BR>l&nbsp;&nbsp;&nbsp;&nbsp;元素类型必须支持等于操作副<BR>l&nbsp;&nbsp;&nbsp;&nbsp;元素类型必须支持小于操作副<BR>l&nbsp;&nbsp;&nbsp;&nbsp;元素类型必须支持一个缺省值(对于类,即指缺省构造函数)。<BR>f)&nbsp;&nbsp;&nbsp;&nbsp;<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;vector、deque和list都是动态增长的,选择标准主要是关注插入特性以及对元素的后续访问要求。<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;vector:连续的内存区域,随机访问效率高,插入删除效率低。Vector并不是随每一个元素的插入而增长自己,而是当vector需要增长自身时,它实际分配的空间比当前所需的空间要多一些,也就是说,它分配了一些额外的内存容量,或者说他预留了这些存储区(分配的额外容量的确切数目由具体实现定义)。实际上,对于小的对象,vector在实践中比list效率更高。<BR>Vector的动态自我增长越频繁,元素插入的开销就越大。两种解决方案:<BR>a)&nbsp;&nbsp;&nbsp;&nbsp;当vector开销变大时,把vector转换成list.<BR>b)&nbsp;&nbsp;&nbsp;&nbsp;更常用的方案时,通过指针间接存储复杂的类对象。首先,容量从1增加到256,重新分配的次数大大减少。其次,指向类对象的指针的拷贝和释放不需要调用该类的拷贝构造函数和析构函数。<BR><BR>2)&nbsp;&nbsp;&nbsp;&nbsp;list:非连续的内存区域,并通过一对指向首尾元素的指针双向联结起来,从而允许向前向后两个方向进行遍历。插入和删除效率高,随机访问支持不好。<BR>3)&nbsp;&nbsp;&nbsp;&nbsp;deque也表示一段连续的内存区域,支持高效在首部插入和删除元素,通过两级数据结构来实现,一级表示实际的容器,第二级指向容器的首和尾。如果容器的主要行为是在前段插入元素,则deque比vector效率高。<BR><BR>选择顺序容器类型的一些准则:<BR>a)&nbsp;&nbsp;&nbsp;&nbsp;随机访问一个容器,vector比list好的多。<BR>b)&nbsp;&nbsp;&nbsp;&nbsp;已知要存储元素的个数,vector又是一个比list好的选择。<BR>c)&nbsp;&nbsp;&nbsp;&nbsp;不只是在容器两端插入和删除元素,则list比vector好。<BR>d)&nbsp;&nbsp;&nbsp;&nbsp;Unless we need to insert or delete elements at the front of the container, a vector is preferable to a deque.(除非我们需要在容器首部插入和删除元素,否则vector要比deque好)<BR>如果两者都需要,则要根据程序的主要操作来决定,如果两种容器都不够满意,只能自己设计更复杂的数据结构。<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;iterator: end()指向最后一个元素的下一个位置;对于const容器则用const_iterator<BR>4.&nbsp;&nbsp;&nbsp;&nbsp;string类:<BR>find()返回匹配子串的第一个字符的索引位置,或返回一个特定的值:string::npos表明没有匹配。<BR>find_first_of()查找预备搜索字符串中任意一个字符相匹配的第一次出现,并返回索引位置。可以有1或2个参数,详见P231<BR>substr()生成现有string对象的子串的一个拷贝<BR>rfind()查找最后的指定子串的出现<BR>find_first_not_of()查找第一个不与要搜索字符串的任意字符相匹配的字符。P235<BR>find_last_of()查找字符串中的“与搜索任意字符相匹配“的最后一个字符。<BR>Find_last_not_of()查找字符串中的“与搜索字符串任意字符全不匹配“的最后一个字符。<BR>tolower()大写转换小写&nbsp;&nbsp;<BR><BR>5.&nbsp;&nbsp;&nbsp;&nbsp;当我们只想知道一个值是否存在时,set最有用,希望存储(修改)一个相关的值时,map最有用。Count(KeyValue)返回map中keyValue出现的次数;Find(keyValue)返回指向该实例的iterator,如果不存在,则返回等于end()的iterator.size()返回map个数,empty()判断空。<BR>6.&nbsp;&nbsp;&nbsp;&nbsp;#pragma warning(disable : 4786)可以消除vc中的警告(warnings).<BR>7.&nbsp;&nbsp;&nbsp;&nbsp;set只是键的集合。<BR>8.&nbsp;&nbsp;&nbsp;&nbsp;<BR>第七章&nbsp;&nbsp;&nbsp;&nbsp;函数<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;函数调用导致两件事情发生,如果函数已经被声明为inline,则函数体可能已经在编译期间他的调用点上就被展开;如果没有被声明为inline,则函数在运行才被调用。<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;引用的应用:a) 用指针类型来改变实参的值&nbsp;&nbsp;b) 向主调函数返回额外的结果&nbsp;&nbsp;c) 向函数传递大型类对象,如果为了防止更改类对象的值,可以用const &amp;。<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;引用还是指针?引用必须被初始化为指向一个对象,不能再指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。<BR>4.&nbsp;&nbsp;&nbsp;&nbsp;在c++中,数组永远不会按值传递,它是传递第一个元素的指针,所以在被调函数内对参数数组地改变将被用到数组实参上而不是本地拷贝上。如,<BR>void fun(int *a)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;a[0] = 1;&nbsp;&nbsp;&nbsp;&nbsp;a[1] = 2;<BR>}<BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int aa[ 2 ] = {3,3};&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; aa[ 0 ] &lt;&lt; &#34; &#34; &lt;&lt; aa[1] &lt;&lt; endl; //output: 3&nbsp;&nbsp;3<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;fun(aa);&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; aa[ 0 ] &lt;&lt; &#34; &#34; &lt;&lt; aa[1] &lt;&lt; endl; // output: 1, 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR>当用作实参的数组必须保持不变时,函数可以通过把参数类型声明为const来表明不希望改变数组元素。另外,数组的长度不会被检测出,必须额外提供;另一种机制是将参数声明为数组的引用。对于多维数组,必须指明第一维以外的所有维的长度。<BR>5.&nbsp;&nbsp;&nbsp;&nbsp;多个实参时,可以省略右边的,但不能省略左边的实参。<BR>6.&nbsp;&nbsp;&nbsp;&nbsp;缺省情况下,函数的返回值是按值传递的,这意味着得到控制权的函数将接受返回语句中制定的表达式的拷贝。当返回大型类对象时,最好用引用或指针。<BR>7.&nbsp;&nbsp;&nbsp;&nbsp;inline函数:在程序中每个调用点上被“内联地”展开。它必须在调用函数的每个文本文件中定义。建议:把inline函数的定义放到头文件中,在每个调用该inline函数的文件中包含该头文件,这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的不匹配的事情。<BR>8.&nbsp;&nbsp;&nbsp;&nbsp;链接指示符:extern “C”:单一语句形式(single statement)和复合语句形式(compound statement). 它不能出现在函数体中(编译出错)<BR>extern “C”void exit(int);//single<BR><BR>extern “C”{&nbsp;&nbsp;&nbsp;&nbsp;//compound<BR>&nbsp;&nbsp;&nbsp;&nbsp;int printf( const char* … );<BR>&nbsp;&nbsp;&nbsp;&nbsp;int scanf( const char* … );<BR>}<BR>extern “C”{ #include &lt;cmath&gt; }<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dove 回复日期:2004-01-06 10:47:54
<br>内容:支持!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -