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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 ~E`A,  
\S2'3SD d/  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 'Ph;:EMj  
;[ zx'e?!  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Pr/&p0@aV  
(}qLxZ/U  
,!py n<_  
二、头文件的作用 K|1^?#n  
V+K.' J ^@  
加强安全检测 )*JTxMQ  
g%[Ruugu  
通过头文件可能方便地调用库功能,而不必关心其实现方式 dX3> j{_  
6$5M^3$-  
nW%c95E  
三、* , &修饰符的位置 ) D`_V.,W  
U)o8Tr  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 e)bqE^JP  
e O}mZN  
4%{m7CK}  
四、if语句 V)Xcn'h  
Stw6%T-  
不要将布尔变量与任何值进行比较,那会很容易出错的。 [(K^x?\Y0'  
eK@Y] !lz  
整形变量必须要有类型相同的值进行比较 ixkg,  
g/yXPzLU  
浮点变量最好少比点,就算要比也要有值进行限制 ?0<3"2Db~  
[6tQv<}^  
指针变量要和NULL进行比较,不要和布尔型和整形比较 j)5Vv K\  
]_,~q@r$  
+Snjb0  
五、const和#define的比较 Vqr&)i"b$  
uQNoIy J)  
const有数据类型,#define没有数据类型 wDG4rN9x  
f<'C<xnf  
个别编译器中const可以进行调试,#define不可以进行调试 N!3f1d7RQ  
$p@g#3X`  
在类中定义常量有两种方式 M@3H]t?  
XDGZqkt  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; aU!UY(  
Sq'z<}o  
2、 用枚举代替const常量。 1XKk~G"D  
(qrT0D6  
zkOgL9 (_8  
六、C++函数中值的传递方式 |+bG~~~%j  
H6eGLg={  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) FRW.  
N@$%0!  
void fun(char c) //pass by value BSY#xe V  
xd3  
void fun(char *str) //pass by pointer IY&a!  
ik*_,51Zj  
void fun(char &str) //pass by reference `<n:D`{dZ  
-G 'lyH  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 = !X4j3Cv  
As`^Ku&  
函数的类型不能省略,就算没有也要加个void G;;~xfE'  
oX~CTunP  
7w*&Yg]  
七、函数体中的指针或引用常量不能被返回 kR ]SxG9  
>e;f{  
Char *func(void) Mm!saKT%  
4o3GS8  
{ bph*X{lFK  
ULjzhy+(8  
char str[]=”Hello Word”; Biwdb  
I\~V0<"jI  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 g OM`I+CwT  
Hi9z<l=$  
return str; &?6w 2[}  
p/~kw:I  
} "_j7kYAl  
)[*O^bPowI  
函数体内的指针变量并不会随着函数的消亡而自动释放 =jt_1L4  
1\0@?6`^  
,m,vo_Ub  
八、一个内存拷贝函数的实现体 H)Ge#=;ckQ  
tqCg<NH.!m  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 5nAF=Bj  
/p0LtUMu  
{ ^E17_9?  
CaBS0' n  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); /g''-yT7#  
[i7)E]*oTA  
byte *pbTo=(byte*)pvTo; //防止地址被改变 N-E`go  
qhtAtP>i"  
byte *pbFrom=(byte*)pvFrom; j:3Hm0W3  
^ZUgDQduc  
while (size-- >0) Cl!jK^AbG  
ZiYzsn  
pbTo++ = pbForm++; gq3OCA!cX  
n9!3h?,g  
return pvTo; ]_8I_V cQ  
PSS/JFZ^  
} , vyx`wDd  
%W;Gf9.w  
4ZpF1Zc4B  
九、内存的分配方式 5O ;^Mk|  
C&N4<2b  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 q.Z#7~6`3  
&W// Ox )f  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 Z3>3&|&  
~j#6 goKn  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 hp V /F  
]},Q`n>$  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 [Vp2!"  
@k6}4O?{  
{0WID D  
十、内存分配的注意事项 M`pTT5r  
6v O)s!b  
用new或malloc分配内存时,必须要对此指针赋初值。 -G#@BtB2+  
B\ >}X_\4  
用delete 或free释放内存后,必须要将指针指向NULL QYw4kD}  
4eL54).1O  
不能修改指向常量的指针数据 ,h.Jfo54,  
T xxB0  
RdvTtXg  
十一、内容复制与比较 G:C6`uiy`  
3nC#$L-   
//数组…… {^5<{j3e  
G^@Jgx3n  
char a[]=”Hello Word!”; ?WtG|w  
-L3 |9k  
char b[10]; wp*&&0O!  
+\[![r^P  
strcpy(b,a); 2n;;Tso"  
3/IWO4?_  
if (strcmp(a,b)==0) 5QFXj)hR+4  
AH 87UkNL  
{} v\9,j  
+'Y( V&  
//指针…… -1r & s  
(6#yw`\  
char a[]=”Hello Word!”; |]!Ky[P  
NRuG?^/}d  
char *p; . (*kgv@3x  
ZR-s{2sl  
p=new char[strlen(a)+1]; iraRB~  
eo*u(@  
strcpy(p,a); &;h~JS=  
b~Pxgfu"  
if (strcmp(p,a)==0) azDC'.3{p  
qzlMn)e  
{} Wt)SdF=U/  
[' OCw {<  
jPYe_y  
十二、sizeof的问题 IL>/PuZku  
7=p-A _X  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 Ad`[Rt']kI  
78a-3){  
char a[]=”Hello World!” [N95.aD  
? __aVQ7  
char *p=a; s{z~Axup-  
(XG[_  
count<<sizeof(a)<<end; //12字节 EB29vHAt~  
Ub'%pU  
count<<sizeof(p)<<endl; //4字节 `J=1&ae{  
e@,u`{C[  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 QLB1:O>  
Y0 X"Zw  
void fun(char a[1000]) 8G5) o`  
aZawBU.:  
{ x'M^4{4[  
ra9cD"/J &  
count<<sizeof(a)<<endl; //输出4而不是1000 "'F;lzq  
g* \P6  
} X@yr$3vC  
}l}yn@hYC  
1A?\BJ"  
十三、关于指针 ?}=-eJ(7e  
;Y@!:p- H  
1、 指针创建时必须被初始化 ` Y{>2UFX  
%su}Ru  
2、 指针在free 或delete后必须置为NULL F%PwIB~cy  
`\/toddUh[  
3、 指针的长度都为4字节 8NaL{j1`  
{ywXz|TP  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 %_b^!FR  
R,x>$n  
char *p=new char[100]; <DeKs?v  
FpdDIa  
strcpy(p,”Hello World”); /B,:<&_-  
2ec$xms  
delete []p; //注意前面的[]号 `%t$s,TiP  
zd*3R+>U'>  
p=NULL; 4#^'lKIx  
}A4nJ>`tq  
5、数组指针的内容不能超过数组指针的最大容易。 Pv/Pww \  
4AY _#f5u  
如: ET,Q3X\Oe  
y:[BP4H?y  
char *p=new char[5]; <#+oQ>5s  
zU f>db  
strcpy(p,”Hello World”); //报错 目标容易不够大 uFwU-LCe  
$ ^W-Wmsz  
delete []p; //注意前面的[]号 [!1)mR  
lQV|U;~D  
p=NULL; SXRdNPXFO  
gEZwW]r-  
hD nM+4D  
十四、关于malloc/free 和new /delete a'@-"qk  
UGhW0X3k  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 N#(jK1` y  
e#>tM  
l 注意:malloc/free是库函数,new/delete是运算符 p+, 1Fi  
i(Ip(n  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 `9.dgV  
n,t6v5>88  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 %ZujCZn  
\\=.6cg<K  
l 两者都必须要成对使用 u5Qp/ag?N  
%x&F4U  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理  MKU7fFN.  
eY J{LPo  
?VFM ]hO  
十五、C++的特性 >|wKXz  
'UY[ap  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 pG/ NuImA  
h^}_YaT\  
重载和内联:即可用于全局函数,也可用于类的成员函数; Y4QLs^IdB  
*"1~bPl  
Const和Virtual:只可用于类的成员函数; )T>8XCL\}  
9160L qY  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 $fj])>=H  
zQ,f5x  
覆盖是指派生类函数覆盖基类函数 i-`,/e~XT  
L >SZgmV+  
函数名相同; K} +S+ *_  
#C4|@7w%  
参数相同; SU/G)&Mi  
0z/h+,  
基类函数必须有Virtual关键字; x8Q~VVZr  
&GuF\wJ{7  
不同的范围(派生类和基类)。 V|TA:&:7  
z;J  
隐藏是指派生类屏蔽了基类的同名函数相同 H ZPcd_(  
L^lS^P  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 tyB)HF  
8$ic~eJ  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 1YFeVMc  
(#oYyM]  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 2xDQ :=ec  
J==}QEhQ{  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ?FN9rhAC  
j~epbl)pC  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 0{Bf9cH  
_74UdD{^o  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: m=H_?W;  
L_^`k4ct  
将void Func(A a) 改为void Func(const A &a)。 Jz0K}^Dj[  
T8U[xu.>  
而void func(int a)就没必要改成void func(const int &a); _ \l HI  
!nwbj21%  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 NEMEY7De2  
\7yJ\I  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 [<yz)<<  
PB+\jj  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 5C B%=iL{  
g92dw<$>  
Hq?&Qo  
十六、extern“C”有什么作用? (-\]A|  
PcB{ = L  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 usy,V"{  
UeA2c_ 5  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 IP04l;p/  
I0iY+@^5  
_lP4}9p  
十七、构造函数与析构函数 7,h3V=^)Q  
Qwv '<  
派生类的构造函数应在初始化表里调用基类的构造函数; 9\AS@SH{^T  
wlrIgn%  
派生类和基类的析构函数应加Virtual关键字。 VG)="g[%)  
uJY.5w  
不要小看构造函数和析构函数,其实编起来还是不容易。 S 6GMUaR  
Wab.|\c  
#include <iostream.h> 8b7;\C~$p  
)!eEO [\d  
class Base &Pq\cNYzW  
HyEa_9  
{ "R23Pi  
LJWTSf"f?  
public: _dr*`yXi  
3za`>bUN  
virtual ~Base() { cout<< "~Base" << endl ; } j7}lF?cJ2  
i:d`{kJ|[  
}; ,Aj }]h\L  
wu2:'y>n  
class Derived : public Base 'irGvex  
E_3r[1l  
{ /'4Q{8.a  
EjSD4  
public: yp p4L|R  
UfKkgq#  
virtual ~Derived() { cout<< "~Derived" << endl ; } =&2$/YX0D  
;g9%&  
}; E?Cj/o  
J)*8|E9P  
void main(void) s`c?:  
j=W@P-  
{ C`0%C7  
|{f~Ks%  
Base * pB = new Derived; // upcast (B:uc_+  
#V[SQ=>x[  
delete pB; )[jy[[K(  
4.Z(:g  
} sKd)BA0`  
K2HvI7$-  
输出结果为: ZoxS*Xk  
X2^_~<I{,  
~Derived 6e# wR/  
Cw#V`70a  
~Base Lm|al.Z  
?E7=:h(@t  
如果析构函数不为虚,那么输出结果为 M/#U2!iFk  
dE [Ol   
~Base &XQZs`41+  
AS|Rd+ .  
y]'CXCml)  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 dIJGB==  
Gw{+xz KJ  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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