社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3009阅读
  • 1回复

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 =/_tQR~  
6KT]3*B   
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 H\W/;Nn  
4@|"1D3  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 0A$x'pU)  
{{'GR"D  
aE]/w1a  
二、头文件的作用 T_T@0`7  
+OGa}9j-  
加强安全检测 E RnuM  
3 *0/<1f1!  
通过头文件可能方便地调用库功能,而不必关心其实现方式 >\J({/ #O  
mBb;:-5  
fC1PPgQ\  
三、* , &修饰符的位置 UvR F\x%  
S(bYN[U  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ^o;f~6#17  
1^F !X=  
 ]I pLF#  
四、if语句 AHg:`Wjv-  
="yN4+0-p  
不要将布尔变量与任何值进行比较,那会很容易出错的。 ?<_yW#x6  
"Q{)H8,E)x  
整形变量必须要有类型相同的值进行比较 (+M]C]  
d#Hl3]wT  
浮点变量最好少比点,就算要比也要有值进行限制 .\/jy]Y  
):LgZ4h  
指针变量要和NULL进行比较,不要和布尔型和整形比较 ! };OL Q  
fMGL1VN  
-o\o{?t,  
五、const和#define的比较 rt5FecX\  
*<.{sx^Gk  
const有数据类型,#define没有数据类型 }(*eRF'  
q\0CS>.  
个别编译器中const可以进行调试,#define不可以进行调试 uv&??F]/  
k/U1 :9  
在类中定义常量有两种方式 R&lJ& SgC  
LIm{Y`XU  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; ?p&CR[  
U- b(  
2、 用枚举代替const常量。 ef !@|2  
r4X0. mPY*  
^`BiA'gPPC  
六、C++函数中值的传递方式 ^( w%m#  
>#9 f{  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) MKl`9 Y3Ge  
B^;G3+}  
void fun(char c) //pass by value //x^[fkNq)  
iZ^tLnc  
void fun(char *str) //pass by pointer ~2HlAU))<&  
O)2==_f\  
void fun(char &str) //pass by reference 7? 1[sPM  
1" k_l.\,0  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 =sp5.-r  
a/@F?\A  
函数的类型不能省略,就算没有也要加个void `f|Gw5R  
E~4d6~s  
FV 0x/)<z  
七、函数体中的指针或引用常量不能被返回 y}\d]*5  
%>)HAx `  
Char *func(void) 7I#<w[l>k  
d ynq)lf  
{ ryC7O'j_P  
Ba8 s  
char str[]=”Hello Word”; 5 R*  
I`% ]1{  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 /s/\5-U7q  
D  ,U#z  
return str; =ws iC'  
cZb5h 9  
} t7P[^f15[  
[iO*t, 3@h  
函数体内的指针变量并不会随着函数的消亡而自动释放 N I*x):bx  
7NFRCCXHQ  
?q*,,+'0  
八、一个内存拷贝函数的实现体 :j<ij]rsI  
_aaQ1A`p  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 2F z;TNS  
0#/NZO  
{ Gg,&~ jHib  
?=FRn pU?  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); (O(X k+L  
ozCH1V{p  
byte *pbTo=(byte*)pvTo; //防止地址被改变 H\PY\O&cP  
xY=%+o.?*  
byte *pbFrom=(byte*)pvFrom; 9kO}054  
#~JR_oQE!  
while (size-- >0) fZ6-ap,u  
lQ{o[axT  
pbTo++ = pbForm++; yGs:3KI  
Qt~QJJN?oF  
return pvTo; JYesk  
iD(+\:E  
} Z /*X)mBuB  
b\.l!vn0  
d%(4s~y  
九、内存的分配方式 `,7;2ZG~O  
hgU#2`fS  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 %"gV>E_u  
I;5:jT`  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 +gh*n,:|  
{0IC2jE  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ,UA-Pq3 }  
xC5`|JW  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 |%tI!RN):  
|9;MP&68  
D&]dlY@*  
十、内存分配的注意事项 abczW[\  
%gbvX^E?  
用new或malloc分配内存时,必须要对此指针赋初值。 Cu,#w3JR  
IV]2#;OO?  
用delete 或free释放内存后,必须要将指针指向NULL p(6!7t:  
6<`tb)_2~  
不能修改指向常量的指针数据 FJC}xEMcN  
5n#@,V.O/  
2`V[Nb  
十一、内容复制与比较 UPr8Q^wm  
|\# 6?y[o  
//数组…… =AVr<kP  
Dxx`<=&g  
char a[]=”Hello Word!”; e< E]8GAF  
8(kP=   
char b[10]; rD*CLq K  
=L F9im  
strcpy(b,a); 4)OM58e}  
m{ VC1BkZ  
if (strcmp(a,b)==0) ;qwN M~  
fo5+3iu^  
{} j{: >"6  
TD"w@jBA  
//指针…… <}z, !w8  
\NTNB9>CO  
char a[]=”Hello Word!”; o?]g  
uHu(   
char *p; Wti?J.Csc  
!-<PV  
p=new char[strlen(a)+1]; +u[?8D7Y  
$ri'tJ+  
strcpy(p,a); \Bg?QhA_D  
hrZ=8SrW  
if (strcmp(p,a)==0) k\wcj^"cb  
48t_?2>  
{} tiHP? N U  
 aa10vV  
B(l8&  
十二、sizeof的问题 [T>a}}@  
"JBTsQDj!  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 _5l3e7YN  
#5a'Z+  
char a[]=”Hello World!” }ki}J>j|f  
fD:>cje  
char *p=a; *]]C.t-cd  
[bIR$c[G  
count<<sizeof(a)<<end; //12字节 tM&;b?bJ[  
V/@?KC0B5  
count<<sizeof(p)<<endl; //4字节 I nCo[ 8SI  
KfkE'_ F  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 u{>_Pb  
o7B }~;L  
void fun(char a[1000]) V {H/>>k7  
mE+  
{ o 2Okc><z  
(bBr O74lR  
count<<sizeof(a)<<endl; //输出4而不是1000 ulzQ[?OMl  
^,;AM(E  
} !?%'Fy6t  
R]8^ @i1  
))z1T8  
十三、关于指针 >QJfTkD$  
sH}q&=  
1、 指针创建时必须被初始化 w:~Y@ b~D  
""2g{!~r  
2、 指针在free 或delete后必须置为NULL MaX:o GF,  
sKLH.@  
3、 指针的长度都为4字节 oy?>e1Sy*  
5f'<0D;K  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 =Lyo]8>,X  
Uq8=R)1<|d  
char *p=new char[100]; }[%d=NY  
n$S`NNO{]  
strcpy(p,”Hello World”); Bt\z0*t=s  
NcVsQV  
delete []p; //注意前面的[]号 !;1$1xWK  
3-T}8VsiP  
p=NULL; aTx*6;-PH  
1; "t8.*%e  
5、数组指针的内容不能超过数组指针的最大容易。 0-9.u`)#yu  
BL&D|e  
如: h)746T )  
,@b7N[h  
char *p=new char[5]; &K*x[  
eyLVu.  
strcpy(p,”Hello World”); //报错 目标容易不够大  t=;84lA  
qXQ/M]  
delete []p; //注意前面的[]号 lv* fK  
@^)aUOe  
p=NULL; 7w U$P  
yQXHEB  
S _B $-H|  
十四、关于malloc/free 和new /delete rq.S0bzH  
8sV_@<l<X  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 DrTo")T  
\\WIu?  
l 注意:malloc/free是库函数,new/delete是运算符 |4F 3Gu  
5*d  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 d5x>kO'[l  
$m:4'r  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 /W6r{Et  
T|c9Swu r  
l 两者都必须要成对使用 !QB(M@1  
y<<:6OBj  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 mu1Lgs$;  
nv9kl Q@  
P K]$D[a0  
十五、C++的特性 $:bU<  
':v@Pr|  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 i'Oh^Y)E#  
-[I}"Glz:  
重载和内联:即可用于全局函数,也可用于类的成员函数; XU}|Ud562  
a^*@j:[  
Const和Virtual:只可用于类的成员函数; {cNH|  
Uv-xP(X  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 G(puC4 "&  
j|u6TG  
覆盖是指派生类函数覆盖基类函数 l&z)Q/>?pZ  
E,#J\)'z  
函数名相同; T|h/n\fx)a  
^}-(8~_en  
参数相同; <V3N!H_d  
DJtKLG0  
基类函数必须有Virtual关键字; 95,{40;X7  
"))G|+tz  
不同的范围(派生类和基类)。 rSYzrVc  
%#.H FK  
隐藏是指派生类屏蔽了基类的同名函数相同 mxYsP6&  
SOyE$GoOsx  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 ?w}E/(r  
:>Gm&w (n  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 ugM,wT&~Y  
By t{3$  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 7kBULeBn|  
[8k7-}[  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 JZ[~3swR  
x}.Q9L  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 !!=%ty  
4MVa[ 0Y  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: }ST9&w i~  
V}#2pP  
将void Func(A a) 改为void Func(const A &a)。 8 0>qqz  
sLV bFN`  
而void func(int a)就没必要改成void func(const int &a); 5-L?JD 4&  
<y(uu(c  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 (ia(y(=C  
silTL_$  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 H1PW/AW  
#'Q_eBX  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; :@TfhQV_=Q  
6#+&_ #9  
@`N)`u85[  
十六、extern“C”有什么作用? "}i\" x;s  
qA<PF+f  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 d jeax  
 Efsfuv  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 S6 F28 d[j  
eUYd0L!  
=N,Mmz%  
十七、构造函数与析构函数 TxYxB1C)  
a;eV&~  
派生类的构造函数应在初始化表里调用基类的构造函数; }>cQ}6n.  
o$4n D#P3  
派生类和基类的析构函数应加Virtual关键字。 goi5I(yn^  
)1a3W7  
不要小看构造函数和析构函数,其实编起来还是不容易。 @|xcrEnP}B  
lvi~GZ  
#include <iostream.h> [-cYFdt"V  
sgDlT=c'  
class Base Qo{Ez^q@J  
CUB=T]  
{ 8$3G c"=  
!Y3w]_x[:  
public: 7WG"_A~V  
B*A{@)_  
virtual ~Base() { cout<< "~Base" << endl ; } !o2lB^e8  
83UIH0(  
}; $ u`y  
A-vK0l+  
class Derived : public Base tWYKW3~]  
:Vc+/ZyW  
{ S(jbPQT  
i{w<4E3  
public: $D8eCjUm  
<U=:N~L  
virtual ~Derived() { cout<< "~Derived" << endl ; } GMLq3_'  
az~4sx$+}  
}; DG&14c>g  
vW`{BWd  
void main(void) <4,>`#NEo  
<;:M:{RZY  
{ KwOn<0P  
+]/_gz  
Base * pB = new Derived; // upcast :e:jILQ[  
@2-Eky  
delete pB; ;w@PnY  
#uJGXrGt=  
} =h^cfyj  
x|G# oG)_  
输出结果为: ;JMd(\+-  
Ob2H7 !  
~Derived Q+E%"`3V4l  
Tm@d;O'E1  
~Base w@7NoD=  
Fxy-_%a  
如果析构函数不为虚,那么输出结果为 ymSGB`CP  
~?8B~l^  
~Base 09`5<9/  
;=1]h&S  
7Xm7{`jH  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 EO$_]0yI;_  
 B\1F  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
级别: 经院高中
发帖
302
铜板
1924
人品值
102
贡献值
0
交易币
0
好评度
294
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2006-08-17
我看不懂~```````
物尽天长的日子,希望如同电视剧看了一集又一集,等到剧终了,才发现终结是如此不舍而无奈。
描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五