<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[C++学习重点分析 ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 07 Mar 2008 06:09:10 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	C++学习重点分析 <br/><br/>一、#include “filename.h”和#include 的区别<br/><br/>#include “filename.h”是指编译器将从当前工作目录上开始查找此文件<br/><br/>#include 是指编译器将从标准库目录中开始查找此文件<br/><br/> <br/><br/>二、头文件的作用<br/><br/>加强安全检测<br/><br/>通过头文件可能方便地调用库功能，而不必关心其实现方式<br/><br/> <br/><br/>三、* , &amp;修饰符的位置<br/><br/>对于*和&amp;修饰符，为了避免误解，最好将修饰符紧靠变量名<br/><br/> <br/><br/>四、if语句<br/><br/>不要将布尔变量与任何值进行比较，那会很容易出错的。<br/><br/>整形变量必须要有类型相同的值进行比较<br/><br/>浮点变量最好少比点，就算要比也要有值进行限制<br/><br/>指针变量要和NULL进行比较，不要和布尔型和整形比较<br/><br/> <br/><br/>五、const和#define的比较<br/><br/>const有数据类型，#define没有数据类型<br/><br/>个别编译器中const可以进行调试，#define不可以进行调试<br/><br/>在类中定义常量有两种方式<br/><br/>1、 在类在声明常量，但不赋值，在构造函数初始化表中进行赋值；<br/><br/>2、 用枚举代替const常量。<br/><br/> <br/><br/>六、C++函数中值的传递方式<br/><br/>有三种方式：值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)<br/><br/>void fun(char c) //pass by value<br/><br/>void fun(char *str) //pass by pointer<br/><br/>void fun(char &amp;str) //pass by reference<br/><br/>如果输入参数是以值传递的话，最好使用引用传递代替，因为引用传递省去了临时对象的构造和析构<br/><br/>函数的类型不能省略，就算没有也要加个void<br/><br/> <br/><br/>七、函数体中的指针或引用常量不能被返回<br/><br/>Char *func(void)<br/><br/>{<br/><br/>char str[]=”Hello Word”;<br/><br/>//这个是不能被返回的，因为str是个指定变量，不是一般的值，函数结束后会被注销掉<br/><br/>return str; <br/><br/>}<br/><br/>函数体内的指针变量并不会随着函数的消亡而自动释放<br/><br/> <br/><br/>八、一个内存拷贝函数的实现体<br/><br/>void *memcpy(void *pvTo,const void *pvFrom,size_t size)<br/><br/>{<br/><br/>assert((pvTo!=NULL)&amp;&amp;(pvFrom!=NULL));<br/><br/>byte *pbTo=(byte*)pvTo; //防止地址被改变<br/><br/>byte *pbFrom=(byte*)pvFrom;<br/><br/>while (size-- &gt;0)<br/><br/>pbTo++ = pbForm++;<br/><br/>return pvTo;<br/><br/>} <br/><br/> <br/><br/>九、内存的分配方式<br/><br/>分配方式有三种，请记住，说不定那天去面试的时候就会有人问你这问题<br/><br/>1、 静态存储区，是在程序编译时就已经分配好的，在整个运行期间都存在，如全局变量、常量。<br/><br/>2、 栈上分配，函数内的局部变量就是从这分配的，但分配的内存容易有限。<br/><br/>3、 堆上分配，也称动态分配，如我们用new,malloc分配内存，用delete,free来释放的内存。<br/><br/> <br/><br/>十、内存分配的注意事项<br/><br/>用new或malloc分配内存时，必须要对此指针赋初值。<br/><br/>用delete 或free释放内存后，必须要将指针指向NULL<br/><br/>不能修改指向常量的指针数据<br/><br/> <br/><br/>十一、内容复制与比较<br/><br/>//数组……<br/><br/>char a[]=”Hello Word!”;<br/><br/>char b[10];<br/><br/>strcpy(b,a);<br/><br/>if (strcmp(a,b)==0)<br/><br/>{}<br/><br/>//指针……<br/><br/>char a[]=”Hello Word!”;<br/><br/>char *p;<br/><br/>p=new char[strlen(a)+1];<br/><br/>strcpy(p,a);<br/><br/>if (strcmp(p,a)==0)<br/><br/>{}<br/><br/> <br/><br/>十二、sizeof的问题<br/><br/>记住一点，C++无法知道指针所指对象的大小，指针的大小永远为4字节<br/><br/>char a[]=”Hello World!”<br/><br/>char *p=a;<br/><br/>count&lt;<br/>count&lt;<br/>而且，在函数中，数组参数退化为指针，所以下面的内容永远输出为4<br/><br/>void fun(char a[1000])<br/><br/>{<br/><br/>count&lt;<br/>}<br/><br/> <br/><br/>十三、关于指针<br/><br/>1、 指针创建时必须被初始化<br/><br/>2、 指针在free 或delete后必须置为NULL<br/><br/>3、 指针的长度都为4字节<br/><br/>４、释放内存时，如果是数组指针，必须要释放掉所有的内存，如<br/><br/>char *p=new char[100];<br/><br/>strcpy(p,”Hello World”);<br/><br/>delete []p; //注意前面的［］号<br/><br/>p=NULL;<br/><br/>５、数组指针的内容不能超过数组指针的最大容易。<br/><br/>如:<br/><br/>char *p=new char[5];<br/><br/>strcpy(p,”Hello World”); //报错 目标容易不够大<br/><br/>delete []p; //注意前面的［］号<br/><br/>p=NULL;<br/><br/> <br/><br/>十四、关于malloc/free 和new /delete<br/><br/>l malloc/free 是C/C+的内存分配符，new /delete是C++的内存分配符。<br/><br/>l 注意：malloc/free是库函数，new/delete是运算符<br/><br/>l malloc/free不能执行构造函数与析构函数，而new/delete可以<br/><br/>l new/delete不能在C上运行，所以malloc/free不能被淘汰<br/><br/>l 两者都必须要成对使用<br/><br/>l C++中可以使用_set_new_hander函数来定义内存分配异常的处理<br/><br/> <br/><br/>十五、Ｃ++的特性<br/><br/>Ｃ++新增加有重载(overload)，内联（inline），Const，Virtual四种机制<br/><br/>重载和内联：即可用于全局函数，也可用于类的成员函数；<br/><br/>Const和Virtual：只可用于类的成员函数；<br/><br/>重载：在同一类中，函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数，必须用全局引用符号::引用。<br/><br/>覆盖是指派生类函数覆盖基类函数<br/><br/>函数名相同；<br/><br/>参数相同；<br/><br/>基类函数必须有Virtual关键字；<br/><br/>不同的范围(派生类和基类)。<br/><br/>隐藏是指派生类屏蔽了基类的同名函数相同<br/><br/>1、 函数名相同，但参数不同，此时不论基类有无Virtual关键字，基类函数将被隐藏。<br/><br/>2、 函数名相同，参数也相同，但基类无Virtual关键字(有就是覆盖)，基类函数将被隐藏。<br/><br/>内联：inline关键字必须与定义体放在一起，而不是单单放在声明中。<br/><br/>Const：const是constant的缩写，“恒定不变”的意思。被const修饰的东西都受到强制保护，可以预防意外的变动，能提高程序的健壮性。<br/><br/>1、 参数做输入用的指针型参数，加上const可防止被意外改动。<br/><br/>2、 按值引用的用户类型做输入参数时，最好将按值传递的改为引用传递，并加上const关键字，目的是为了提高效率。数据类型为内部类型的就没必要做这件事情；如：<br/><br/>将void Func(A a) 改为void Func(const A &amp;a)。<br/><br/>而void func(int a)就没必要改成void func(const int &amp;a);<br/><br/>3、 给返回值为指针类型的函数加上const，会使函数返回值不能被修改，赋给的变量也只能是const型变量。如：函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。<br/><br/>4、 Const成员函数是指此函数体内只能调用Const成员变量，提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。<br/><br/>Virtual：虚函数：派生类可以覆盖掉的函数，纯虚函数：只是个空函数，没有函数实现体；<br/><br/> <br/><br/>十六、extern“C”有什么作用？<br/><br/>Extern “C”是由Ｃ＋＋提供的一个连接交换指定符号，用于告诉Ｃ＋＋这段代码是Ｃ函数。这是因为C++编译后库中函数名会变得很长，与C生成的不一致，造成Ｃ＋＋不能直接调用C函数，加上extren “c”后，C++就能直接调用C函数了。<br/><br/>Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。<br/><br/> <br/><br/>十七、构造函数与析构函数<br/><br/>派生类的构造函数应在初始化表里调用基类的构造函数；<br/><br/>派生类和基类的析构函数应加Virtual关键字。<br/><br/>不要小看构造函数和析构函数，其实编起来还是不容易。<br/><br/>#include <br/><br/>class Base<br/><br/>{<br/><br/>public: <br/><br/>virtual ~Base() { cout&lt;&lt; &quot;~Base&quot; &lt;&lt; endl ; }<br/><br/>};<br/><br/>class Derived : public Base<br/><br/>{<br/><br/>public: <br/><br/>virtual ~Derived() { cout&lt;&lt; &quot;~Derived&quot; &lt;&lt; endl ; }<br/><br/>};<br/><br/>void main(void)<br/><br/>{<br/><br/>Base * pB = new Derived; // upcast<br/><br/>delete pB;<br/><br/>}<br/><br/>输出结果为：<br/><br/>~Derived<br/><br/>~Base<br/><br/>如果析构函数不为虚，那么输出结果为<br/><br/>~Base<br/><br/> <br/><br/>十八、#IFNDEF/#DEFINE/#ENDIF有什么作用<br/><br/>仿止该头文件被重复引用<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] C++学习重点分析 ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>