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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 5W? PCOh\  
CboLH0Fa  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 !!,0'c  
OSDy'@   
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 \=e8%.#@J  
/bVZ::A&_  
;y>a nE}n{  
二、头文件的作用 x4kWLy7Sz  
/@oLe[Mz$  
加强安全检测 Ib`-pRU;  
4Y ROB912  
通过头文件可能方便地调用库功能,而不必关心其实现方式 +s[\g>i  
WI[:-cv  
FY'dJY3O  
三、* , &修饰符的位置 $95~5]-nh  
5 t{ja  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 MZ4c{@Tg  
a:Q[gF8>  
Z|m`7xeCy  
四、if语句 5Jk<xWKj  
p .K*UP  
不要将布尔变量与任何值进行比较,那会很容易出错的。 *VeW?mY,P  
9U_ks[Qa  
整形变量必须要有类型相同的值进行比较 %&blJ6b  
I["j=r  
浮点变量最好少比点,就算要比也要有值进行限制 Mt>oI SN&d  
dJuD|9R  
指针变量要和NULL进行比较,不要和布尔型和整形比较 JAb6zpP  
hf<J \   
~}9PuYaD@  
五、const和#define的比较 #2p#VQh  
lFG9=Wf  
const有数据类型,#define没有数据类型 =t0tK}Y+4  
4`v!Z#e/aX  
个别编译器中const可以进行调试,#define不可以进行调试 F`+\>ae$h  
S33j?+ Vs  
在类中定义常量有两种方式 J ++v@4Z  
)0 Z!n  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; I*|P@0  
X]j)+DX>  
2、 用枚举代替const常量。 A#@_V'a8  
Ub$n |xn  
,J =P,](  
六、C++函数中值的传递方式 YV'pVO'_+  
~2 *9{  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) p3951-D  
F iAY\4  
void fun(char c) //pass by value .K8w8X/3  
Sb&lhgW]c  
void fun(char *str) //pass by pointer ) ]6h y9<  
).412I  
void fun(char &str) //pass by reference :py\ |  
PRu&3BP  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 |CD"*[j]  
z}4L=KR\v  
函数的类型不能省略,就算没有也要加个void wTq{sW&  
m\u26`M  
iAn'aW\TF  
七、函数体中的指针或引用常量不能被返回 Gpj* V|J  
s'HD{W`  
Char *func(void) db72W x0>  
;@mRo`D`  
{ Sr Ca3PA  
k#>hg#G  
char str[]=”Hello Word”; (U1]:tZ<.  
*A}WP_ZQ  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 fC-P.:F#I  
@'FE2^~Jj  
return str; ,ZE?{G{tuj  
c WAtju?L;  
} {=:#S+^ER  
)q~DTR^z-  
函数体内的指针变量并不会随着函数的消亡而自动释放 C}}/)BYi  
0DPxW8Y-`  
sp9W?IJ 6c  
八、一个内存拷贝函数的实现体 u_O# @eOc  
@\P4/+"9  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) q ?j|K|%   
`{K_/Cit  
{ oDB`iiBXQ  
P 1>AOH2yG  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Qt>>$3]!!  
?V(^YFzZ  
byte *pbTo=(byte*)pvTo; //防止地址被改变 9/o vKpY  
zU5Hb2a  
byte *pbFrom=(byte*)pvFrom; u eb-2[=  
CON0E~"  
while (size-- >0) _wDS#t;!M  
\Q$HXK  
pbTo++ = pbForm++; g(x9S'H3l  
+JyUe    
return pvTo; k\r(=cex6  
?knYY>Kzh1  
} /*)Tl   
j+4H}XyE  
*Ust[u  
九、内存的分配方式 KP"%Rm`XN  
B~o-l*  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 !p"aAZT7sq  
m6mwyom.  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ~g;   
d' >>E  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 px''.8   
X"MU3]  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 ->{d`-}m'  
<W)u{KS#TY  
A=5epsB  
十、内存分配的注意事项 wE\3$ s/{D  
sq/]wzT:  
用new或malloc分配内存时,必须要对此指针赋初值。 eet Q}]  
Q4*-wF-P  
用delete 或free释放内存后,必须要将指针指向NULL (7FW9X;  
~ Hy,7  
不能修改指向常量的指针数据 ,FzeOSy'p  
 Y k7-`  
Kn;D?ioY  
十一、内容复制与比较 &BE  g  
vV?rpe|%  
//数组…… arK_oh0B  
{No L  
char a[]=”Hello Word!”; uGN^!NG-0  
XM1`x  
char b[10]; qO1tj'U<  
RJeDEYXeg  
strcpy(b,a); Z"-L[2E/{!  
~V=<3X  
if (strcmp(a,b)==0) >x1p%^cA;=  
aolN<u3G  
{} KW^<,qt5w  
!9iGg*0dx  
//指针…… /$N~O1"0)  
^eYqll/U  
char a[]=”Hello Word!”; VZn=rw  
7%?jL9Vw  
char *p; QnouBrhO  
yF._*9Q3hK  
p=new char[strlen(a)+1]; FyoEQ%.bI  
B$Z3+$hfF  
strcpy(p,a); P,DC7\  
?L) !pP]  
if (strcmp(p,a)==0) RkEN ,xWE  
gR^>3n'  
{} ~ (On|h  
LjFqZrH  
t`'iU$:1f  
十二、sizeof的问题 6R;3%-D  
q"qo.TPh|$  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 E\ 8  
b,TiMf9},h  
char a[]=”Hello World!” Z(>'0]G  
#:x4DvDkR  
char *p=a; 2aA`f7  
Uggw-sRU  
count<<sizeof(a)<<end; //12字节 YZ$ZcfXDW  
1k%k`[VC  
count<<sizeof(p)<<endl; //4字节 0yM[Z':i'{  
bAk&~4Y_"  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 T^<>Xiam  
J<gJc*Q  
void fun(char a[1000]) Lw7=+h)  
9Mp$8-=>7  
{ _96~rel_P  
C`jM0Q  
count<<sizeof(a)<<endl; //输出4而不是1000 5v\!]?(O;  
M@1r:4CoKH  
} vR6Bn  
k^ F@X  
2f`nMW  
十三、关于指针 8N%Bn&   
_/*U2.xS  
1、 指针创建时必须被初始化 ^>y@4qB  
]'~vI/p  
2、 指针在free 或delete后必须置为NULL c)md  
$/1c= Y@  
3、 指针的长度都为4字节 RE$`YCs5  
. v@>JZC  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 OX:O^ (-r,  
qH,l#I\CG  
char *p=new char[100]; BElJB&I  
DD9?V}Yx  
strcpy(p,”Hello World”); nfW&1a  
@XD+'{]  
delete []p; //注意前面的[]号 8.=\GV  
^[-el=oKn0  
p=NULL; ;8S/6FI  
>N\0"F7.  
5、数组指针的内容不能超过数组指针的最大容易。 t2" (2  
!  Z`0(d  
如: l=N2lHU  
Awv`)"RAR  
char *p=new char[5]; XMB[h   
;;$#)b  
strcpy(p,”Hello World”); //报错 目标容易不够大 Z|9u]xL  
'\fY<Q:!  
delete []p; //注意前面的[]号 %n%xR%|  
am_gH  
p=NULL; tj]9~eJ-  
y %$O-q  
Cd79 tu|  
十四、关于malloc/free 和new /delete ;Yfv!\^|  
-7uwOr  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 [OTJVpC  
b*fgv9Kh'  
l 注意:malloc/free是库函数,new/delete是运算符 lDC$F N  
R`";Z$~{  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 )Dp/('Z2  
BG^C9*ZuP  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 R .[Z]-X  
$P7iRM]  
l 两者都必须要成对使用 j6~nE'sQ  
J?JeU/:+  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 1pv}]&X  
o~FRF0f*VP  
'Djm0  
十五、C++的特性 *tOG*hwdT  
GT hL/M  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 UmnE@H"t$\  
e6X[vc|Y}  
重载和内联:即可用于全局函数,也可用于类的成员函数; -"Y{$/B  
D9mz9  
Const和Virtual:只可用于类的成员函数; j#~Jxv%n  
gw`B"c|  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 Ee1LO#^_6  
+#b:d=v!  
覆盖是指派生类函数覆盖基类函数 0c.s -  
}),w1/#5u8  
函数名相同; 9%ii '{  
be5,U\&z  
参数相同; {u!)y?}I-  
iV FkYx%}  
基类函数必须有Virtual关键字; nhSb~QqEh  
)5JU:jNy  
不同的范围(派生类和基类)。 &|%6|u9  
]`g <w#  
隐藏是指派生类屏蔽了基类的同名函数相同 fl Jp4-nx  
YJs|c\eq?  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 IC{eE  
xR"M*%{@0  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 =Cv/Y%DN  
:{'k@J"| a  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 U7xmC  
qjJBcu_C'S  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 { 74mf'IW  
sG~<M"znV  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 'sp-%YlM -  
G a;.a  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: M L7 \BT  
lT\a2.E  
将void Func(A a) 改为void Func(const A &a)。 '6$*YN&5  
>U1R.B7f  
而void func(int a)就没必要改成void func(const int &a); H* ,,^  
B,z<%DAE  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 [ rNXQ` /  
.yT8NTu~0j  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 NVIK>cT6  
T{]~07N?  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; [md u!!*  
]maYUKqv}'  
5#3W5z  
十六、extern“C”有什么作用? 2>} xhQJ  
C^t(^9  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 =S[yE]v^  
0Iud$Lu  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ?::NO Dg  
IdIrI  
#jpoHvt h  
十七、构造函数与析构函数 3:"]Rn([P  
xRu Fuf8  
派生类的构造函数应在初始化表里调用基类的构造函数; Mh(]3\  
H?}[r)|(3i  
派生类和基类的析构函数应加Virtual关键字。 ~,D@8tv  
p3ISWJa!  
不要小看构造函数和析构函数,其实编起来还是不容易。 `"iY*  
Q@e[5RA +]  
#include <iostream.h> >$gG/WD?KR  
c4e_6=Iv  
class Base -K(fh#<6KO  
K|C^l;M6  
{ >Sa*`q3J  
Z') pf  
public: rOW-0B+N  
n}A\2bO  
virtual ~Base() { cout<< "~Base" << endl ; } . .QB~  
cN! uV-e  
}; s6 ( z  
?#0snlah|  
class Derived : public Base C\_zdADUb%  
N_4eM,7t  
{ _a_xzv'  
YL jHt\  
public: H@X oqgI  
%I!:ITa  
virtual ~Derived() { cout<< "~Derived" << endl ; } < `qRA]  
UX`]k{Mz  
}; ?6Cz[5\  
rdJm{<  
void main(void) |5I'CNi\  
xy+QbD T  
{ W$dn_9W  
v]2S`ffP  
Base * pB = new Derived; // upcast q,<[hBri-  
 O#nR>1h  
delete pB; E}CiQUx  
R cY>k  
} kH*Pn'  
1ju#9i`.Wg  
输出结果为: Kzy/9  
;vhyhP.oM  
~Derived A6<C-1 N}j  
5q{h 2).)  
~Base tC8(XMVx  
O^LTD#}$a)  
如果析构函数不为虚,那么输出结果为 u{&B^s)k.  
!DjvsG1x  
~Base {-9jm%N  
^\ ?O4,L  
1{pmKPu  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 Q8p&Ki;i  
U]qav,^[  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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