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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 !zx8I7e4  
0ug&HEl_w  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 \>pm (gF  
H<n"[u^@E  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 A7%/sMv  
'8\9@wzv  
j*gJP !  
二、头文件的作用 rD4 umWi  
[:#K_EI5%  
加强安全检测 >;hAw!|#  
(AtyM?*  
通过头文件可能方便地调用库功能,而不必关心其实现方式 mB"I(>q*M  
GVJ||0D  
mICEJ\`x  
三、* , &修饰符的位置 xQDQgvwa  
A]'jsv!+  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 -,b+tC<V)0  
Y8]@y0(  
V`#2jDz  
四、if语句 fV5$[CL1  
sH;_U)ssH  
不要将布尔变量与任何值进行比较,那会很容易出错的。 bTrusSAl  
TUC)S&bC  
整形变量必须要有类型相同的值进行比较 AQ@)'  
'UWkJ2:!  
浮点变量最好少比点,就算要比也要有值进行限制 qf\W,SM  
 jF0"AA  
指针变量要和NULL进行比较,不要和布尔型和整形比较 ]#^v754X^T  
8$A0q%n  
< A8>To<  
五、const和#define的比较 nL/]Q'(5  
zA>X+JH>iw  
const有数据类型,#define没有数据类型 Z;81 "   
7]zZdqG&p`  
个别编译器中const可以进行调试,#define不可以进行调试 F c5t,P  
O_a^|ln&  
在类中定义常量有两种方式 fxPg"R!1i  
`qs}L  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; z5]6"v -  
gh ?[x.U  
2、 用枚举代替const常量。 > d p/  
?@$xLUHR4  
dGBjV #bNT  
六、C++函数中值的传递方式 >x;\H(g  
M=uT8JB  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) $$NWN?H~  
2.niB>  
void fun(char c) //pass by value ?#=xx.cF  
!Z:XSF[T  
void fun(char *str) //pass by pointer "nu]3zcd  
.6C/,rQ?c  
void fun(char &str) //pass by reference zvdut ,6<  
N~8H\  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 W<pr Y  
G5/A {1sz&  
函数的类型不能省略,就算没有也要加个void (b f IS  
==m[t- 9x  
K$h\<_V  
七、函数体中的指针或引用常量不能被返回 )&j`5sSXcr  
J@I>m N1\  
Char *func(void) H575W"53  
{V QGfN  
{ b+|Jw\k  
r9_ ON|  
char str[]=”Hello Word”; -[-oz0`Sl{  
/o;L,mcx*  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 apk,\L@sZ  
5U47 5&  
return str; Ie. on)  
?lsK?>uU  
} |z=`Ur@)  
34u[#O{2  
函数体内的指针变量并不会随着函数的消亡而自动释放 V'XEz;Ze  
O0qG 6a  
bzNnEH`^]  
八、一个内存拷贝函数的实现体 R}0gIp=  
1WMZ$vsQUb  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) _ f%s]  
-`k>(\Q< d  
{ bu _ @>`S  
nd8<*ru$  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); %`&n ;K.c  
)sm9%|.&  
byte *pbTo=(byte*)pvTo; //防止地址被改变 lw9jk`7^  
hUlRtt  
byte *pbFrom=(byte*)pvFrom; 7y|U!r"Y  
M?h{'$T  
while (size-- >0) 8/aJ4w[A  
QAV6{QShj  
pbTo++ = pbForm++; XZ |L D#  
]XEyG7D  
return pvTo; ..8t1+S6]  
);.$  `0  
} I3nE]OcW@  
@n)? =[p  
U7g`R@  
九、内存的分配方式 k={D!4kKz  
]2@(^x'=  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 V|'@D#\  
oWY3dc  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 aze#Cn,P}  
8?nn4]P  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 DS(>R!bb  
uQW)pD{_  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 arm_SyL0  
ED>7  
(10t,n$  
十、内存分配的注意事项 &s`)_P[  
swj\X ,{  
用new或malloc分配内存时,必须要对此指针赋初值。 8`*5[ L~~/  
}'P|A  
用delete 或free释放内存后,必须要将指针指向NULL 1 Gr^,Ry  
h2zSOY{su  
不能修改指向常量的指针数据 Eq)b=5qrG?  
<9pI~\@w  
%6cr4}Zm}  
十一、内容复制与比较 vb~%u;zrC@  
\;0pjxq=  
//数组…… U^7hw(}me  
yT/rH- j;5  
char a[]=”Hello Word!”; 0e8  
66?`7j X  
char b[10]; .vKgiIC:  
[s^p P2  
strcpy(b,a); t[!,puZc#  
961&rR}d  
if (strcmp(a,b)==0) Lmjd,t  
!6|_`l>G,  
{} }` 3-  
WDY\Fj   
//指针…… z!6_u@^-  
??nT[bhQ  
char a[]=”Hello Word!”; 85# 3|5n  
G%~V b  
char *p; H,KH}25  
IA0 vSF:  
p=new char[strlen(a)+1]; ByjfPb#  
=M 8Mt/P  
strcpy(p,a); RgoF4g+@  
w-WAgAch  
if (strcmp(p,a)==0) "-S!^h/v  
3)VO{Cj!  
{} 2+pw%#fe  
]rGd!"q  
i-0 :Fs  
十二、sizeof的问题 [Uk cG9  
X#axCDM-  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 mL1ZSX o!  
D7pQWlN\  
char a[]=”Hello World!” [5xm>Y&}  
_\4r~=`HQ  
char *p=a; T|\sN*}\8J  
\KJTR0EB:>  
count<<sizeof(a)<<end; //12字节 X{xkXg8h  
^e "4@O"  
count<<sizeof(p)<<endl; //4字节 fQ~~%#z1  
lg-`zV3  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 TCzz]?G]la  
L`M{bRl+1  
void fun(char a[1000]) 1Mq"f 7X8  
u@D5SkT  
{ k7:ISj J  
bL<H$DB6  
count<<sizeof(a)<<endl; //输出4而不是1000 ShRMzU  
:D}?H@(69  
} EO'+r[Y  
8u[.s`^  
br0\O  
十三、关于指针 t`&mszd~T  
)+ G0m,n  
1、 指针创建时必须被初始化 >.39OQ#  
M97+YMY)  
2、 指针在free 或delete后必须置为NULL or ~@!  
B7A.~' =  
3、 指针的长度都为4字节 $hJ 4=F  
&VjPdu57  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ([JFX@  
:;#^gv H  
char *p=new char[100]; hBZh0x y  
zGO_S\  
strcpy(p,”Hello World”); fX:G;vYn  
z 4. |N  
delete []p; //注意前面的[]号 t re`iCH~  
*s1o?'e  
p=NULL; S]ndnxy"b  
^l(,'>Cn  
5、数组指针的内容不能超过数组指针的最大容易。 %,N-M]Jf  
,9:v2=C_  
如: <6N3()A)%1  
4wS!g10}  
char *p=new char[5]; UHl1>(U  
2#`d:@r  
strcpy(p,”Hello World”); //报错 目标容易不够大 -uAGG?ZER  
M;-FW5O't  
delete []p; //注意前面的[]号 >hnhV6ss  
6jal5<H  
p=NULL; ) \cnz  
l9 rN!Q|  
k3 '5Ei  
十四、关于malloc/free 和new /delete a<pEVV\NB~  
~8Ef`zL  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 } F*=+n  
F j"]C.6B.  
l 注意:malloc/free是库函数,new/delete是运算符 2zjY|g/  
TTxSl p2=;  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 fK4O N'[R:  
fb]=MoiJ  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 :d~&Dt<c  
w/0;N`YB  
l 两者都必须要成对使用 4=ha$3h$  
ciPaCrV  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 l~`JFWur]  
2IDn4<`  
# b= *hi`E  
十五、C++的特性 ,+g0#8?p^x  
3t] 0  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 .O4=[wE!U  
y*sqnzgF  
重载和内联:即可用于全局函数,也可用于类的成员函数; w4&-9[@Y  
(5^SL Y  
Const和Virtual:只可用于类的成员函数; cmLI!"RLe  
`MMZR=LA  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ) nn v{hN  
ukX KUYNm8  
覆盖是指派生类函数覆盖基类函数 |i'w"Tz4  
52Q~` t7F  
函数名相同; 8g 2'[ci$q  
w >#.id[k  
参数相同; yH@2nAn  
 2Y9@[  
基类函数必须有Virtual关键字; }l@7t&T|  
}Mh`j $  
不同的范围(派生类和基类)。 +?[iB"F  
x@"`KiEUs  
隐藏是指派生类屏蔽了基类的同名函数相同 R 9Y k9v  
cU=/X{&Om  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 2W`<P2IA  
a`QKN rA2  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 WG*S:_?  
,Z]4`9c  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 `lq[6[n  
T_?,?  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 q"^T}d d,  
q0]Z` <w  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 |/p2DU2  
Uv /?/;si  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: u'EzYJ7  
bG9$&,  
将void Func(A a) 改为void Func(const A &a)。 |h1 Y3  
\rf2O s  
而void func(int a)就没必要改成void func(const int &a); i/WiSwh:  
erZ%C <  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Ej64^*  
;F'/[l{+  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 })@LvYK  
W_N!f=HW  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; *6%r2l'kZ  
N,NEg4 q[  
{VrjDj+Xy  
十六、extern“C”有什么作用? .9;wJ9Bw[  
\?.Tq24  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 !;^TW$ G  
#>\+6W17U  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ,t_Fo-i7vI  
O:,Fif?;  
t{)J#8:g  
十七、构造函数与析构函数 Syj7K*,%bZ  
u0& dDZ  
派生类的构造函数应在初始化表里调用基类的构造函数;  =:-x;  
Tb6c]?'U  
派生类和基类的析构函数应加Virtual关键字。 #/ Qe7:l  
^d2bl,1  
不要小看构造函数和析构函数,其实编起来还是不容易。 [m 3k_;[  
Lcyj, R  
#include <iostream.h> e7.!=R{6  
kdry a  
class Base )FrXD3 p  
lE?F Wt  
{ Eo }mSd  
z2lEHa?w  
public: ( nH3  
LMvsYc~]q  
virtual ~Base() { cout<< "~Base" << endl ; } a_0G4@=T  
;tF7 GjEp  
}; oLXQ#{([  
%r*zd0*<n1  
class Derived : public Base CL$mK5u  
U\A*${  
{ jci'q=Vpu  
8HyK;+ZkVd  
public: EI29;  
QDC]g.x  
virtual ~Derived() { cout<< "~Derived" << endl ; } f`j RLo*L  
X>#!s Lt  
}; P:")Qb2  
Y`u.P(7#  
void main(void) X192Lar  
IRZ?'Im  
{ (Js'(tBhiU  
W1s4[rL!Ht  
Base * pB = new Derived; // upcast 8L?35[]e  
In)#`E` g.  
delete pB; 7 C5m#e3  
B%L0g.D"  
} ba3_5 5]  
uL!{xuN  
输出结果为: shlL(&Py  
c4R6E~S  
~Derived Pv`^#BX'  
5 s>$  
~Base Z50]g  
K@6tI~un  
如果析构函数不为虚,那么输出结果为 I hvL2 zB  
xcz1(R  
~Base 7 3k3(rZ  
_AQ :<0/#  
h!f7/) |[o  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 j"E_nV:Qc  
MS6^= ["  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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