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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 g-C)y 06  
=pT}]  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 =c-Y >  
/v<FH}  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 0uZL*4A+C  
{wp~  
+hIC N,8!  
二、头文件的作用 eNHSfq  
U%:K11Kr  
加强安全检测 . r?URC  
{)CN.z:O  
通过头文件可能方便地调用库功能,而不必关心其实现方式 T{CCZ"Fv  
/h]#}y j  
qS9z0HLE  
三、* , &修饰符的位置 (93$ L zZ  
b41f7t=  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 x(]Um!  
5~R1KjjvA  
_c z$w5`  
四、if语句 s)A=hB-V  
lH%%iYBM  
不要将布尔变量与任何值进行比较,那会很容易出错的。 tM:%{az  
S5+W<Qs  
整形变量必须要有类型相同的值进行比较 fb=[gK#*,  
c,yjsxETW  
浮点变量最好少比点,就算要比也要有值进行限制 J4) ?hS  
v1R  t$[  
指针变量要和NULL进行比较,不要和布尔型和整形比较 VYo2m  
+|w%}/N  
a>o]garB+  
五、const和#define的比较 WC7ltw2  
MnPk+eNJm  
const有数据类型,#define没有数据类型 yq=rv$.s  
JS!`eO/8  
个别编译器中const可以进行调试,#define不可以进行调试 -"CXBKHb  
E,}(jAq7  
在类中定义常量有两种方式 Tlar@lC|u  
nOm-Yb+F  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; {<P{uH\l  
b(HbwOt ~3  
2、 用枚举代替const常量。 H %bXx-  
(i.7\$4  
Puq  
六、C++函数中值的传递方式 )azK&f@tR|  
W<c95QD.  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) I1)t1%6"vJ  
F*4zC@;  
void fun(char c) //pass by value Ivx]DXR|  
9Qb6ek  
void fun(char *str) //pass by pointer l+r3|b  
7Eo;TNbb  
void fun(char &str) //pass by reference %7v!aJ40  
lzbAx  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 bSkr:|A7  
])9|j  
函数的类型不能省略,就算没有也要加个void v.!e1ke8D*  
Q/%]%d  
x4N*P  
七、函数体中的指针或引用常量不能被返回 =JGL~t?  
qa>H@`P  
Char *func(void) ~(x"Y\PEu  
dcH@$D@~S  
{ DX(!G a  
kQ99{l H,5  
char str[]=”Hello Word”; OnND(YiX  
2EC<8}CG  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 B1k;!@@1 4  
T(z/Jm3  
return str; ..fbRt  
Vpe\Okt:  
} %0_}usrsk  
#JYH5:*  
函数体内的指针变量并不会随着函数的消亡而自动释放 :>*0./hG  
08qM?{z o^  
]j+J^g  
八、一个内存拷贝函数的实现体 M `49ydh&  
w!rw%  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) {' UK> S  
hkDew0k  
{ S7h?tR*u  
FT Ytf4t  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); % pQi}x  
Zq"  
byte *pbTo=(byte*)pvTo; //防止地址被改变 &Vy.)0  
W}P9I&3  
byte *pbFrom=(byte*)pvFrom; DR(/|?k+  
y4N2gBTKu  
while (size-- >0) il[waUfmD  
+lhnc{;WJv  
pbTo++ = pbForm++; /2x@Z>  
h1+y.4  
return pvTo; PlRcrT"#w  
B'hN3.  
} #:xv]qb`k  
Zo#c[9IaC  
>c=-uI  
九、内存的分配方式 D zdKBJT+  
oR~s \Gt  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ld[BiP`B2V  
"Ky&x$dje  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 hiw>Q7W  
|lMc6C  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 7qL B9r  
M-/2{F[  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 #]*]qdQWV^  
sf Zb$T J  
>^GAfvW  
十、内存分配的注意事项 X@\ 9}*9  
oIGF=x,e8  
用new或malloc分配内存时,必须要对此指针赋初值。 589P$2e1X  
t[p/65L>8  
用delete 或free释放内存后,必须要将指针指向NULL @;7Ht Z`  
Gx;-1  
不能修改指向常量的指针数据 [mFgo il  
nP+jkNn3  
Ns$,.D  
十一、内容复制与比较 v<vaPvW  
!,OY{='  
//数组…… Sr>5V  
U"535<mR  
char a[]=”Hello Word!”; ]92=PA>75  
m1DrT>oN'  
char b[10]; i?D)XXB85  
|w.h97fj  
strcpy(b,a); V?- ]ZkI  
n um2HtU&%  
if (strcmp(a,b)==0) 7`SrqI&  
c!a1@G  
{} g4Nl"s*~  
fF^A9{{BS  
//指针…… ;{1  ws  
:KI0j%>2y  
char a[]=”Hello Word!”; h$#|s/  
4ah5}9{g  
char *p; vRLWs`1j  
^!Tq(t5V  
p=new char[strlen(a)+1]; 5l]qhi3f  
GI%9Tif  
strcpy(p,a); 7X8n|NZRH7  
 QB#_Wn  
if (strcmp(p,a)==0) J@qwz[d i  
Xb.# =R  
{} +J3Y}A4W3X  
]RxWypA`  
T/?C_i  
十二、sizeof的问题 #c(BBTuX  
B:6VD /qC  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 "DSRyD0M  
9P*p{O{_  
char a[]=”Hello World!” cd;~60@K  
$9ys! <g  
char *p=a; H^JFPvEc  
,S?M;n?z_  
count<<sizeof(a)<<end; //12字节 ]Y3s5#n  
hR,5U=+M7  
count<<sizeof(p)<<endl; //4字节 ^qNZ!V4T  
,|?rt`8)Q  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 zKQXmyO  
c@ lH  
void fun(char a[1000]) *0z'!m12  
Eb p=du  
{ {-51rAyi  
$AHdjQ[;6-  
count<<sizeof(a)<<endl; //输出4而不是1000 fJ;1ii~  
pg3h>)$/  
} \9 k3;zw  
3-gy)5.x e  
SHQgI<D7  
十三、关于指针 z q@"qnr  
9`Xr7gmQf  
1、 指针创建时必须被初始化 DI=?{A  
.50ql[En  
2、 指针在free 或delete后必须置为NULL  AtP!.p"j  
ivvm.7{  
3、 指针的长度都为4字节 lL*"N|Y  
v\R-G  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 f`-UC_(;  
5>>JQ2'W  
char *p=new char[100]; s} oD?h:T3  
_f@nUv*  
strcpy(p,”Hello World”); 2Zr,@LC  
is`~C  
delete []p; //注意前面的[]号 \vgM`32<  
YXDuhrs}  
p=NULL; ycrM8Mu 3  
MI>_wG5P@  
5、数组指针的内容不能超过数组指针的最大容易。 ft?c&h;At  
V"8w:?  
如: #,;Q|)AD:e  
iu QMVtv  
char *p=new char[5]; ORhvo,.u  
d?A!0 ;(*  
strcpy(p,”Hello World”); //报错 目标容易不够大 :_pn|  
MLN+ BuS  
delete []p; //注意前面的[]号 8>[o. xV  
>njX=r.  
p=NULL; y>]Yq-  
?L6pB]l8b  
< mp_[-c  
十四、关于malloc/free 和new /delete RU% 4~WC  
0?=a$0_C  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 U<wM#l P|Z  
>~})O&t  
l 注意:malloc/free是库函数,new/delete是运算符 Ly]J-BTe  
0lS=-am  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Nq#B4Zx  
{tUxRX  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 s/Q8(sF5  
r tH #j  
l 两者都必须要成对使用 ^AC2  zC  
!_>o2  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 MGH2z:  
ilwIqj  
unt{RVR%  
十五、C++的特性 mj&$+zM>  
f}7/UGd  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 nc;iJ/\4  
TnJNs  
重载和内联:即可用于全局函数,也可用于类的成员函数; C;']FmK]  
;8yEhar  
Const和Virtual:只可用于类的成员函数; FMz>p1s|dK  
'EG/)0t`  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 *@g>~q{`  
Gq{);fq  
覆盖是指派生类函数覆盖基类函数 r\$`e7d}!  
?fQ8Ff  
函数名相同; ~r&+18Z;  
5?8jj  
参数相同; o`{^ptu1q  
\12y,fOJ  
基类函数必须有Virtual关键字; v>sjS3  
UP*5M  
不同的范围(派生类和基类)。 O T .bXr~  
U2jlDx4yg  
隐藏是指派生类屏蔽了基类的同名函数相同 nRcy`A%  
H Yw7*  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 ;jFUtG  
d?N[bA  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 MC%!>,tC  
?7TuE!!M  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 bkiMF$K,K  
QUWx\hqE  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 {gI%-  
$j/#IzD1D  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 BB.120v&N  
drS>~lSxB  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 'k/:3?R  
_eUd RL>  
将void Func(A a) 改为void Func(const A &a)。 |J:m{  
LKYcE;n  
而void func(int a)就没必要改成void func(const int &a); L@`:mK+;  
z4JhLef%  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 qEfg-`*M  
cRP!O|I`]  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 ;Hn>Ew  
QI`&N(n  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; uLrZl0%HT~  
),5A&qT*  
a|Wrc)UR  
十六、extern“C”有什么作用? ^tI4FQ>Y  
[@/s! i @  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 e)aH7Jj#  
{~ 1 ~V  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 5W(`lgVs,  
&<t`EI];)4  
]fJ9.Js  
十七、构造函数与析构函数 -=)+)9~G  
lf_q6y  
派生类的构造函数应在初始化表里调用基类的构造函数; p_CCKU  
(Ji=fh+  
派生类和基类的析构函数应加Virtual关键字。 SyI i*dH  
Nh1, w  
不要小看构造函数和析构函数,其实编起来还是不容易。 _^`TG]F  
%!]CP1S  
#include <iostream.h> F{laA YE  
;n.SRy6  
class Base X 1}U  
aEdc8i ?  
{ LknV47vd  
eOJ_L]y-  
public: `bW0Va N  
/@0  
virtual ~Base() { cout<< "~Base" << endl ; } <"nF`'olV  
(>`S{L C>s  
}; %S<))G  
rmPJid[8B~  
class Derived : public Base R_b)2FU1y  
ZV$!dHW/  
{ -* W\$ P  
'3 JVUHn  
public: Iy Vmz'  
lQG;WVqW  
virtual ~Derived() { cout<< "~Derived" << endl ; } 2tZ\/6G<  
g&X X@I8+v  
}; =m U</F)  
`Wp y6o  
void main(void) kcE86Y=|x!  
+q] kpkG!  
{ U|v@v@IBA  
+5H1n(6)  
Base * pB = new Derived; // upcast "O8iO!:  
9XX:_9|I  
delete pB; '3TfW61]  
51`*VR]`K  
} _vUId?9@+e  
#-kx$(''V  
输出结果为: @[~j|YH}  
>[4CQK`U  
~Derived nk2H^RM^  
RU\MT'E>(  
~Base ? J6\?ct4  
Qk].^'\  
如果析构函数不为虚,那么输出结果为 rDC=rG  
>g2Z t;*@w  
~Base Q'0:k{G  
oPrK{flm  
J1Oe`my  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 lSBu,UQP  
y~Vl0f;  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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