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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 l]__!X  
o" e]9{+<  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 Yuqt=\? #  
fg0zD:@rA  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 )2y# cM*  
xe!6Pgcb  
e"ur+7  
二、头文件的作用 |qX[Dk  
)i*-j =  
加强安全检测 tU >?j1  
H.]rH,8  
通过头文件可能方便地调用库功能,而不必关心其实现方式 4ai|*8.  
! p|d[  
md`"zV  
三、* , &修饰符的位置 gKWsmx!["  
:PF6xL&  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 0l>4Umxr{J  
3=xN)j#B  
>]S-a-|Bp  
四、if语句 _ -C{:rV  
1wM~),B8  
不要将布尔变量与任何值进行比较,那会很容易出错的。 E)utrO R  
a+ lGN  
整形变量必须要有类型相同的值进行比较 I<^&~==  
%cFqD &6  
浮点变量最好少比点,就算要比也要有值进行限制 O7D61~G]  
ntt:>j$  
指针变量要和NULL进行比较,不要和布尔型和整形比较 gj-MkeI)  
Dt\rMSjZ9  
"YePd * W  
五、const和#define的比较 ^OnZ9?C{R  
byetbt(IF  
const有数据类型,#define没有数据类型 MY" 8!  
JUlCj #%  
个别编译器中const可以进行调试,#define不可以进行调试 4vbtB2  
G [$u`mxV^  
在类中定义常量有两种方式 Bi$nYV)-l  
/r@~"R x'  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; h;?H4j  
4<Q^/-W  
2、 用枚举代替const常量。 Rx%SeM2  
;<)<4N"  
)$7-CNWr~  
六、C++函数中值的传递方式 $`Hb -  
Fl0 :Z  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) T+U,?2nF:  
19.oW49Sw  
void fun(char c) //pass by value ;ro%Wjg`}  
:FqHMN  
void fun(char *str) //pass by pointer U>=& 2Z2?  
Z_}[hz$  
void fun(char &str) //pass by reference X|Z2"*;b`  
#Qnl,lf  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 `M.\D  
t,vj)|:  
函数的类型不能省略,就算没有也要加个void Y+0HC2(o  
<9jN4hV  
1xzOD@=dI  
七、函数体中的指针或引用常量不能被返回 Nr#" 5<W  
2E*h,Mo  
Char *func(void) o+I'nFtnI  
c6_i~0W56  
{ 40)Ti  
 4fa2_  
char str[]=”Hello Word”; w_lN[u-L  
_@:O&G2nB  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ;j^C35  
8ZPjzN>c6  
return str; mKN#dmw6  
N!iugGL  
} 4%9 +="  
1DT}_0{0Q  
函数体内的指针变量并不会随着函数的消亡而自动释放 X4{O/G  
o1?bqVF;6  
99tKs  
八、一个内存拷贝函数的实现体 9qXKHro  
}Z Nyd  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) ]p5]n*0X  
E[2>je  
{ 5w$\x+no  
0` \!O(jJ  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Os>^z@x  
6< O|,7=_  
byte *pbTo=(byte*)pvTo; //防止地址被改变 0JS#{EDh+  
y|(C L^(  
byte *pbFrom=(byte*)pvFrom; eB,eu4+-  
q6a7o=BP]  
while (size-- >0) D +Ui1h-  
w:+wx/\  
pbTo++ = pbForm++; I' TprT  
asd3J  
return pvTo; Xah-*]ET  
M:QM*?+)  
} 3yp?|> e  
&x>8 %Q s  
&2\^S+4  
九、内存的分配方式 LL"c 9jb4z  
j8#xNA  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 i^2-PKPg{  
\PJpy^i  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 `#x}-A$  
czu?]9;^ Z  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 fNnX{Wq  
@=G6fW:  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 qnCJrY6]  
5nSi29C  
#$;i 4a  
十、内存分配的注意事项 ll8Zo+-[  
E@%9u#  
用new或malloc分配内存时,必须要对此指针赋初值。 Tw+V$:$$  
tX@G`Mr(  
用delete 或free释放内存后,必须要将指针指向NULL R7Z7o4jg  
"B3&v%b  
不能修改指向常量的指针数据 b^q8s4(   
i}E&mv'  
3Eu;_u_  
十一、内容复制与比较 $l+DkR+  
+\/1V`  
//数组…… Wt 1]9{$  
#[$zbZ(I>:  
char a[]=”Hello Word!”; dJ&f +  
TQ&1!~L*  
char b[10]; '%y5Dh  
Q$lgC v^M  
strcpy(b,a); <7 R+p;y  
ayK?\srw  
if (strcmp(a,b)==0) q\]"}M 8  
!)-)*T  
{} g;mX{p_@  
A8oTcX_  
//指针…… f<;w1sM\  
-lqsFaW  
char a[]=”Hello Word!”; {;-wXzv`  
8o%g2 P9.  
char *p; rGIf/=G^r  
&V77Wn OY  
p=new char[strlen(a)+1]; X4I+  
_CImf1  
strcpy(p,a); vzH"O=  
<TQ,7M4X  
if (strcmp(p,a)==0) i2&I<:  
J@lQzRqRb  
{} "eG@F  
(N[R`LN  
/{71JqFis  
十二、sizeof的问题 }8&?  
#_?m.~`g[  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 tQ7:4._  
)~2~q7  
char a[]=”Hello World!” VV$4NV&`Q  
EV.F/W h  
char *p=a; J{qsCJiB  
T:!f_mu|  
count<<sizeof(a)<<end; //12字节 Sk7sxy<F'  
$/#F9>eZ  
count<<sizeof(p)<<endl; //4字节 2m{d>  
 hSgH;k  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 e]DuV)k&  
Bj*\)lG<  
void fun(char a[1000]) "J"RH:$v  
H9%[! RF  
{ cf+EQY  
l?<DY$H 0  
count<<sizeof(a)<<endl; //输出4而不是1000 'dvi@Jx  
J|=0 :G  
} v9 *WM3  
L"Dos +  
dKJ-{LV  
十三、关于指针 Zgw4[GpL  
!=bGU=^  
1、 指针创建时必须被初始化 ;}KT 3Q<^  
[MXyOE  
2、 指针在free 或delete后必须置为NULL 5hj _YqQ7  
VKMgcfbHr/  
3、 指针的长度都为4字节 CEh!X=Nn  
aE 2=  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 C'.^2s#e8  
'PWX19  
char *p=new char[100]; <IO@Qj1*  
S;iJQS   
strcpy(p,”Hello World”); TD.t)  
Dn[uzY6  
delete []p; //注意前面的[]号 ~i UG24v  
UZRN4tru6  
p=NULL; 3-v&ktD&N'  
d J.up*aR  
5、数组指针的内容不能超过数组指针的最大容易。 P{+,?X\  
Mi)h<lY  
如: 8DGPA  
r)|6H"n#]S  
char *p=new char[5]; 4QBPN@~t  
6Wk9"?+1  
strcpy(p,”Hello World”); //报错 目标容易不够大 noZ!j>f{@l  
SQT]'  
delete []p; //注意前面的[]号 XIBm8IkF  
g#lMT%  
p=NULL; kca#ssN  
~B\O{5W  
%;,4qB  
十四、关于malloc/free 和new /delete 7* R %zJ  
YVLK X}$)(  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 &fe67#0r)  
%:N;+1  
l 注意:malloc/free是库函数,new/delete是运算符 wnjAiIE5  
9_x rw:4  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 {J*|)-eAw  
9c{T|+ ]  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 5;@2SY7 ,  
]ONBr(M\  
l 两者都必须要成对使用 F60?%gg  
C;0VR  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 kgP6'`}E[  
Y?AvcY.  
$CDRIn50  
十五、C++的特性 nhy:5eSK  
#H;1)G(/  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 q}gM2Ia'vY  
L~("C  
重载和内联:即可用于全局函数,也可用于类的成员函数; WI1DL&*B@<  
snP]&l+  
Const和Virtual:只可用于类的成员函数; d+p^fBz  
I#/"6%e  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 q{l %k  
2 $Umqt  
覆盖是指派生类函数覆盖基类函数 *X uIA-9  
NtNCt;_R7  
函数名相同; d)kOW!5\  
\3T[Cy|5|  
参数相同; PQ2rNY6  
v;#0h7qd  
基类函数必须有Virtual关键字; bFVY&  
qRL45[ K  
不同的范围(派生类和基类)。 MIY`"h0*  
-oi@1g @  
隐藏是指派生类屏蔽了基类的同名函数相同 ,z~"Mst  
=g|5VXW5  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 !NMiWG4R  
S2 MJb  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 z\-/R9E/5-  
Uf9L*Z'6il  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 ^t?vv;@}  
WsW]  1p  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 M_h8{  
U#`2~Qv/1  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 D*'sOB(  
B\tm  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 70{B/ ($  
M'JCT'(X  
将void Func(A a) 改为void Func(const A &a)。 :}CcWfbT  
YB.@zL0.(  
而void func(int a)就没必要改成void func(const int &a); ee {K5G  
K"zRj L+  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 jS)YYk5  
U+[h^M$U  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 j>G|Xv  
0|ekwTx.  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; {E.A?yej9  
B:ugEAo_  
N%9?8X[5  
十六、extern“C”有什么作用? y?Pw6;e.  
{a ]u  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 O7m-_#/\   
=R)w=ce  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 8?ip,Q\  
9\uBX.]x  
[#%@,C  
十七、构造函数与析构函数 Sa@T#%oU  
I~4!8W-Y  
派生类的构造函数应在初始化表里调用基类的构造函数; ?kS#g  
`A<2wd;  
派生类和基类的析构函数应加Virtual关键字。 X6=o vm  
LTuT"}dT[  
不要小看构造函数和析构函数,其实编起来还是不容易。 % CQv&d2  
{s{+MbD  
#include <iostream.h> vy-q<6T}:p  
sl:1P^b  
class Base K^P&3H*(/n  
VAA="yN  
{ <fHN^O0TS  
`3*QKi$  
public: #e1iYFgS  
'7g]@Q7  
virtual ~Base() { cout<< "~Base" << endl ; } z:=E- +  
iNilk!d6Q3  
}; `dhBLAt  
hV&"  
class Derived : public Base 6{I6'+K~  
;U#=H9_  
{ GI>(S  
[=cYsW%WG  
public: Awr(}){  
+ Y!:@d  
virtual ~Derived() { cout<< "~Derived" << endl ; } s^m`qi(H  
p0PK-e`@:  
}; |.;]e[&  
H;0K4|I  
void main(void) DVf}='en8  
5n1`$T.WG  
{ L`(\ud  
VQ8Fs/Zt!  
Base * pB = new Derived; // upcast xVRxKM5 {  
*P|~v Cnr  
delete pB; v]rbm}uU9  
6}~k4;'}A  
} 7}e5ac  
5Pf)&iG  
输出结果为: {$ > .I  
dKhS;!K9p  
~Derived 4q.yp0E  
'}:(y$9.`  
~Base ].sD#~L_  
pfw`<*e'  
如果析构函数不为虚,那么输出结果为 /1_O5'5+v  
f:6F5G  
~Base ^]Q.V  
%<8r`BMo  
ev4_}!  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 ]wfY<Z  
9_8\xLk  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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