﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-弱水一瓢的博客-文章分类-C++ Primer</title><link>http://www.cppblog.com/Raycruiser/category/6327.html</link><description>    ——C++夜未眠</description><language>zh-cn</language><lastBuildDate>Sat, 23 Aug 2008 09:05:02 GMT</lastBuildDate><pubDate>Sat, 23 Aug 2008 09:05:02 GMT</pubDate><ttl>60</ttl><item><title>C++ Primer 学习笔记一</title><link>http://www.cppblog.com/Raycruiser/articles/44173.html</link><dc:creator>弱水一瓢</dc:creator><author>弱水一瓢</author><pubDate>Tue, 11 Mar 2008 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/Raycruiser/articles/44173.html</guid><wfw:comment>http://www.cppblog.com/Raycruiser/comments/44173.html</wfw:comment><comments>http://www.cppblog.com/Raycruiser/articles/44173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Raycruiser/comments/commentRss/44173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Raycruiser/services/trackbacks/44173.html</trackback:ping><description><![CDATA[A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .基本类型要点：
<p>1.&nbsp; 结构体：c++在处理结构体时，是按照一般的变量进行处理的。结构体可以作为函数参数和返回值。作为函数参数时，也分传值和传引用的区别，而作为返回值时，返回的是结构体的一个拷贝。可以将一个结构赋给另外一个结构。</p>
<p>2.&nbsp; 枚举：&nbsp;&nbsp;&nbsp;枚举量是整型，可以被提升为Int类型，但是int不能自动转换为枚举类型； 还有没有为枚举定义操作符+； 如果Int值是有效的，可以通过强制类型转换，把它赋给枚举变量； 显示设置枚举值时，指定的值必须是整数； 枚举的取值范围为大于最大值得、最小的2的幂-1。例如enum bigstep{one=1,two=2,third=100}; 则bigstep的取值范围为0~127。</p>
<p>3.&nbsp; int *p1,p2;将创建一个指针和一个常规的int变量。</p>
<p>4.&nbsp; c++在创建指针时，计算机将分配用来存储地址的内存，但不会分配用来存储指针所指向的数据的内存。</p>
<p>5.&nbsp; 如果要将数字值作为地址来使用，应通过强制类型转换将数字转换为适当的地址类型。</p>
<p>6.&nbsp; c++中，值为0的指针为空指针。确保空指针不会指向有效的数据。</p>
<p>7.&nbsp; 不要尝试释放已经释放的内存块，但是对空指针使用delete是安全的。所以尽量不要创建2个指向同一个内存块的指针。</p>
<p><font color=#e61a1a>8.&nbsp; 不能使用sizeof操作符来确定动态分配的数组包含的字节数！！！、</font></p>
<p><font color=#000000>9.&nbsp; 数组和指针的区别：1.数组名是指针，可以对指针进行+(-)操作，但是数组名不可以；&nbsp; 2.对数组应用sizeof得到的是数组的长度，而对指针应用得到的是指针的长度。</font></p>
<p><font color=#f70909>10.&nbsp; 如果给cout提供一个指针，它将打印地址。但如果指针的类型为char *,则cout将显示指向的字符串。如果要显示字符串的地址，则必须将这种指针强制转换为另外一种指针类型，如Int *。</font></p>
<p>B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .循环和关系表达式：</p>
<p>1.&nbsp; 递增和递减操作符在同一个值中使用多次时，因为每个编译器很可能对于&#8220;使用后修改&#8221;和&#8220;修改后使用&#8221;的规则可能不同，因此可能导致在不同的编译器下得到不同的结果。</p>
<p>2.&nbsp; c++规定，在使用递增或者递减时，确定一个完整表达式（它是这样一个表达式，不是另一个更大表达式的子表达式），每个完整表达式完了，在下一个开始之前，都要评估一次。例如：while(guest++&lt;10) printf("%d",guest); 其中的guest++&lt;10是一个完整表达式，一次在第一次printf的之前，要评估一次，这样打出来的guest已经加一； 再如，y=(4+x++)+(6+x++);,显然整个句子才是一个完整表达式，<font color=#f73809>c++只保证在执行下一条语句之前，x+2,但是没有规定是在计算每个子表示式之后将x递增还是在整个表达式计算完毕之后才将x的值递增！</font>这个时候跟编译器有关，所以尽量避免使用这样的句子。</p>
<p>3.&nbsp; *和++同时作用于指针时，取决于优先级。前缀指针和*的优先级同，从右到左结合。后缀比*(还有前缀)优先级高。</p>
<p>4.&nbsp; c++为类型建立别名的方式有两种：1.预处理器 #define BYTE char&nbsp; 2.使用typedef&nbsp; typedef char BYTE;&nbsp; 最好使用typedef.</p>
<p>C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .分支语句和逻辑操作符：</p>
<ul>
    <li>switch(integer-expression){} 中的判断表达式必须为一个结果为整数的表达式。因此switch不能处理浮点测试。都是整数时，如果选项超过2个，switch的效率比if else高。 </li>
</ul>
<p>D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .函数</p>
<p>1.&nbsp; 在c++中，void test();与void test(void)是等效的，意味着函数没有参数。argument--实参 parameter--形参</p>
<p>2.&nbsp; 在c++中，当且仅当用于函数参数时，int *arr和int arr[]的含义是相同的，它们都意味着arr是一个int指针。</p>
<p>3.&nbsp; int age=39;&nbsp;&nbsp; const int *p=&amp;age; 后边的声明表示p指向一个const int(这里为39)，因此不能使用pt来修改这个值。即*p=31;这个语句是不合法的。我们能通过修改age=23;来改变age的值，但是这个时候*p仍然为39!!也就是const int *p一旦指定一个值后，*p的内容将不改变，即不能通过*p改变值。</p>
<p>4.&nbsp; 将const的地址赋给常规指针是不可行的。后边再详细讨论下const+指针的情况。</p>
<p>5.&nbsp; 获取函数的地址很简单：只要使用函数名即可，不跟参数。声明函数指针时应该指定函数的返回类型及函数的参数列表。例如一个函数的原型为 double pam(int); 则其对应的函数指针的声明为：double (*pPam)(int); pPam就是函数pam的函数指针。则我们现在可以赋值 pf=pPam; 然后就可以使用这个函数指针来调用函数了。例如：double r=(*pPam)(5);或者double r=pPam(5);</p>
<img src ="http://www.cppblog.com/Raycruiser/aggbug/44173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Raycruiser/" target="_blank">弱水一瓢</a> 2008-03-11 13:52 <a href="http://www.cppblog.com/Raycruiser/articles/44173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Primer 学习笔记二</title><link>http://www.cppblog.com/Raycruiser/articles/44171.html</link><dc:creator>弱水一瓢</dc:creator><author>弱水一瓢</author><pubDate>Tue, 11 Mar 2008 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/Raycruiser/articles/44171.html</guid><wfw:comment>http://www.cppblog.com/Raycruiser/comments/44171.html</wfw:comment><comments>http://www.cppblog.com/Raycruiser/articles/44171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Raycruiser/comments/commentRss/44171.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Raycruiser/services/trackbacks/44171.html</trackback:ping><description><![CDATA[<p>A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .函数探幽：</p>
<p>1.&nbsp; 要使用内联函数需要做：a. 在函数声明之前加上关键字inline；&nbsp; b.在函数定义前面加上关键字inline; 内联函数的原始实现是宏！</p>
<p><font color=#ff0000>2.&nbsp; 声明引用时必须进行初始化！ </font><font color=#000000>(const指针也是在创建时进行初始化)</font></p>
<p>3.&nbsp; 如何给参数设置默认值？<font color=#1111ee>必须</font>通过函数原型。因为编译器是通过查看原型来了解函数所使用的参数数目，因此函数原型也必须将可能的默认参数告知程序。<u>必须从右向左添加默认值。 </u></p>
<p>4.&nbsp; 函数在重载时，编译器在检查函数特征标(参数类型)时，将把类型引用和类型本身视为同一个特征标。匹配函数时，不区分const和非const变量。</p>
<p>B .&nbsp;&nbsp;&nbsp; 内存模型和名称空间：</p>
<p>1.&nbsp; 不要将函数定义或变量声明放到头文件中。为了避免在不知情的情况下将同一头文件包含多次，可以使用预处理器编译指令#ifndef,代码为：#ifndef COORDIN_H_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define COORDIN_H_&nbsp;&nbsp; ... #endif</p>
<p>2.&nbsp; 在c++中，可以使用register来声明局部变量，作用域为局部，没有链接性。因为存储在寄存器中，没有内存地址，因此不能使用地址操作符。register int x; </p>
<p>3.&nbsp; 静态存储持续性变量(在整个程序执行期间存在)有3种链接性：外部链接性、内部链接性和无链接性。下面给出代码：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int global=1000;&nbsp; //静态持续变量，外链接，在代码块的外面声明<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static int one_file=50;&nbsp;&nbsp; //静态持续变量，内联接，代码快外面声明，并使用static限定符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int main()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {...}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void func1(int n)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static int count=0;&nbsp;&nbsp; //静态持续变量，没有链接性，只能在func1种使用。在代码块内声明，使用static限定符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有的静态持续变量都有两个初始化特征：a.未被初始化的静态变量的所有位都被设为0；b.只能用常量表达式来初始化静态变量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于外部链接性变量，有且仅有一个文件中包含了该变量的外部定义，其他文件要使用该变量，必须在<font color=#f73809>引用声明中使用extern.</font></p>
<p>4.&nbsp; c++不允许在一个函数中定义另外一个函数，因此所有函数的存储持续性都自动为静态的，即在整个程序执行期间都一致存在。默认情况下，函数的链接性为外部的。可以用static将函数的链接性设置为内部的。</p>
<p>5.&nbsp; &nbsp;在c++中，同一个名称可能对应多个函数，在编译期间，必须为这些函数提供不同的符号名称。例如可以将spiff(int)转换为_spiff_i,而将spiff(double,double);转换为_spiff_d_d，这称为c++语言链接。而extern "c" void spiff(int); 表示以c的语言链接性来查找函数。</p>
<p>6.&nbsp; using声明：假如存在一个名称空间 namespace Jill{double bucket(double n){...}&nbsp;&nbsp; double fetch;} 则using Jill::fetch；就是一个using声明。using声明在函数内时，则声明的变量是局部的，如果声明在函数外，则声明的变量是全局的。</p>
<p>7.&nbsp; using声明使得一个名称可用，而using编译指令使得所有的名称都可用。 using namespace Jill; 不要在头文件中使用using编译指令</p>
<p>C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .对象和类：</p>
<p>1.&nbsp; 不用在类中使用private,这是类对象的默认访问控制。类和结构的唯一区别在于，结构的默认访问类型是public的。</p>
<p>2.&nbsp; cout和cerr的区别：cout对应于标准输出流，cerr对应于标准错误流； cout可以重定向，cerr不可以；cout要分配缓冲，因此cerr比cout快；它们的 标准默认输出设备都是屏幕。</p>
<p>3.&nbsp; 类的每个对象都有自己的存储空间，用于存储其内部变量；但同一个类的所有对象共享同一组类方法，即每种方法只有一个副本。</p>
<p>4.&nbsp; 默认构造函数是在未提供显式的初始化值时，被用来创建对象的构造函数。例如：Stock stock1; 当且仅当没有定义<font color=#ff3300>任何</font>构造函数时，编译器才会提供默认构造函数。为雷定义了构造函数后，程序员就<font color=#ff0000>必须</font>为它提供默认构造函数。否则Stock stock1;这样的声明将出错。</p>
<p>5.&nbsp; const成员函数：void show()const; 其对应的定义为void Stock::show()const; 表明在这个类方法中不会修改调用对象。</p>
<p>6.&nbsp; 使类中的某个变量为<font color=#3dee11>整个类</font><font color=#000000>都可用。a.可以在类中声明一个枚举。在类中声明的枚举的作用域为整个类，例如： class Stock{ private:&nbsp;&nbsp;&nbsp; enum{Len=30};};&nbsp;&nbsp; 所有的对象都不包含枚举！！！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.使用static： class Stack{ private:&nbsp; static const int Len=30;}; 这将创建一个Len常量，该常量不存储在对象中，而与其他的静态变量存储在一起！！</font></p>
<img src ="http://www.cppblog.com/Raycruiser/aggbug/44171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Raycruiser/" target="_blank">弱水一瓢</a> 2008-03-11 13:49 <a href="http://www.cppblog.com/Raycruiser/articles/44171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Primer 学习笔记三</title><link>http://www.cppblog.com/Raycruiser/articles/44172.html</link><dc:creator>弱水一瓢</dc:creator><author>弱水一瓢</author><pubDate>Tue, 11 Mar 2008 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/Raycruiser/articles/44172.html</guid><wfw:comment>http://www.cppblog.com/Raycruiser/comments/44172.html</wfw:comment><comments>http://www.cppblog.com/Raycruiser/articles/44172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Raycruiser/comments/commentRss/44172.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Raycruiser/services/trackbacks/44172.html</trackback:ping><description><![CDATA[<p>A.&nbsp;&nbsp;&nbsp; &nbsp;使用类：</p>
<p>1.&nbsp;&nbsp;重载操作符的格式为：operator op(argument-list) 其中，op是将要重载的操作符，它必须是有效的c++操作符。比如operator[]() 函数重载[]数组索引操作符。</p>
<p>2.&nbsp; c++对用户定义的操作符重载的限制：a.重载后的操作符必须至少有一个操作数是用户定义的类型。&nbsp; b.使用操作符时不能违反操作符原来的句法规则。 c.不能定义新的操作符。 d.不能重载的操作符：sizeof、.、::、?:、typeid、const_cast、dynamic_cast、reinterpret_cast、static_cast. 下面的操作符只能通过成员函数进行重载：=、()、[]、-&gt;</p>
<p><font color=#ff0000>3.&nbsp; 不要返回指向局部变量或临时对象的引用！</font>因为函数执行完毕后，局部变量和临时变量将消失，引用将指向不存在的数据。</p>
<p>B.&nbsp;&nbsp;&nbsp;&nbsp; 类和动态内存分配：</p>
<p>1.&nbsp; 静态类成员：无论创建了多少对象，程序都只创建一个静态类变量副本。也就是说，类的所有对象共享同一个静态成员。<font color=#ff0000>不能在类声明中初始化静态成员变量，</font>这是因为声明描述了如何分配内存，并不分配内存。例外是，静态数据成员为整型或者枚举型const。</p>
<p>2.&nbsp; StringBad sailor=sports; //用已知类对一个声明类赋值，其实质是调用了复制构造函数StringBad(const StringBad&amp;);</p>
<p>3.&nbsp; c++自动提供的成员函数：a.默认构造函数，如果没有定义构造函数。&nbsp; b.复制构造函数，如果没有定义。c.赋值操作符 Class_name&amp; operator=(const Class_name&amp;);&nbsp;&nbsp;d.默认析构函数； e.地址操作符。Empty* operator&amp;();&nbsp; </p>
<p>4.&nbsp; 当函数传值传递对象或函数返回对象时，使用复制构造函数。<font color=#ff3300>隐式地复制构造函数是按值进行复制的，所以当类成员中有数组时，就会出现错误</font>，因为不是复制的数组，而是复制的数组指针。析构的时候就会出错，会delete2次同一指针。</p>
<p>5.&nbsp; 将一个已有的对象赋给另外一个对象时，将使用重载的赋值操作符，初始化时，不一定会使用赋值操作符，因为可能调用复制构造函数。<font color=#ff0000>它的隐式实现也是对成员进行逐个复制！</font><font color=#000000>重新定义时，避免将对象赋给自身。</font></p>
<p>6.&nbsp; 静态类成员函数：不能通过对象调用静态成员函数，是public时，可以通过类名和作用域解析操作符进行调用； <font color=#ff3300>静态成员函数由于不与特定的对象关联，只能使用静态数据成员。</font></p>
<p><font color=#000000>7.&nbsp; 如果方法或函数要返回局部对象，则应返回对象，而不是指向对象的引用。在这种情况下，将使用复制构造函数来生成返回的对象。如果方法或函数要返回一个没有公有复制构造函数的类(如ostream)的对象，它必须返回一个指向这种对象的引用！！</font></p>
<p>8.&nbsp; delete可与常规new操作符配合使用，但是不能与布局new操作符配合使用。</p>
<img src ="http://www.cppblog.com/Raycruiser/aggbug/44172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Raycruiser/" target="_blank">弱水一瓢</a> 2008-03-11 13:49 <a href="http://www.cppblog.com/Raycruiser/articles/44172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>