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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 $lci{D32,  
fk`y}#7M  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 [ V()7  
UaCEh?D+Y  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Os9xZ  
h<i.@&  
TPp%II'*  
二、头文件的作用 L #p-AK  
c]F$$BT  
加强安全检测 di`Ql._M  
oddS~lW  
通过头文件可能方便地调用库功能,而不必关心其实现方式 >+R`3|o '  
L~Epd.,Dt  
Q4-d2I>0  
三、* , &修饰符的位置 qHg\n)R"x!  
-]\%a=]  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 URmx8=q  
gKcP\m  
X!,P] G  
四、if语句 0U ?1Yh7 m  
}S3m wp<Y  
不要将布尔变量与任何值进行比较,那会很容易出错的。 ^-PlTmT  
(w?@qs!  
整形变量必须要有类型相同的值进行比较  =w0Rq~  
gSK (BP|  
浮点变量最好少比点,就算要比也要有值进行限制 83:m 7;  
}Gr5TDiV0\  
指针变量要和NULL进行比较,不要和布尔型和整形比较 Jg3}U j2By  
ow]S 3[07  
2pH2s\r<UJ  
五、const和#define的比较 3Z NYR'  
):jK sP ,  
const有数据类型,#define没有数据类型 EUmQn8  
.Ff;St  
个别编译器中const可以进行调试,#define不可以进行调试 7*d}6\ %  
ho ?.\Jq  
在类中定义常量有两种方式 %Vrl"4^}t  
lh3%2Dq$  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; s#?Y^bgH  
#Qc[W +%  
2、 用枚举代替const常量。 &G5+bUF,  
)7c\wAs  
J6_H lt  
六、C++函数中值的传递方式 8vz9o <I  
~d?7\:n  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) #z-6mRB  
Fe%Q8RIh_  
void fun(char c) //pass by value c'&3[aa  
TZi%,yK  
void fun(char *str) //pass by pointer #JeZA0r5  
N \[Cuh8Fe  
void fun(char &str) //pass by reference Pe!uk4}w  
d"uR1 rTk  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 CT3wd?)z`  
.RH}/D  
函数的类型不能省略,就算没有也要加个void T/MbEqAf  
KQaw*T[Q3w  
d%VGfSrKq  
七、函数体中的指针或引用常量不能被返回 GKH 7Xx(  
F N;X"it.  
Char *func(void) 1Jc-hrN-  
NtkEb :  
{ .<^dv?@  
*bDuRr?v9  
char str[]=”Hello Word”; #?YQ&o~gZ  
9yajtR  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 }7+G'=XI/  
i>_V?OT#5  
return str; N-]h+Cnyu  
x&+/da-E/5  
} ?o$6w(]''  
-OZXl  
函数体内的指针变量并不会随着函数的消亡而自动释放 zGj0'!!-  
Uc!} D  
-uqJ~gD  
八、一个内存拷贝函数的实现体 Hwklk9U  
#JYv1F  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) %L}9nc%~eP  
[?)}0cd0  
{ ;VeC(^-eh6  
,xuqQ;JX  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); ]}i_NqW)  
V9I5/~0c  
byte *pbTo=(byte*)pvTo; //防止地址被改变 Q9q:HGXxv  
3%|LMX]M5_  
byte *pbFrom=(byte*)pvFrom; _OZrH(8  
' ]l,  
while (size-- >0) D@!`b6  
0diQfu)Fi  
pbTo++ = pbForm++; "639oB  
?lnX."eAdB  
return pvTo; tk|Ew!M:  
0qnToV;  
} h35x'`g7+r  
2Y\,[$z  
YU9xANi6  
九、内存的分配方式 M,8a$Mdqh  
1&ZG6#16q  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 `fu(  
BOrfKtG\  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 \'&:6\-fw  
R#`hT  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 8TD:~ee  
 ;iy]mPd  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 `8\ _ ]w0  
/P<RYA~  
I?lQN$A.E  
十、内存分配的注意事项 320Wm)u>:  
DhG2!'N  
用new或malloc分配内存时,必须要对此指针赋初值。 U2$e?1y  
v2gK(&?  
用delete 或free释放内存后,必须要将指针指向NULL e!d& #ofw|  
k+ 5:fB)z  
不能修改指向常量的指针数据 .wtb7U;7  
K8XXO"  
;}#tm9S;  
十一、内容复制与比较 n AQB  
*JZU 0Xb  
//数组…… 1>c`c]s3  
,oT?-PC$z  
char a[]=”Hello Word!”; LUna stA^  
Vx;f/CH3!  
char b[10]; MIub^ $<C  
.!\y<9  
strcpy(b,a); CtTG`)"|  
?9mFI(r~  
if (strcmp(a,b)==0) Os?G_ziIB  
2/ PaXI/Z  
{} ~j^HDHY@  
usZmf=p-r  
//指针…… ,v4Z[ (  
QzT)PtX  
char a[]=”Hello Word!”; ;-~ Wfh+  
'vgw>\X(  
char *p; AA;\7;k{  
eG72=l)Mz  
p=new char[strlen(a)+1]; puG$\D-[  
^6Q(he  
strcpy(p,a); h$)!eSu  
6k%N\!_TUW  
if (strcmp(p,a)==0) F[ N{7C3  
W @Y$!V<  
{} \S[:  
, b ,`;I  
-Mb nYs)  
十二、sizeof的问题 hzg&OW=:  
dB ?+-aE  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 afqLTWU S  
tQ< ou,   
char a[]=”Hello World!” T)6p,l  
BEPeK  
char *p=a; ,@tY D(Z  
\m1r(*Ar  
count<<sizeof(a)<<end; //12字节 lsCD%P  
wA|m/SZx  
count<<sizeof(p)<<endl; //4字节 0R\lm<&  
g05:A0X#  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ;JDn1(6  
\9geDX9A  
void fun(char a[1000]) [?r`8K2!,  
T3u%V_  
{ )TnxsFC  
 0$b)@  
count<<sizeof(a)<<endl; //输出4而不是1000 qXR>Z=K<  
5rRYv~+  
} M&Sjo' ( .  
h`-aO u  
 poGF  
十三、关于指针 lsU|xOB  
i=OPl  
1、 指针创建时必须被初始化 |!euty ::  
wQgW9546  
2、 指针在free 或delete后必须置为NULL j#$ R.  
vQ2kL`@  
3、 指针的长度都为4字节 q+.DZ @  
rY4{,4V  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 !e*Q2H+  
Pni  
char *p=new char[100]; v~[=|_{  
U2\g Kg[-Q  
strcpy(p,”Hello World”); dqwAQ-x  
|G&<@8O  
delete []p; //注意前面的[]号 \\AufAkJ  
y2gI]A  
p=NULL; lO3$V JI  
fWhwI+  
5、数组指针的内容不能超过数组指针的最大容易。 xbnx*4o0  
JaoRkl?F  
如: 5"%r,GMU  
1Y6<i8  
char *p=new char[5]; }`E5I&r4  
6T! *YrS  
strcpy(p,”Hello World”); //报错 目标容易不够大 2Vas`/~u~  
y/k6gl[`  
delete []p; //注意前面的[]号 IeLG/ fB  
R$X1Q/#md  
p=NULL; Q#Q]xJH  
/5 B{szf  
>p [|U`>{  
十四、关于malloc/free 和new /delete zPEx;lO$  
jku_0Q0*?  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 4G"T{A`O  
oXRmnt  
l 注意:malloc/free是库函数,new/delete是运算符 -lV]((I&  
G7yCGT)vQ  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 h}k&#X)7  
Eo 5p-  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 _tTtq/z<  
Gl}[1<~o  
l 两者都必须要成对使用 +kP)T(6  
"aIiW VQ  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 qL.1N~$2  
VC5LxA0{  
_p<W  
十五、C++的特性 FivgOa  
6d&dB  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 @GDe{GG+  
)8VrGg?  
重载和内联:即可用于全局函数,也可用于类的成员函数; @]P#]%^D2  
3}e-qFlV8,  
Const和Virtual:只可用于类的成员函数; Y f:xM>.%  
};6[Byf  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 nAPSs]D  
{R%v4#nk  
覆盖是指派生类函数覆盖基类函数 Kmc*z (Q  
dP63bV  
函数名相同; uCO-f<b  
<aR9,:  
参数相同; u>o<u a p  
c,pR+DP  
基类函数必须有Virtual关键字; 64 9{\;*4  
LsH&`G^<  
不同的范围(派生类和基类)。 4Xt.}S!  
}tA77Cm)45  
隐藏是指派生类屏蔽了基类的同名函数相同 j hf%ze  
H^z6.!$m  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 mz$)80ly  
Zz}Wg@&  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。  >Eg/ir0  
t0h @i`  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 <wWZ]P 2]  
qp3J/(F  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 Q%)da)0:c  
#$7d1bx  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 r'0IAJ-;  
rDFD rviW_  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: BwMi@r =  
is}6cR  
将void Func(A a) 改为void Func(const A &a)。 T9w;4XF  
eH,r%r,  
而void func(int a)就没必要改成void func(const int &a); xj`ni G  
.|W0B+Z8  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 !iUFD*~r~  
>a/]8A  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 ~R^~?Y%+<  
GcN[bH(@  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; Pu/X_D-#Gi  
L A &W@  
\) DJo  
十六、extern“C”有什么作用? WO$9Svh8  
VqGmZ|+8  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 Ey<vvZ  
8CCd6)cG  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ]."~)  
P`r@<cgb=  
[Q+8Ku  
十七、构造函数与析构函数 iR} 3 [  
_`3'D`s  
派生类的构造函数应在初始化表里调用基类的构造函数; ;[@);-9q  
Wy1#K)LRb  
派生类和基类的析构函数应加Virtual关键字。 &Ui*w%  
IxN0m7  
不要小看构造函数和析构函数,其实编起来还是不容易。 _2uRY  
_+Tq&,_:o  
#include <iostream.h> ^ [FK<9  
lh^-L+G:Ok  
class Base kS_oj  
Su.imM!  
{ r:pS[f|4\  
Mbbgsy3W  
public: ~*"]XE?M  
;#-yyU  
virtual ~Base() { cout<< "~Base" << endl ; }  dxHKXw  
%c+`8 wj  
}; 12l-NWXf  
NqyKR&;  
class Derived : public Base [R V_{F:'  
$Ro]]NUz|  
{ Mn$w_Z?  
T%0vifoQ_$  
public: o[Ojl .r<  
I ACpUB  
virtual ~Derived() { cout<< "~Derived" << endl ; } .quui\I3  
U`YPzZp_  
}; 99 W-sV  
7G6XK   
void main(void) )@lZ~01~d  
2?vjj:P+h  
{ #?=?<"*j  
yTt,/+I%gJ  
Base * pB = new Derived; // upcast \l)Jb*t  
j"G1D-S:  
delete pB; 2cv!85  
~)J]`el,Q  
} R(YhVW_l  
":=\ ci]e%  
输出结果为: Tfasry9'8  
hF m_`J&"  
~Derived M"XILNV-~  
poLzgd  
~Base 9Q\CJ9  
vbFi# |EU  
如果析构函数不为虚,那么输出结果为 yC%zX}5  
\tv^],^`  
~Base tc-pVw:TV  
Std?p{ i  
FXLY*eRk  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 PSCzeR  
6(#fGH&[  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五