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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 Pj1k?7  
^ X-6j[".  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 @A|#/]S1  
-zzoz x]S=  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 w6h*dh$w  
SZUo RWx  
3lTnfc&  
二、头文件的作用 J$U_/b.mk  
v_Hy:O}R  
加强安全检测 26;Gt8  
]=p^32  
通过头文件可能方便地调用库功能,而不必关心其实现方式 PQ{5*}$N  
lPD&Doa  
a2[rY  
三、* , &修饰符的位置 \mL]xE-  
=Qf{  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 T!I3.  
pekNBq Wm  
z+{xW7  
四、if语句 ];'7~",Y  
tAPf#7{|   
不要将布尔变量与任何值进行比较,那会很容易出错的。 cbYQ';{  
phQ{<wzwp  
整形变量必须要有类型相同的值进行比较 +4Fw13ADE  
BT`g'#O  
浮点变量最好少比点,就算要比也要有值进行限制 .K]Uk/W  
:cf#Tpq"  
指针变量要和NULL进行比较,不要和布尔型和整形比较 ]V)*WP#a  
e<qfM&*  
;E ,i  
五、const和#define的比较 *^w}SE(  
:G#+ 5 }  
const有数据类型,#define没有数据类型 NTEN  
U^eos;:s8  
个别编译器中const可以进行调试,#define不可以进行调试 =\ k:]  
; !C_}P  
在类中定义常量有两种方式 JL>frS3M  
Uy.ihh$I-  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; CYlS8j  
uQ&> Wk  
2、 用枚举代替const常量。 80`$F{xcX  
`H 'wz7  
E *IP#:R  
六、C++函数中值的传递方式 EqGpo_  
J7qTE8W=  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) IT)3Et@Y  
D1 $ER>  
void fun(char c) //pass by value c%bzrYQvA;  
6^!fuIZ;_  
void fun(char *str) //pass by pointer d WY{x47  
RehraY3q  
void fun(char &str) //pass by reference tj*/%G{Y  
MTN*{ug2:  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 1/~=61msc  
(,tu7u{  
函数的类型不能省略,就算没有也要加个void ~@)s)K  
qGX#(,E9;  
*G7cF  
七、函数体中的指针或引用常量不能被返回 ,QpFVlPU  
N'-[>w7vK2  
Char *func(void) ]31=8+D  
QQ_7Q^  
{ =*I|z+  
4P"bOt5izR  
char str[]=”Hello Word”; *nHuGla  
"*.N'J\  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 zsd1n`r  
#9Jr?K43  
return str; 4obW>  
,i??}Wm5G  
} w^ OB  
IVkB)9IW  
函数体内的指针变量并不会随着函数的消亡而自动释放 aidQ,(PDj  
i;U*Y *f  
$B_%MfI  
八、一个内存拷贝函数的实现体 fU?#^Lg  
{wsJ1 v8!  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) Rw%?@X3m]  
w/ (c}%v}=  
{ O,|NOz  
lux g1>  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); N%xCyZ  
C}pm>(F~  
byte *pbTo=(byte*)pvTo; //防止地址被改变 V-@4s}zX  
gwQMy$  
byte *pbFrom=(byte*)pvFrom; ^/#G,MxNy  
4xr^4\ lk  
while (size-- >0) 'QxJU$  
Ul9^"o  
pbTo++ = pbForm++; VOZxLyj^9  
H$C*&p  
return pvTo; m7g*zu2#  
Xd5s8C/}  
} ;Tp9)UP)  
)\EIXTZY=  
Z|$DchC  
九、内存的分配方式 3MFT P5~  
y|KQ`;  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ;'8Wl  
 MiIxj%,(  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ~{tO8 ]  
V%PQlc.X  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 k|?[EWIi^  
7~XA92  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 *oz#YGNm  
S-q"'5>  
Ca5#'3Eh  
十、内存分配的注意事项 ufIvvZ*  
(,#m+  
用new或malloc分配内存时,必须要对此指针赋初值。 /go[}X5QR[  
8I RKCuV  
用delete 或free释放内存后,必须要将指针指向NULL gM>?w{!LBx  
qi7C.w;  
不能修改指向常量的指针数据 _7Y-gy#\a  
.=J- !{z  
5(J?C-Pk  
十一、内容复制与比较 5%WAnh  
3kC|y[.&  
//数组…… $Y_S`#c@i  
pXO09L/nv  
char a[]=”Hello Word!”; ;Y;r%DJ  
V<S6 a  
char b[10]; qS @3:R  
heou\;GI"  
strcpy(b,a); 9 ;p5z[jI  
g^+p7G  
if (strcmp(a,b)==0) zgEN2d  
B2Y.1mXq  
{} By8SRWs  
Slg *[r#  
//指针…… C{85#`z`  
&lSNI5l  
char a[]=”Hello Word!”; >P~*@>e  
D1ZyJs#  
char *p; dv\bkDF4A  
0j(U &  
p=new char[strlen(a)+1]; Eqz|eS*6  
yjL+1_"B  
strcpy(p,a); V sl,u  
ub~ t}  
if (strcmp(p,a)==0) dV38-IfGkl  
!;,\HvEZYw  
{} iZy>V$Aq  
Jk>vn+q8P^  
F*@2)  
十二、sizeof的问题 {Z8GG  
#W)m({}  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 E7iAN\vo  
#%nV\ Bl  
char a[]=”Hello World!” U&BCd$  
GxD`M2  
char *p=a; }p*|8$#x"  
OgIRI8L  
count<<sizeof(a)<<end; //12字节 V 9$T=[  
}8tF.QjR|  
count<<sizeof(p)<<endl; //4字节 T{Xd>  
^@*`vz^_  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 xtP:Q9!N  
Wjl2S+Cc  
void fun(char a[1000]) 4Z%1eOR9V  
p%mHxYP  
{ l%_K$$C  
VBi gUK4  
count<<sizeof(a)<<endl; //输出4而不是1000 3f^Pr  
# tu>h  
} )S+fc=  
W/BPf{U  
SgxrU&::  
十三、关于指针 * rlV E  
7BU7sQjs  
1、 指针创建时必须被初始化  "LB MYZ  
z7IJSj1gQI  
2、 指针在free 或delete后必须置为NULL ?} 8r h%  
46NuT]6/4  
3、 指针的长度都为4字节 =AzPAN#e  
rc[~S  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ,uC-^T |n  
\7b, Mz!  
char *p=new char[100]; 1Mp-)-e  
KHZ[drb6$  
strcpy(p,”Hello World”); axUj3J>  
(CIcM3|9C  
delete []p; //注意前面的[]号 8_4!Ar>2  
F|> 3gW  
p=NULL;  cX C[O  
sPZwA0%  
5、数组指针的内容不能超过数组指针的最大容易。 v}u]tl$,  
>D!R)W`  
如: 'u v=D  
50 Gr\  
char *p=new char[5]; &,G2<2_b  
7mYcO3{5{  
strcpy(p,”Hello World”); //报错 目标容易不够大 "dIWHfQB  
b3-j2`#  
delete []p; //注意前面的[]号 %Ve@DF8G  
0yC~"u[N Y  
p=NULL; ?SgFD4<~P  
&6OY ^6<  
W;I{4ed6  
十四、关于malloc/free 和new /delete L>IP!.J]?  
1+$F= M~  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 hQx*#:ns  
`ZEFH7P  
l 注意:malloc/free是库函数,new/delete是运算符 D^O[_/i&  
zs]ubJC@  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 d)-ZL*o  
k@lJ8(i^qU  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 rd0Fd+t/  
z9IW&f~~P  
l 两者都必须要成对使用 t'eu>a1D  
K_L7a>Fr  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 9*s8%pL  
Cydo~/  
]dGH i \  
十五、C++的特性 *Lrrl  
A@< !'  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 =JE<oVP8  
nD/B :0'  
重载和内联:即可用于全局函数,也可用于类的成员函数; wnd #J `  
R4;1LZ8XzS  
Const和Virtual:只可用于类的成员函数; K>.}>)0  
agwbjkU/  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ^V;r  
Q +l{> sL  
覆盖是指派生类函数覆盖基类函数 3HtM<su*h  
yT OZa-  
函数名相同; s3A(`heoq  
0o$RvxJ  
参数相同; %%X/gvaJ  
#\X)|p2  
基类函数必须有Virtual关键字; )wjpxr  
k0j4P^d  
不同的范围(派生类和基类)。 TU_'1  
axC{azo|  
隐藏是指派生类屏蔽了基类的同名函数相同 -x6_HibbD  
A94:(z;{  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 <$?#P#A  
5: gpynE|  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 Jk}3c>^D  
aOg9Dqtg)f  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 BDfMFH[1  
X_X7fRC0  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 gHp4q!SJ7  
<fBJ@>  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 tBzE(vW  
 =AaF$R  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: JQbaD-  
+?6]Vu&|f  
将void Func(A a) 改为void Func(const A &a)。 -]KgLgJ  
4Wz1O$*  
而void func(int a)就没必要改成void func(const int &a); pSQ2wjps  
5u9lKno  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 c(Y~5A{TXO  
*j83E[(]  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 J ##a;6@  
Y_]y :H  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; W<&/5s  
5KB Z-,  
(BH<\&yHE  
十六、extern“C”有什么作用? n+=7u[AZi  
%6fnL~ A  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 Nz{qu}dt  
&0T7Uv-`  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ZJbaioc\  
!2AD/dtt   
4V[(RXc/  
十七、构造函数与析构函数 4mW$+lzn  
;FwUUKj  
派生类的构造函数应在初始化表里调用基类的构造函数; pR0 !bgC  
hs+)a%A3G  
派生类和基类的析构函数应加Virtual关键字。 kS{k=V&hf_  
p?Ux1S  
不要小看构造函数和析构函数,其实编起来还是不容易。 qYe`</  
.DwiIr'  
#include <iostream.h> s'tXb=!HO  
H{E(=S  
class Base F ',1R"/}  
PQ!'<  
{ ysp,:)-%G@  
=1>G * ,  
public: &/' O?HWl  
>9nVR  
virtual ~Base() { cout<< "~Base" << endl ; } .3+ 8Ip#z  
~g[D!HV|yu  
}; zuMz6#aCC8  
ByoI+n* U  
class Derived : public Base -[>J"l  
se3EI1e  
{ ec^{ez@`  
kQ\l7xd  
public: o\tw)_ >  
lgt&kdc%o  
virtual ~Derived() { cout<< "~Derived" << endl ; } &9v8  
Q!-"5P X  
}; yWc%z6dXC  
DZESvIES  
void main(void) yp]vDm  
NV{= tAR  
{ xZq, kP^  
p `oB._ R  
Base * pB = new Derived; // upcast ,lCFe0>k!=  
Xq"9TYf$  
delete pB; V=1yg24B<  
Y -BZV |  
} `mZ1!I-T  
-H\j-k  
输出结果为: 9nO&d(r g  
hms Aim9i  
~Derived mOjjw_3gq  
*.$ov<E.  
~Base &j'k9C2p  
\l[AD-CZPh  
如果析构函数不为虚,那么输出结果为 N-}OmcO]e  
 k_^ 4NU  
~Base @/01MBs;  
b<r*EY  
g-x;a0MQx  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 8j]QnH0&  
kot KKs   
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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