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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 Fv %@k{  
SG\ /m'F  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 G<<; a  
Q(yg bT  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 !^98o:"x  
;}U]^LT=  
8J$1N*J|  
二、头文件的作用 :{Z%dD  
Y%eW6Y#  
加强安全检测 v@yqTZ  
c!wRq4  
通过头文件可能方便地调用库功能,而不必关心其实现方式 dJnKa]X  
~aQR_S  
C6a-  
三、* , &修饰符的位置 85[ 7lO)[  
|zP~/  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 \#w8~+`Gq  
c7@/<*E+  
kv2o.q  
四、if语句 {fl[BX]kZ  
\I4Uj.'> \  
不要将布尔变量与任何值进行比较,那会很容易出错的。 W?E,"z  
g4Dck4^!4  
整形变量必须要有类型相同的值进行比较 2W_[|.;'  
ONcLhwH  
浮点变量最好少比点,就算要比也要有值进行限制 _eBNbO_J  
JLoE)\Mi  
指针变量要和NULL进行比较,不要和布尔型和整形比较 R[v<mo[s  
L&:A59)1k  
0Qvr g+  
五、const和#define的比较 DO*6gzW  
^ /%Y]d$  
const有数据类型,#define没有数据类型 Op~:z<z  
7]5~ml3:  
个别编译器中const可以进行调试,#define不可以进行调试 w%)RX<h dI  
PyHL`PZZ  
在类中定义常量有两种方式 V/"RCqY4  
;Wk3>\nT-  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; +,ar`:x&a  
H\<0{#F  
2、 用枚举代替const常量。 C\BKdx5;  
yY49JZ  
h;r^9g  
六、C++函数中值的传递方式 G,Eh8 HboK  
&Fuk+Cu{  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) Zj ` ;IYFG  
f B]2"(  
void fun(char c) //pass by value OiZ-y7;k^  
'@#(jY0_  
void fun(char *str) //pass by pointer V3VTbgF  
|r;>2b/ x  
void fun(char &str) //pass by reference e<`?$tZ3   
>Jn`RsuV  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 lnjs{`^  
"10\y{`v^  
函数的类型不能省略,就算没有也要加个void )AdwA+-x  
UCj+V@{  
sIaehe'B  
七、函数体中的指针或引用常量不能被返回 m3P7*S5NJ7  
,f,+)C$  
Char *func(void) IV':sNV  
~.U \Y  
{ hH;i_("i(h  
f]?&R c2C  
char str[]=”Hello Word”; 06.8m;{N  
w^nA/=;r  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 `VGw5o  
z%+rI  
return str; [U^Cz{G  
 g;AW  
} d*k5h<jM  
Rb:?%\=  
函数体内的指针变量并不会随着函数的消亡而自动释放 z+wegF  
c>/7E-T  
'3Fb[md54  
八、一个内存拷贝函数的实现体 N:+EGmp  
tIod=a)  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) Zj ^e8u=T  
\j wxW6>  
{ p*YV*Arv  
7MJ\*+T|03  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Ujvm|ml  
:cXN Fu\C  
byte *pbTo=(byte*)pvTo; //防止地址被改变 MuzQ z.C  
*x p_#  
byte *pbFrom=(byte*)pvFrom; D[6sy`5l  
".#h$  
while (size-- >0) ~Cynw(  
e F}KOOfC  
pbTo++ = pbForm++; Y@MxKKuj  
UM21Cfqex  
return pvTo; kqo4 v;r  
z/QYy)_j  
} i7YUyU  
OR|Jc+LT  
bi@'m?XwJ  
九、内存的分配方式 -T+'3</T  
Nqd9)WQ  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 +`B^D  
0xCe6{86  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 DOkuT/+  
v6L]3O1  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 w6mYLK%  
ZzR0k  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 y[S9b (:+  
yqtHlz%  
? }`mQ<~  
十、内存分配的注意事项 ==%5Ci7qMy  
e8(Qx3T?b  
用new或malloc分配内存时,必须要对此指针赋初值。 j*f\Z!EeZ  
uXUuA/O5-  
用delete 或free释放内存后,必须要将指针指向NULL u%"5<ll  
;Kg7}4`I  
不能修改指向常量的指针数据 D97 vfC  
>X"\+7bw  
hPgYKa8u  
十一、内容复制与比较 pSYEC,0B  
SsfC m C  
//数组…… CMv8n@ry  
D ZH2U+K  
char a[]=”Hello Word!”; Hm|N {  
P39oHW  
char b[10]; ~P~q'  
 OmfHr lA  
strcpy(b,a); S-7C'dc  
pbWjTI$  
if (strcmp(a,b)==0) c_.Fe'E  
 i?eVi  
{} %hH> %  
$ZB`4!JxG  
//指针…… W* v3B.  
A>FWvlLw'm  
char a[]=”Hello Word!”; N Mx:Jh-YN  
NB.'>Sar  
char *p; #67 7,dn  
;7H^;+P  
p=new char[strlen(a)+1]; +/M%%:>mY  
@*=5a (#  
strcpy(p,a); jPx}-_jM  
{L.uLr_?e  
if (strcmp(p,a)==0) _nX8f &  
-m ;n}ECg  
{} 08%Bx~88_%  
K,U8vc  
37jrWe6xwp  
十二、sizeof的问题 44YKS>Cq  
#ZnNJ\6  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 7i#/eRui  
?FR-a Xx  
char a[]=”Hello World!” +.|RH  
S9%,{y  
char *p=a; .EH1;/  
I6@"y0I  
count<<sizeof(a)<<end; //12字节 [U"/A1p  
JB.U&  
count<<sizeof(p)<<endl; //4字节 uq54+zC  
]0|A\bE\S  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 1_Av_X  
t&EY$'c  
void fun(char a[1000]) N qz6_!  
0bIgOLP  
{ n:k4t  
+#<Z/  
count<<sizeof(a)<<endl; //输出4而不是1000 M1*bT@ 6  
H?xY S| n  
} QH,(iX6RY  
M#m;jJqON  
N0NFgW;  
十三、关于指针 YB2gxZ  
%so{'rQl  
1、 指针创建时必须被初始化 Qj(ppep\U"  
G\V*j$}!  
2、 指针在free 或delete后必须置为NULL r}D#(G$  
Jo~fri([%Q  
3、 指针的长度都为4字节 0!$y]Gr  
yq^Ma  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 n%4/@M  
(-&d0a9N  
char *p=new char[100]; +PKsiUJ|  
Y}<%~z#.4  
strcpy(p,”Hello World”); YV@efPy}n  
B##X94aTT  
delete []p; //注意前面的[]号 GCfVH?Vx  
R-1MD  
p=NULL; mF jM6pmo  
#reW)P>  
5、数组指针的内容不能超过数组指针的最大容易。 IvI..#EzG  
6h %rt]g  
如: WBm)Q#1:  
ae]6F_Qtc*  
char *p=new char[5]; d~{$,"!-f  
1)z Xv  
strcpy(p,”Hello World”); //报错 目标容易不够大 Q {BA`Q@V  
;/JXn  
delete []p; //注意前面的[]号 MOnTp8   
mo(>SnS<  
p=NULL; K' <[kh:cl  
_5x]BH6f  
Ud e?[6  
十四、关于malloc/free 和new /delete Y~UAE.  
CXyb8z4/+  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 +"=ydF.9  
A=p'`]Yld  
l 注意:malloc/free是库函数,new/delete是运算符 oVPr`]  
4neO$^i8J  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Ek6 g?rj_  
c/v|e&q  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 xk7Dx}  
*kYGXT,f]  
l 两者都必须要成对使用 N#t`ZC&m'  
c$tX3ug6I  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 :XG~AR /  
>V)"TZH  
gw[Eu>I  
十五、C++的特性 !@N?0@$/  
uN>5Eh&=Pf  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 h8(>$A-  
Q>rr?L`  
重载和内联:即可用于全局函数,也可用于类的成员函数; cY kb3(  
>!a- "  
Const和Virtual:只可用于类的成员函数; rPGj+wL5-  
/@\R  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 BzO,(bd!PI  
N@}h  
覆盖是指派生类函数覆盖基类函数 ?2dI8bG  
YhS_ ,3E  
函数名相同; c< MF:|(}  
=+ >>l0=_v  
参数相同; @h!Z0}d X(  
,c{ckm  
基类函数必须有Virtual关键字; i.`n^R;N  
150-'Q  
不同的范围(派生类和基类)。 N fG9a~  
~T-uk  
隐藏是指派生类屏蔽了基类的同名函数相同 ar}-~~h 5  
>8=lX`9f{  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 -57~7 <N  
9:-7.^`P  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 }f?[m&<  
E]GbLU;TH  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 A~<!@`NjB  
[(5.?  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 `&OX|mL^w  
} e+`Kxy  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 0`-b57lF&  
DZnqCu"J  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: _ezRE"F5  
Y|Gp\  
将void Func(A a) 改为void Func(const A &a)。 Vd  d  
HK~SD:d  
而void func(int a)就没必要改成void func(const int &a); W{tZX^|  
u;c WIRG  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 9q_{_%G%  
=W:=}ODD  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 ?6`B;_m  
kROIVO1|`  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; mTxqcQc:7  
s8>y&b.  
$D!/v)3  
十六、extern“C”有什么作用? 2b^Fz0 w4  
rqqd} kA  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 &0-oi Y  
liH#=C8l*%  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 'Kbrz  
wL="p) TO.  
t&J A1|q  
十七、构造函数与析构函数 seBmhe5qR  
>Bf3X&uS  
派生类的构造函数应在初始化表里调用基类的构造函数; $/ IFSB9  
+,LWyvc'  
派生类和基类的析构函数应加Virtual关键字。 4_ U"M@  
dgoAaS2M  
不要小看构造函数和析构函数,其实编起来还是不容易。 OoH-E.lp  
W.jXO"pN  
#include <iostream.h> .O5V;&,  
m:[I$b6AY  
class Base p^<(.+P4  
AguE)I&m  
{  R#^ku)0  
TEd 5&Z  
public: BO G.[?yx  
_avf%OS  
virtual ~Base() { cout<< "~Base" << endl ; } |. 0~'  
_O uNX.yrG  
}; M.- {->  
?dCwo;~  
class Derived : public Base 4dPTrBQ?  
d9;&Y?fp  
{ &|#[.ti1  
B#jnM~fJz  
public: nv@z;#&  
|`#fX(=  
virtual ~Derived() { cout<< "~Derived" << endl ; } E(|A"=\  
# 5)/B  
}; v>B412l  
I@/ G#3Zr  
void main(void) A`f"<W-m  
8TeOh 1\  
{ ,mp<<%{u  
/[FDiJH2  
Base * pB = new Derived; // upcast QDQ"Sc06  
*kFd#b+xB  
delete pB; aPEI_P+Ls  
J~]@#=,v  
} ?1JY6v]h4  
^?+[yvq  
输出结果为: P{6$".kIY  
jL"V0M]c  
~Derived '!7>*<  
'%[ Y  
~Base >aO.a[AM  
 c2M  
如果析构函数不为虚,那么输出结果为 {&IB[Y6  
;98b SR/  
~Base 7UMZs7L$  
0HoHu*+FX  
aM;SE9/U  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 Y_:jc{?  
b3E1S+\=~  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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