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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 0E\#!L  
LhG\)>Y%  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 @9^OHRZX  
#1dVp!?3T  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 |E~c#lV  
9hr7+fW]t  
qV=:2m10x  
二、头文件的作用 8Z !%rS  
L|1,/h 8p  
加强安全检测 j_C"O,WS  
#7;?Ls  
通过头文件可能方便地调用库功能,而不必关心其实现方式 d==0 @`  
Byq VNz0L  
H*]Vs=1  
三、* , &修饰符的位置 cGm3LS6]*  
'VV U-)(8  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 yPE3Awh5  
l/3=o}8q  
O=__w *<  
四、if语句 v4e4,Nt  
aiPm.h>  
不要将布尔变量与任何值进行比较,那会很容易出错的。 ; gBR~W  
?22U0UF  
整形变量必须要有类型相同的值进行比较 4?Y7. :x  
6uD<E  
浮点变量最好少比点,就算要比也要有值进行限制 75a3hPCZ  
!h1:AW_iz  
指针变量要和NULL进行比较,不要和布尔型和整形比较 NU=2*gM  
`h'+4  
9(t(sP_  
五、const和#define的比较 :G>w MMv&z  
s(py7{ ^K  
const有数据类型,#define没有数据类型 E5i5gE"\  
<ll?rPio"  
个别编译器中const可以进行调试,#define不可以进行调试 mr7Oi `dE  
]Y?Y$>  
在类中定义常量有两种方式 U4 *u|A  
,>aa2  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; U!uPf:p2  
$'KQP8M+  
2、 用枚举代替const常量。 k.C&6*l!5;  
j7)mC4o:%  
dQT[pNp:  
六、C++函数中值的传递方式 o/3.U=px~  
*rTg>)  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) /4O))}TX  
GXxI=,L8F  
void fun(char c) //pass by value 2.WI".&y=  
n UmyPQ~  
void fun(char *str) //pass by pointer t Aq0Z)  
^?RH<z  
void fun(char &str) //pass by reference lrZ]c:%k  
s! 2[zJ19p  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ;N#}3lpLqg  
|!] "y<  
函数的类型不能省略,就算没有也要加个void `Pc6 G*p  
S3/%;=|  
HnArj_E  
七、函数体中的指针或引用常量不能被返回 l<XYDb~op  
mt+i0PIfj  
Char *func(void) "a].v 8l!  
{ol7*%u  
{ %SB4_ r*<  
cW>=/  
char str[]=”Hello Word”; ]=t}8H  
t@R[:n;+  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 27 XM&ZrZ  
-&D=4,#  
return str; |` ~ioF  
@Dfg6<0  
} CPZ,sWg5  
b 9rQQS  
函数体内的指针变量并不会随着函数的消亡而自动释放 ,z.l#hj,{  
VxDIA_@y  
G+N1#0,q  
八、一个内存拷贝函数的实现体 g;=VuQuP|  
 nBp6uNK[  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) o)XrC   
\{`^Q+<  
{ gdeM,A|  
!O%!A<3  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); d7](fw@c  
joskKik^  
byte *pbTo=(byte*)pvTo; //防止地址被改变 ;*Vnwt A  
jUM'f24  
byte *pbFrom=(byte*)pvFrom; xgMh@@e  
H2%Qu<Kg2  
while (size-- >0) 1s(T#jh  
%B\x %e ;P  
pbTo++ = pbForm++; mP\V.^  
"\EX)u9ze  
return pvTo; `2]0 X#R  
2c]"*Pb  
} N<i5X.X  
2|^@=.4\  
]UUa/ep-  
九、内存的分配方式 '>t&fzD0  
AC1RP`c  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 P 9yMf~  
%<-OdyM  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 U.,S.WP+d  
sR1_L/.  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 "W"^0To  
k5E2{&wZ  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 GIzB1cl:  
'wEQvCS  
2pdeJ  
十、内存分配的注意事项 fYjmG[4  
Qz(2Iu{E]  
用new或malloc分配内存时,必须要对此指针赋初值。 |:5O|m '  
SM8N*WdiU  
用delete 或free释放内存后,必须要将指针指向NULL Mu>  
'Wnh1|z  
不能修改指向常量的指针数据 3h:~NL  
boEQI=!j\+  
*|Vf1R]  
十一、内容复制与比较 (0.oE%B",1  
}y6@YfV${  
//数组…… : B&~q$  
IOZw[9](+  
char a[]=”Hello Word!”; w\GJ,e  
r1< 'l  
char b[10]; l%2VA  
i'li;xUhZ  
strcpy(b,a); Y:;_R=M  
B{&W|z{$  
if (strcmp(a,b)==0) S'34](9n6  
ij0I!ilG4  
{} B1_9l3RM  
F%-@_IsG#  
//指针…… b5)^g+8)w  
U\lbh;9G  
char a[]=”Hello Word!”; Ag9GYm  
~|Vq v{  
char *p; 'O)v@p "  
w{DU<e:  
p=new char[strlen(a)+1]; "<0!S~]  
Y^Buz<OiG  
strcpy(p,a); K>+ v" x  
%U{sn\V  
if (strcmp(p,a)==0) qY8; k #  
#a=]h}&1?  
{} ;>Z+b#C[  
)8oyo~4?  
]2m=lt1  
十二、sizeof的问题 ra*|HcLD  
tRU/[?!  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 &6CDIxH{  
y`zdI_!7  
char a[]=”Hello World!” Q.$8>)  
aQmS'{d?^  
char *p=a; X'$H'[8;C  
}Q: CZ  
count<<sizeof(a)<<end; //12字节 <fHHrmZ#/.  
m#BXxS#B<_  
count<<sizeof(p)<<endl; //4字节 RjVU m+<  
NE#`ZUr3  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 Q<6* UUQm  
IrYj#,xJ  
void fun(char a[1000]) v+x<X5u  
p+iNi4y@  
{ I@m(}  
00;SK!+$  
count<<sizeof(a)<<endl; //输出4而不是1000 }5PC53q  
;v]C8}L^  
} $&.(7F^D  
0@?m"|G  
tb?TPd-OY  
十三、关于指针 8OOAPp$%|  
xT&/xZLT  
1、 指针创建时必须被初始化 !)oQ9,N  
02EX_tt),  
2、 指针在free 或delete后必须置为NULL )kjQ W&)g  
h(kPf ]0  
3、 指针的长度都为4字节 >{Ayzz>v  
rx| ,DI  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 }0<2n~3P  
p}==aNZK  
char *p=new char[100]; lmcgOTT):  
j9c:SP5  
strcpy(p,”Hello World”); uDG>m7(}/h  
i;~.kgtq4  
delete []p; //注意前面的[]号 @>VX]Qe^X  
5+{oQs_  
p=NULL; MjQ>& fUK  
OD[=fR|cp  
5、数组指针的内容不能超过数组指针的最大容易。 ;C=d( pY  
k {{eyC  
如: 3BK 8{/  
j@nK6`d+1  
char *p=new char[5]; SD~4CtlfI  
!_+FuF"@  
strcpy(p,”Hello World”); //报错 目标容易不够大 8[@Y`j8  
fif'ptK  
delete []p; //注意前面的[]号 3s]o~I2x  
U43U2/^  
p=NULL; Vq#0MY)2gS  
jK\kASwG  
a%m >v,  
十四、关于malloc/free 和new /delete )Dv;,t  
x/]G"?Uix  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 l(QntP  
8rJf2zL  
l 注意:malloc/free是库函数,new/delete是运算符 rUV'DC?eE  
 7a_u=\,  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Tl"r#  
&)q>Z!C-l  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 .+8#&Uy  
7ko}X,aC  
l 两者都必须要成对使用 ;x_T*} CH  
FN26f*/  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 .j)DE}[q>  
eGKvzu  
s 64@<oU<"  
十五、C++的特性 @~=d4Wj6  
m/g[9Y  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Ug#B( }/  
T{3-H(-gA  
重载和内联:即可用于全局函数,也可用于类的成员函数; $WW7,  
hE\gXb  
Const和Virtual:只可用于类的成员函数; Hjs#p{t[  
X+\=dhn69  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 jX$U)O  
[ p0_I7  
覆盖是指派生类函数覆盖基类函数 yJ; ;&  
^5!"[RB\  
函数名相同; W+V &  
+*qTZIXj  
参数相同; <gvgr4@^yR  
04X/(74  
基类函数必须有Virtual关键字; QUXr#!rPY|  
PEtr8J$uB  
不同的范围(派生类和基类)。 v~dUH0P<>e  
Y!u">M#@  
隐藏是指派生类屏蔽了基类的同名函数相同 T-oUcuQB  
1TN+pmc}@  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 TuwSJS7  
l@<Jp *|  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 4kNSF  
u]3VK  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 q"g4fzCD  
aHle s5   
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1$yS Ii  
2-duzc  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 |' kC9H[>  
V8%( h[  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: EF6"PH+J@  
RDqQ6(e"  
将void Func(A a) 改为void Func(const A &a)。 :?3y)*J!  
hZO=$Mm4p  
而void func(int a)就没必要改成void func(const int &a); c<)O#i@3/  
b:*( f#"q  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Eo <N  
> lK:~~1  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 ^12}#I  
a&n}pnEn)  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; VsRdZ4  
s(Fxi|v;  
N2EX`@_2  
十六、extern“C”有什么作用? N!af1zj  
*ur[u*g  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 G:PcV_ihx  
JZrZDW>M  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 XV<{tqa  
8&y3oxA,  
0yKPYA*j  
十七、构造函数与析构函数 3%V VG~[  
4d @ (>  
派生类的构造函数应在初始化表里调用基类的构造函数; Gc:oS vm  
R%%h=]  
派生类和基类的析构函数应加Virtual关键字。 0p \,}t\E  
HNL;s5gq  
不要小看构造函数和析构函数,其实编起来还是不容易。 6[C>"s}Ol  
JI~@H /j  
#include <iostream.h> X7fJ+C n  
bQ_N^[oxQ  
class Base %VzCeS9  
qRA ,-N  
{ = M/($PA  
,OaPrAt-  
public: C'//(gjQ-G  
e^Lt{/  
virtual ~Base() { cout<< "~Base" << endl ; } Ru^j~Cj5  
?Kf?Z`9 *Y  
}; JNgl  
' +[fJ>Le  
class Derived : public Base ejPK-jxCa/  
T,Zfz9{n  
{ x[H9<&)D  
b!-F!Lq/+0  
public: }c0EGoU}?  
g_t1(g*s  
virtual ~Derived() { cout<< "~Derived" << endl ; } #1` lJ  
Lr`G. e  
}; \HZ]=B#0  
h; 8^vB y  
void main(void) N|L Ey  
VWR6/,N^_  
{ XDrNc!XN  
:raYt5n1,y  
Base * pB = new Derived; // upcast nd1%txIsr  
dKwY\)\  
delete pB; 4{oS(Vl!  
} h pTS_  
} ~kAen  
jI9Kn41  
输出结果为: kdHP v=/U  
?sBbe@OC?  
~Derived v"dj%75O?e  
 B Ji  
~Base l^ aUN  
`CXAE0Fx  
如果析构函数不为虚,那么输出结果为 >B9|;,a  
?u]%T]W  
~Base =9ISsI\Y6  
QjlwT2o'  
E1e#E3Yq}s  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 z rV  
$'2yPoR  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录 或 注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五