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

📄 subject_66290.htm

📁 vc
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<p>
序号:66290 发表者:ljl 发表日期:2003-12-23 15:58:42
<br>主题:我的《C++ Primer》学习小记
<br>内容:注:只是个人的一点纪录,如果对你有一点点帮助,偶就很知足了。写的不对请指出,不要扔蔬菜和肉蛋之类的好东西奥:))<BR><BR>第一章&nbsp;&nbsp;&nbsp;&nbsp;开始<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;#include指示符读入指定文件的内容,它有两种格式<BR>#include &lt;some_file.h&gt; :表明该文件是一个工程或标准头文件,查找过程会检查预定义的目录<BR>#include “my_file.h”:表明该文件是用户提供的头文件,查找该文件将从当前文件目录开始。<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;为了防止头文件被多次包含在一个源文件中,可用条件指示符防止,如:<BR>#ifndef BOOKSTORE_H<BR>#define BOOKSTORE_H<BR>/* Bookstore.h的内容 */<BR>#endif<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;编译c++程序时,编译器自动定义一个预处理名字__cplusplus(注意两个下划线),可以根据它来判断该程序是否c++程序;在编译标准c时,编译器将自动定义名字__STDC__,二者不会同时被定义。另外两个比较有用的预定义名字是:__LINE__和__FILE__。前者记录文件已经被编译的行数,后者包含正在被编译的文件的名字,如<BR>if( element_count == 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cerr &lt;&lt; &#34;Error: &#34; &lt;&lt; __FILE__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt; &#34; : line &#34; &lt;&lt; __LINE__<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt; &#34; element_count must be non-zero.\n&#34;;<BR>__TIME__:当前被编译文件的编译时间<BR>__DATE__:当前被编译文件的编译日期<BR><BR>注:项2、3请参见程序ifdef_page10.cpp<BR><BR>4.&nbsp;&nbsp;&nbsp;&nbsp;assert( )是C语言标准库中提供的一个通用预处理宏。C à #include &lt;assert.h&gt;,CPP à #include &lt;cassert&gt;<BR>5.&nbsp;&nbsp;&nbsp;&nbsp;关于注释:/* */不能嵌套,非要嵌套须在/和*之间加空格,单行或半行用//进行注释较好<BR>6.&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>第二章&nbsp;&nbsp;&nbsp;&nbsp;C++浏览<BR><BR>1.&nbsp;&nbsp;&nbsp;&nbsp;在内置数据类型(如int、float、double等)与标准库类的类型之间是复合类型,特别是指针和数组类型。数组是一种顺序容器,包含单一类型的元素。<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;静态分配:编译器在处理程序源代码时分配,静态对象是有名字的变量,直接对其进行操作,分配和释放由编译器自动处理 --- 效率高但缺少灵活性<BR>动态分配:程序执行时调用运行时刻库函数来分配,是没有名字的变量,须通过指针间接地对她进行操作,由new和delete进行分配和释放。如<BR>int *pint = new int( 1024 );&nbsp;&nbsp; ------&nbsp;&nbsp;delete pint;<BR>int *pia = new int[ 4 ];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------&nbsp;&nbsp;delete [] pia;<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;基类和派生类的设计原则:<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;如果希望阻止派生类直接访问某个成员,就把该成员声明为基类的private成员;如果确信某个成员希望被派生类直接访问,则声明为protected.<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;找出类型相关的成员函数,并把这些成员函数标记为virtual(虚拟的) --- 基类里面只声明,具体的定义根据不同的派生类而不同。对于一个非虚拟函数的调用,编译器在编译时刻选择被调用的函数。而虚拟函数调用的决定则要等到运行时刻。在执行程序内部的每个调用点上,系统根据被调用对象的实际基类或派生类的类型来决定选择哪一个虚拟函数实例。<BR>4.&nbsp;&nbsp;&nbsp;&nbsp;不是所有的成员函数都能自动地随类模板的实例化而被实例化,只有真正被程序使用到的成员函数才会被实例化,这一般发生在程序生成过程中的一个独立阶段。<BR>5.&nbsp;&nbsp;&nbsp;&nbsp;void min(double); 以传值的方式传递内建类型是一种常见而可接受的做法<BR>void min(const elemType &amp;); 传递对象应避免,应选择引用或者指针,假如void min(elemType),编译器会调用一个copy constructor以求为该对象制造一份副本,然后才将该副本以传值方式传送。<BR>6.&nbsp;&nbsp;&nbsp;&nbsp;基于异常的设计:<BR>主要构成:<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;程序中异常出现的点:一旦识别出异常,就导致抛出raise/throw异常,正常的程序就被挂起,直到异常被处理完毕。如:<BR>if( !infile )<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;string errMsg(“unable to open file: “);<BR>&nbsp;&nbsp;&nbsp;&nbsp;errMsg += filename;<BR>&nbsp;&nbsp;&nbsp;&nbsp;throw errMsg;<BR>}<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;程序中异常被处理的点.典型地,程序异常的抛出与处理位于独立的函数或成员函数调用中.<BR>7.&nbsp;&nbsp;&nbsp;&nbsp;assert只在程序的debug版时才有效,当表达式为假时,就会弹出一个assertion failed的对话框,提示出错。在release 中assert被完全忽略了,就象不存在一样,assert只是一种调试手段。<BR>8.&nbsp;&nbsp;&nbsp;&nbsp;名字空间机制允许我们封装名字,否则就有可能污染(影响)全局名字空间.<BR>名字空间别名允许用一个可替代的,短的或更一般的名字与一个现有的名字空间关联:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;namespace LIB = IBM_Canada_Laboratory;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;namespace DFA = Disney_Feature_Animation;<BR>9.&nbsp;&nbsp;&nbsp;&nbsp;为了防止c++库的组件污染用户程序的全局名字空间,所有标准C++库的组件都声明在一个被称为std的名字空间内。所以即使我们在程序文本中包含了c++库文件,头文件中声明的组件在我们的头文件中也不是自动可见的。<BR>10.&nbsp;&nbsp;&nbsp;&nbsp;标准数组---向量:vector,如vector&lt;int&gt; ivec( 10 ); <BR>1)&nbsp;&nbsp;&nbsp;&nbsp;vector类模板支持“向现有的数组元素赋值”的概念以及“插入附加元素”的概念------可以在运行时刻动态增长;<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;vector只提供了一个最小集:如等于、小于操作符、size()、empty()等操作。而一些通用的操作如sort()、min()、max()、find()等等则作为独立的泛型算法被提供。<BR>3)&nbsp;&nbsp;&nbsp;&nbsp;可以使用迭代器对(iterator pair)来标记向量的起始和结束处。迭代器是一个支持指针类型抽象的类对象。begin()和end()<BR>4)&nbsp;&nbsp;&nbsp;&nbsp;可以应用到向量上的操作惊人地多,但是他们并不是作为vector类模板的成员函数来提供的,他们是以一个独立的泛型算法集的形式,有标准库提供。如:(#include &lt;algorithm&gt;)<BR>a)&nbsp;&nbsp;&nbsp;&nbsp;搜索算法: find()、find_if()、search()、binary_search()、count()、count_if().<BR>b)&nbsp;&nbsp;&nbsp;&nbsp;分类排序与通用排序算法:sort()、partial_sort()、merge()、partition()、rotate()、reverse()、random_shuffle().<BR>c)&nbsp;&nbsp;&nbsp;&nbsp;删除算法:unique()和remove()<BR>d)&nbsp;&nbsp;&nbsp;&nbsp;算术算法:accumulate()、partial_sum()、inner_product()和adjacent_difference().<BR>e)&nbsp;&nbsp;&nbsp;&nbsp;生成和变异算法:generate()、fill()、transformation()、copy()和for_each()<BR>f)&nbsp;&nbsp;&nbsp;&nbsp;关系算法: equal()、min() 和max()<BR>5)&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;int&gt; ivec(10,-1); 表示定义了包含10个int元素,每个元素都被初始化为-1;vector&lt;int&gt; ivec(&amp;ia[2], &amp;ia[5]); 表示用ia[2]、ia[3]、ia[4]来拷贝<BR>6)&nbsp;&nbsp;&nbsp;&nbsp;STL中用法完全不同:首先定义一个空vector:&nbsp;&nbsp;vector&lt;int&gt; text; 赋值的操作不再是索引元素,而是用push_back()在vector后面插入一个元素。访问则用<BR>cout &lt;&lt; “words read are: \n”;<BR><BR>for( vector&lt;string&gt;::iterator it = text.begin();<BR>&nbsp;&nbsp;&nbsp;&nbsp;it !=text.end(); ++it )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; *it &lt;&lt; ‘ ‘;<BR>cout &lt;&lt; endl;<BR><BR>注意:不能混用这两种用法:如 vector&lt;int&gt; ivec;&nbsp;&nbsp;ivec[0] = 1024;是错误的,因为ivec还没有第一个元素,我们只能索引vector中已经存在的元素。<BR>7)&nbsp;&nbsp;&nbsp;&nbsp;对于const 向量的迭代子应该这样定义:vector&lt;int&gt; ::const_iterator it = ivec.begin();<BR>8)&nbsp;&nbsp;&nbsp;&nbsp;<BR>11.&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>第三章&nbsp;&nbsp;&nbsp;&nbsp;C++数据类型<BR>1.&nbsp;&nbsp;&nbsp;&nbsp;文字常量:是不可寻址的,尽管也存在机器内存一个地方。20(十进制)--- 024(八进制)---0x14(十六进制)。<BR>a)&nbsp;&nbsp;&nbsp;&nbsp;字符型char:可以用一个机器字节来表示<BR>b)&nbsp;&nbsp;&nbsp;&nbsp;整型int、短整型short、长整型long:典型情况下,short半个字,int一个机器字,long为一个或两个机器字(32位机器中,int和long通常长度相同)<BR>c)&nbsp;&nbsp;&nbsp;&nbsp;float、double和long double,分别为一个字、两个字,三个或四个字。<BR>d)&nbsp;&nbsp;&nbsp;&nbsp;避免将long写成 2l,最好用大写2L<BR>e)&nbsp;&nbsp;&nbsp;&nbsp;aaa<BR>f)&nbsp;&nbsp;&nbsp;&nbsp;一些常用字符<BR>l&nbsp;&nbsp;&nbsp;&nbsp;newline(换行符)&nbsp;&nbsp;\n<BR>l&nbsp;&nbsp;&nbsp;&nbsp;horizontal tab(水平制表符)&nbsp;&nbsp;&nbsp;&nbsp;\t <BR>l&nbsp;&nbsp;&nbsp;&nbsp;vertical tab(垂直制表符)<BR>l&nbsp;&nbsp;&nbsp;&nbsp;backspace(退格键)&nbsp;&nbsp;&nbsp;&nbsp;\b<BR>l&nbsp;&nbsp;&nbsp;&nbsp;carriage return(回车键)&nbsp;&nbsp;&nbsp;&nbsp;\r<BR>l&nbsp;&nbsp;&nbsp;&nbsp;formfeed(进纸键)&nbsp;&nbsp;&nbsp;&nbsp;\f<BR>l&nbsp;&nbsp;&nbsp;&nbsp;alert(beel)(响铃键)&nbsp;&nbsp;&nbsp;&nbsp;\a<BR>l&nbsp;&nbsp;&nbsp;&nbsp;backslash(反斜杠键)&nbsp;&nbsp;&nbsp;&nbsp;\\<BR>l&nbsp;&nbsp;&nbsp;&nbsp;question mark(问号)&nbsp;&nbsp;&nbsp;&nbsp;\?<BR>l&nbsp;&nbsp;&nbsp;&nbsp;single quote(单引号)&nbsp;&nbsp;&nbsp;&nbsp;\’<BR>l&nbsp;&nbsp;&nbsp;&nbsp;double quote(双引号)&nbsp;&nbsp;&nbsp;&nbsp;\”<BR>g)&nbsp;&nbsp;&nbsp;&nbsp;<BR>2.&nbsp;&nbsp;&nbsp;&nbsp;变量:是可寻址的,对于每一个变量,都有两个值与其相关联:1)数据值:存储在某个地址中,也被称为右值(rvalue--- are-value),文字和常量都可被用作右值;2)地址值:即存储数据值的那块内存的地址,也叫变量的左值(lvalue---ell-vlaue).<BR>全局变量被初始化为0,局部变量或new则不提供,值是未定义的。<BR>3.&nbsp;&nbsp;&nbsp;&nbsp;不同数据类型的指针之间的区别不是在指针的表示上,也不再指针所特有的值(地址)上,而在于指针所指向的对象的类型上,指针的类型可以知是编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。<BR>4.&nbsp;&nbsp;&nbsp;&nbsp;当指针持有0值时,表明它没有指向任何对象,或持有一个桶类型的数据对象的地址。<BR>5.&nbsp;&nbsp;&nbsp;&nbsp;C++提供了一种特殊的指针类型来支持“仅仅是持有地址值(可能是把一个地址同另一个地址作比较)”:空(void*)类型指针,它可以被任何数据指针类型的地址值赋值(函数指针不能赋值给它)。如:&nbsp;&nbsp;&nbsp;&nbsp;int *pi = 0; double dval; double *pd = &amp;dval; <BR>void *pv = pi; pv = pd;<BR><BR>6.&nbsp;&nbsp;&nbsp;&nbsp;字符串类型:2种<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;C风格的字符串:通过char*类型的指针来操纵它。标准c库提供了一组函数:<BR>#include &lt;cstring&gt; <BR>int strlen( const char* );<BR>int strcmp( const char*, const char* );<BR>char* strcpy( char*, const char* );<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;字符串类型string,它包含一系列函数,如:<BR>size(), empty(), c_str(), <BR>3)&nbsp;&nbsp;&nbsp;&nbsp;<BR>7.&nbsp;&nbsp;&nbsp;&nbsp;const限定修饰符 <BR>8.&nbsp;&nbsp;&nbsp;&nbsp;引用<BR>9.&nbsp;&nbsp;&nbsp;&nbsp;枚举类型:不能使用枚举成员进行迭代<BR>10.&nbsp;&nbsp;&nbsp;&nbsp;复数类型 #include &lt;complex&gt;,复数对象有float、double或long double几种表示。<BR>11.&nbsp;&nbsp;&nbsp;&nbsp;typedef名字提供了一种助记符<BR>若:typedef char* cstring;<BR>那么extern const csting cstr;中cstr的类型是什么?<BR>指向const字符的指针???错!!!!!!<BR>正确:Const修饰cstr的类型,cstr是一个指针,cstr是一个指向字符的const指针!!!<BR>12.&nbsp;&nbsp;&nbsp;&nbsp;volatile限定修饰符:提示编译器,该对象的值可能在编译器未监测到的情况下被改变。<BR>13.&nbsp;&nbsp;&nbsp;&nbsp;pair类型:使得我们可以在单个对象内部八项同类型或不同类型的两个值关联起来。<BR>1)&nbsp;&nbsp;&nbsp;&nbsp;头文件:#include &lt;utility&gt; <BR>pair&lt; string, string &gt; author(“James”, “Joycer”);<BR>2)&nbsp;&nbsp;&nbsp;&nbsp;可以用成员访问符号访问pair中的单个元素,他们的名字为first和second,如:<BR>string firstBook;<BR>if(author.first ==”James” &amp;&amp; author.second == “Joycer”)<BR>&nbsp;&nbsp;&nbsp;&nbsp;firstBook = “Stephen Hero”;<BR><BR>3)&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:dove 回复日期:2003-12-23 21:06:27
<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>
回复者:kobo 回复日期:2003-12-24 12:03:20
<br>内容:帮助大大的有,感谢非常!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>

⌨️ 快捷键说明

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