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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 *.8@ hPy  
Azxy!gDT"  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 ahU\(=  
hIuK s5`  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 9\0  
aqK<}jy  
l[fU0;A  
二、头文件的作用 W1w)SS  
Ps4spy0Fp  
加强安全检测 #5-0R7\d7  
wv # 1s3  
通过头文件可能方便地调用库功能,而不必关心其实现方式 N0,.cd]y`  
hp/}Z"A=  
(@vu/yN  
三、* , &修饰符的位置 _8)9I?jH  
C%85Aq*4  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 <*<7p{x  
}Gqx2 )H  
wv|:-8V  
四、if语句 Wo<zvut8  
?{mFQ  
不要将布尔变量与任何值进行比较,那会很容易出错的。 3l0x~  
hub1rY|No  
整形变量必须要有类型相同的值进行比较 g<-x"$(C&  
hR Y *WL  
浮点变量最好少比点,就算要比也要有值进行限制 ~M6Q8Y9  
I $!Y  
指针变量要和NULL进行比较,不要和布尔型和整形比较 [RiCa  
'=EaZ>=  
(y7U}Sb'  
五、const和#define的比较 U-6b><  
eNY$N_P   
const有数据类型,#define没有数据类型 RcitW;{|Kg  
{ aqce g  
个别编译器中const可以进行调试,#define不可以进行调试 o /AEp)8  
44B)=p7  
在类中定义常量有两种方式 J 6U3}SO=y  
|XzqP +t  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; :(VD<"X  
y,v*jE  
2、 用枚举代替const常量。 ymT&[+V  
M]oO1GM  
#uVH~P5TM  
六、C++函数中值的传递方式 tRZCOEo4  
;>{B K,  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) LSv0zAIe/  
m7Nm!Z7  
void fun(char c) //pass by value ':lADUt  
$rD&rsx6  
void fun(char *str) //pass by pointer YQxVeS(  
i{?uIb B  
void fun(char &str) //pass by reference ' \Z54$  
hJ 4]GA'  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 zFmoo4P/  
/xj^TyWM  
函数的类型不能省略,就算没有也要加个void [H$rdh[+  
%?1k}(qUeY  
"l6v[yv  
七、函数体中的指针或引用常量不能被返回 f5<qF ]Y/  
8Ih+^Y a  
Char *func(void) jXB<"bw  
A6YkoYgC  
{ Q"n|<!DN  
D6@c&  
char str[]=”Hello Word”; (Vnv"= (  
N '2Nv  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 gF+Uj( d  
*/fmy|#   
return str; zBV7b| j  
p"EQ6_f  
} *oqQ=#\  
9#L0Q%,*  
函数体内的指针变量并不会随着函数的消亡而自动释放 7KXc9:p+  
m?VA 1  
&[ejxK"  
八、一个内存拷贝函数的实现体 }w ^Hm3Y^&  
tP8>0\$)  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) `2Rd=M]?  
6Ty;m>j  
{ H5j6$y|I|N  
qKag'0e  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); D&KRJQ/  
kBg,U8|S  
byte *pbTo=(byte*)pvTo; //防止地址被改变 [Zc8tE2oN  
HfEU[p7)  
byte *pbFrom=(byte*)pvFrom; 77?/e^K\S  
&g%9$*gmT  
while (size-- >0) PLlad\  
hF|N81T  
pbTo++ = pbForm++; da<B6!  
_{0'3tI7  
return pvTo; 7 06-QE^  
g93-2k,  
} } wZ9#Ll  
.&fG_(6|  
I~ Q2jg2  
九、内存的分配方式 ([\mnL<FC  
k'Is]=3  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 6jz6   
 1$nlRQi  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 W u?A} fH  
.)J7 \z8m  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 03Czx`  
2H+!78  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 &/o4R:i  
8[@aX;I  
3[`/rg,  
十、内存分配的注意事项 =GH>-*qp  
62BT3/~  
用new或malloc分配内存时,必须要对此指针赋初值。 Mkc   
lsJl+%&8  
用delete 或free释放内存后,必须要将指针指向NULL (SMnYh4  
uW4 )DT9[5  
不能修改指向常量的指针数据 !V/Vy/'` *  
I_ O8 9Sgn  
ZbBz@1O  
十一、内容复制与比较 oY)xXx  
jUnS&1]MF  
//数组…… }.`no  
]/31@RT  
char a[]=”Hello Word!”; rBY)rUDd4  
-lICoRO#  
char b[10]; V\Q=EsHj   
(.r9bl  
strcpy(b,a); Y 1v9sMN,  
`X;'*E]e  
if (strcmp(a,b)==0) #GoZH?MAF  
p~LTu<*S  
{} NA@<v{z  
 S(* u_  
//指针…… (tG8HwV-  
OO$YwOKS  
char a[]=”Hello Word!”; Vc2 (R^  
HRP  
char *p; Ddu1>"p-x  
 DT2uUf  
p=new char[strlen(a)+1]; irZMgRQAT  
0Wd2Z-I  
strcpy(p,a); &oJ1v<`  
LpV2XL$p>#  
if (strcmp(p,a)==0) D^m`&asC  
8rV"? m`S  
{} ICvl;Q  
3haR/Y N  
9-B/n0  
十二、sizeof的问题 0R21"]L_M  
^Kbq.4  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 s:O8dL /  
0gevn  
char a[]=”Hello World!” L <QjkFj  
$l W 7me  
char *p=a; T<a/GE/  
)G+D6s23  
count<<sizeof(a)<<end; //12字节 J]AkWEiCJ  
"z8iuF  
count<<sizeof(p)<<endl; //4字节 2h;#BJ))  
uge~*S  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 )(/Bw&$  
XJSI/jpa@  
void fun(char a[1000]) [@_IUvf^.  
:q>uj5%  
{ m=K46i+NE  
O)FkpZc@9c  
count<<sizeof(a)<<endl; //输出4而不是1000 nSSj&q-O  
lWyg_YO@  
} QAxR'.d  
"AuU5G 9'I  
Can:!48  
十三、关于指针 t&>eZ"  
hy}n&h  
1、 指针创建时必须被初始化 kJ_XG;8  
}i F|NIV  
2、 指针在free 或delete后必须置为NULL hpBn_  
yhsbso,5 a  
3、 指针的长度都为4字节 Ib}~Q@?2  
Z~{0x#?4%  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 eZbT;  
cT.8&EEW  
char *p=new char[100]; =7vbcAJ\  
E%&E<<nhZ  
strcpy(p,”Hello World”); P3_ &(  
CubBD+h l*  
delete []p; //注意前面的[]号 1i=p5,|  
E]gy5y  
p=NULL; s~b!3l`gu  
Cj10?BNV)  
5、数组指针的内容不能超过数组指针的最大容易。 w:|YOeP  
VthM`~3  
如: k:0nj!^4w>  
# n\|Q\W  
char *p=new char[5]; ;/~%D(  
@~j- -L  
strcpy(p,”Hello World”); //报错 目标容易不够大 'iikcf*)C  
cHw-;  
delete []p; //注意前面的[]号 ApotRr$)  
r34 GO1d  
p=NULL; ,0^9VWZV  
15Vo_ wD<y  
pcO{%]?p  
十四、关于malloc/free 和new /delete ;yDXo\gm  
lfe^_`ij(+  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 #(dERET*  
<xaB$}R  
l 注意:malloc/free是库函数,new/delete是运算符 [h@MA|  
x67,3CLy?  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 IEQ6J}L  
qy,X#y'FuE  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 kT ,2eel  
D]zpG  
l 两者都必须要成对使用 />[~2d kb  
{3kI~s  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 7p+uHm  
J%ue{PL7  
F^}n7h=qk  
十五、C++的特性 fS- 31<?  
-^<`v{}Dn  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 mqv!"rk'w  
d A' h7D  
重载和内联:即可用于全局函数,也可用于类的成员函数; *+>R^\uT  
c[E>2P2-_  
Const和Virtual:只可用于类的成员函数; * ~4m!U_s  
ealh>Y  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 M$AQZ')9  
i \u"+:j  
覆盖是指派生类函数覆盖基类函数 *EzAo  
;J40t14u  
函数名相同; sAKQ.8$h*  
jHWJpm(  
参数相同; (??|\ &DTi  
`Ef &h V  
基类函数必须有Virtual关键字; Gj(UA1~1  
||vQW\g  
不同的范围(派生类和基类)。 `<kV)d%xEF  
dL!K''24{  
隐藏是指派生类屏蔽了基类的同名函数相同 Or[uq,Dm16  
8L}N,6gC4_  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 z0m[25FQG  
`%M} :T  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 ?G>#'T[  
C},$(2>0+  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 _ Oe|ZQ  
m K@a7fF?  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 |~3$L\X  
: j m|)  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 |Zo_x} 0  
DLrG-C33  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: K\GIh8L  
fMFlY%@t  
将void Func(A a) 改为void Func(const A &a)。 07dUBoq  
E~|`Q6&Y  
而void func(int a)就没必要改成void func(const int &a); 'd@Vusq}2  
L5*,l`lET  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 ,As78^E{  
y|+ltAK  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 t(:6S$6{e  
>MIp r  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 8@a|~\3-  
x{|n>3l`b9  
w5(GRAH  
十六、extern“C”有什么作用? {@u}-6:wAT  
cMEM}Qh T  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 It\o b7n  
|KFWW  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 =w.#j-jR  
K,IPVjS  
PHa#;6!5  
十七、构造函数与析构函数 B&m?3w  
&xqe8!FeA  
派生类的构造函数应在初始化表里调用基类的构造函数; xIo7f  
=;3|?J0=  
派生类和基类的析构函数应加Virtual关键字。 []Z| *+=Q  
e-o s0F  
不要小看构造函数和析构函数,其实编起来还是不容易。 6zLz<p?  
XfxNyZsy&>  
#include <iostream.h> wz!]]EQ!o  
GfQP@R"  
class Base 'ej{B0rE  
vAJfMUlP  
{ '+X9MzU*\  
J 6S  
public: ):+H`Hcm  
ZH%[wQ~4  
virtual ~Base() { cout<< "~Base" << endl ; } V]PTAhc  
5hpb=2  
}; |"P5%k#6^>  
o0wep&@  
class Derived : public Base jq["z<V )x  
/:e|B;P`k  
{ vfegIoZ  
yHt63z8'  
public: ~pj9_I  
n37( sKG  
virtual ~Derived() { cout<< "~Derived" << endl ; } 4:<0i0)5  
>CPkL_@VZ=  
}; $Y,]D*|"K  
~|J6M  
void main(void) F;ONo.v;  
YQN=.Wtc  
{ z<<` 1wqg  
@;<w"j`r  
Base * pB = new Derived; // upcast 2%W(^Lj  
h)wR[N]n  
delete pB; {=g-zsc]K  
4kg9R^0  
} 6g$04C3tHi  
fJE ki>1  
输出结果为:  ]NAPvw#p  
T"d]QYJS  
~Derived FcW ?([l  
)X^nzhZ2O"  
~Base dIO\ lL   
q]Qgg  
如果析构函数不为虚,那么输出结果为 Op%^dwVG(v  
g>im2AD+e  
~Base F'j:\F6C;  
>; W)tc,  
:za!!^  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 W: ?-d{  
uEi!P2zN  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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