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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 NCpn^m)Q}  
Mh/>qyS *2  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 gm\o>YclS  
X\)KVn`  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Y>!W&Gtu  
6!D  
oHFDg?Z`  
二、头文件的作用 58ZiCvqv  
i}{Q\#=#  
加强安全检测 -3%)nV  
AT'$VCYC(  
通过头文件可能方便地调用库功能,而不必关心其实现方式 +jZg%$Q!#  
6rCP]YnF  
7Mg7B  
三、* , &修饰符的位置 (<~ R[sT|  
>oaEG5%d  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 L<>NL$CrN  
F3|pS:  
] Sx= y<  
四、if语句 |DS@90}  
yNf=Kl  
不要将布尔变量与任何值进行比较,那会很容易出错的。  p:>?  
kITmo"$K  
整形变量必须要有类型相同的值进行比较 ITY!=>S-  
Hh=::Bi  
浮点变量最好少比点,就算要比也要有值进行限制 4O"kOEkKT>  
>{) #|pWU  
指针变量要和NULL进行比较,不要和布尔型和整形比较 Z/UVKJm>:  
|a:VpM  
){|Lh(  
五、const和#define的比较 UNLNY,P/!)  
N}<U[nh'  
const有数据类型,#define没有数据类型 .wOLi Ms  
JkDZl?x5  
个别编译器中const可以进行调试,#define不可以进行调试 Wk#-LkI  
tSLl'XeN  
在类中定义常量有两种方式 ~vZzKRVS  
u,9U0ua@;  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; v7u}nx  
hg/&[/eodm  
2、 用枚举代替const常量。 e>9{36~jh  
3Ty{8oUs^  
-#M~Nb I,  
六、C++函数中值的传递方式 NGZ>:  
"/h"Xg>q  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) 1gK3= Ys  
!fjU?_[S  
void fun(char c) //pass by value MQMy Z:  
h#;K9#x6  
void fun(char *str) //pass by pointer i4C b&h^  
_rh.z_a7w  
void fun(char &str) //pass by reference BCB/cBE  
<a}|G1 h  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 zd]L9 _  
ghR]$SG  
函数的类型不能省略,就算没有也要加个void fB}5,22  
R*#Q=_  
;//q jo  
七、函数体中的指针或引用常量不能被返回 u)]sJ1p  
[zd-=.:+M[  
Char *func(void) < l ^ Z;.  
g7yHhF>%X  
{ y+x>{!pw  
)%c)-c  
char str[]=”Hello Word”; =qQQ^`^F'~  
9@+X?Nhv5  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 {oeQK   
Nn\\}R  
return str; I+Cmj]M s0  
Zul32]1r  
} l@jJJ)Qyk  
L%Hm# eFx  
函数体内的指针变量并不会随着函数的消亡而自动释放 <xNM@!'\h  
Ot<!YM  
'F~SNIay  
八、一个内存拷贝函数的实现体 ;$;/#8`>  
p5BcDYOw`  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) R7b*(33  
f|E'eFrFk  
{ 0~+:~$VrT  
/T'nY{  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); bG?[":k  
W5g!`f  
byte *pbTo=(byte*)pvTo; //防止地址被改变 +:Zi(SuS]  
X;RI7{fW%X  
byte *pbFrom=(byte*)pvFrom; ^/,yZ:  
mmK_xu~f28  
while (size-- >0) U<gw<[>f  
Ro$XbU)  
pbTo++ = pbForm++; ~`f B\7M  
h:90K  
return pvTo; T ua @w+  
DZZt%n8J  
} Z%Kj^ M  
*r3vTgo$  
y~ LVK8  
九、内存的分配方式 y>PbYjuIU  
@>ZjeDG>  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题  e:R[  
UGgi)  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 t9{EO#o' k  
yh<aFYdk  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 =,]M$M  
%V/]V,w:*R  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 wUndNE   
SQx):L)P6  
Z2}b1#U?  
十、内存分配的注意事项 n\Nl2u& m  
/Qy0vAvJ  
用new或malloc分配内存时,必须要对此指针赋初值。 np(<Ap r  
$ 7!GA9Bn  
用delete 或free释放内存后,必须要将指针指向NULL 5}ah%  
Dh<e9s:  
不能修改指向常量的指针数据 T]`" Xl8  
SO"P3X  
1)ne-e  
十一、内容复制与比较 #Xly5J  
`6su_8Hno  
//数组…… sJ=B:3jS0  
{D< ?.'  
char a[]=”Hello Word!”; wl9icrR>  
" Xc=<rX  
char b[10]; Bw[VK7  
r>o6}Mx$  
strcpy(b,a); Vo[4\h#$  
,Nh X%  
if (strcmp(a,b)==0) RPwSo.c4  
k=}hY+/=  
{} $_kU)<e3  
4+"SG@i`W  
//指针…… $la,_Sr  
M`'2 a  
char a[]=”Hello Word!”; !hUyX}{`j  
f 5Oh#  
char *p; ,fRb6s-  
g^FH[(P[G  
p=new char[strlen(a)+1]; 2t<CAKBB  
)1le-SC  
strcpy(p,a); l"CONzm!  
|Sm/Uq(c  
if (strcmp(p,a)==0) 8qveKS]vZ  
`PfC:L  
{} ]vMft?  
x`&W[AA4  
}$jIvb,3?  
十二、sizeof的问题 `^ok5w"oi  
~MF. M8  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 (X/JXu{  
"^`AS"z'  
char a[]=”Hello World!” m{|n.b  
!v=ha%w{  
char *p=a; &/p 9+gd  
PR0]:t)E  
count<<sizeof(a)<<end; //12字节 ; V8 =B8w  
t)h3GM  
count<<sizeof(p)<<endl; //4字节 X@rAe37h+  
RWYA`  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ="4)!  
L 'y+^L|X  
void fun(char a[1000]) %o>1$f]  
q_bB/   
{ 7JbrIdDl|  
=zdRoXBY[b  
count<<sizeof(a)<<endl; //输出4而不是1000 u}$3.]-.?T  
t"Rn#V\c."  
} 90a= 39kI  
%"D-1&%zY  
%-D2I  
十三、关于指针 -VL3em|0  
Jh1fM`kB5K  
1、 指针创建时必须被初始化 8}2 `^<U  
* -)aGL  
2、 指针在free 或delete后必须置为NULL y$rp1||lH  
^)WG c/  
3、 指针的长度都为4字节 cVN|5Y   
rnUe/HjH  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 t V</ x0#  
}I"^WCyH  
char *p=new char[100]; 38 F8(QU{  
iM-@?!WF  
strcpy(p,”Hello World”); /OEj]DNY  
4?`7XJ0a  
delete []p; //注意前面的[]号 Pg7/g=Va  
_F3:j9^  
p=NULL; [||$1u\%  
K7|BXGL8r8  
5、数组指针的内容不能超过数组指针的最大容易。 6;Bqu5_Cj  
gU:jx  
如: YRFM1?*  
Dcq^C LPY  
char *p=new char[5]; 6B=J*8 Hs  
zrcSPh  
strcpy(p,”Hello World”); //报错 目标容易不够大 9"[#\TW9Vb  
S[Et!gj:  
delete []p; //注意前面的[]号 d}1R<Q;F  
NeYj[Q~xy  
p=NULL; 8WMC ~  
#~"jo[  
iVE+c"c!2&  
十四、关于malloc/free 和new /delete kAMt8  
%j yLRT]H  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 R b'"09)$  
,xGkE7=5  
l 注意:malloc/free是库函数,new/delete是运算符 FKPI{l  
9kcAMk1K  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 i -+B{H  
-70Ut 4B  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 Re`= B  
u?!p[y6  
l 两者都必须要成对使用 cYK3>p A  
TWMD f  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 278 6tZF,  
SKGYmleR  
gqE{  
十五、C++的特性 @l 1 piz8  
c}QjKJ-c  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Vx'_fb?wap  
BQsy)H`4E  
重载和内联:即可用于全局函数,也可用于类的成员函数; 3vx?x39*Y  
8@ b83  
Const和Virtual:只可用于类的成员函数; I_Q'+d  
>Py=H+d!j  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 UPH:$Fk&  
n<MH\.!tM  
覆盖是指派生类函数覆盖基类函数 RX '( l  
HA| YLj?|g  
函数名相同; M*nfWQ a  
dI3U*:$X  
参数相同; dLLF#N  
VgOj#Z?K  
基类函数必须有Virtual关键字; ds`a6>746  
)]'?yS"  
不同的范围(派生类和基类)。 E1=]m  
^$VOC>>9  
隐藏是指派生类屏蔽了基类的同名函数相同 WL<Cj_N_{H  
:WE(1!P@  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 P7Kp*He)  
Eg>MG87  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 _jp8;M~Z  
S~hNSw (-  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 DJhi>!xJ  
$Ad 5hkz  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 3eD#[jkAI;  
Pn0V{SJOJ%  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 B+ +:7!  
.Gw;]s3  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: /_v@YB!0  
D3$}S{Yw1  
将void Func(A a) 改为void Func(const A &a)。 El ,p}Bi.  
sa{X.}i%E  
而void func(int a)就没必要改成void func(const int &a); kP3'BBd,  
[/xw5rO%  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 lj(}{O  
KnKV+:"  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 7Q2"]f,$CQ  
\f .ceh;!  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; bmFnsqo  
>J+hu;I5  
|d&a&6U:  
十六、extern“C”有什么作用? Z3)1!|#Q  
Zj%l (OVq  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 6s@'z<Ct  
1 %K^(J;  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 j"hfsA<_I  
!q mnMY$  
t0(1qFi  
十七、构造函数与析构函数 "*a^_tsT?i  
/2 ')u|  
派生类的构造函数应在初始化表里调用基类的构造函数; gq!| 0  
4gzrxV  
派生类和基类的析构函数应加Virtual关键字。 j'g':U  
> -OQk"o  
不要小看构造函数和析构函数,其实编起来还是不容易。 #}3$n/  
ND77(I$3s  
#include <iostream.h> se2ay_<F+  
X2v|O3>/N  
class Base q,A;d^g  
blEs!/A`  
{ "CX&2Xfe  
*%bQp  
public: A70x+mjy^T  
EA8K*>'pv  
virtual ~Base() { cout<< "~Base" << endl ; } |p}qK Fdi  
/z9oPIJ=*  
}; Q E1DTU  
# **vIwX-Q  
class Derived : public Base 3!ZndW SHV  
A@^Y2:pY  
{ }j;*7x8(  
*DcJ).  
public: :_X9x{  
(< gk<e*  
virtual ~Derived() { cout<< "~Derived" << endl ; } gZ8n[zxf6  
hi^@969  
}; ju~js  
Sxa+"0d6  
void main(void) \4zb9CxOZ  
~ (I'm[  
{ 2|8e7q:+*  
Hx5t![g2K!  
Base * pB = new Derived; // upcast d2Pqi* K  
( E;!.=%  
delete pB; ~H`~&?  
KeFEUHU  
} . Lbu[  
p;$Vw6W=  
输出结果为: ?B7n,!&~  
9x$Kb7'F  
~Derived KsZd.Rf=@  
j+YA/54`  
~Base ,e<(8@BBL  
EFSln*|  
如果析构函数不为虚,那么输出结果为 *uoc;6  
OiAP%7i9  
~Base oP vk ^H  
'@t}8J  
2B Dz \  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 0Rgo#`7l  
='"DUQH|*  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五