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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 RW 7oL:$dt  
$a^isd4  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 B#aH\$_U  
h_~|O [5|)  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 -(w~LT$ "  
zw: C*sY  
z"K( bw6  
二、头文件的作用 b%;59^4AjD  
JYd7@Msfc  
加强安全检测 b;L>%;  
}E5#X R  
通过头文件可能方便地调用库功能,而不必关心其实现方式 ay(!H~q_U  
)E:,V~< 8  
Iz )hz9k  
三、* , &修饰符的位置 P/pjy  
y5/6nvH_6  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 6!B^xm.R@  
(kC} ,}  
tQ~<i %;  
四、if语句 ~g1, !Wl  
X B*}P  
不要将布尔变量与任何值进行比较,那会很容易出错的。 m*!f%}T  
4C1FPrh  
整形变量必须要有类型相同的值进行比较 k=7Gr;;l=p  
C,r`I/;  
浮点变量最好少比点,就算要比也要有值进行限制 h4anr7g{  
:B=8_M  
指针变量要和NULL进行比较,不要和布尔型和整形比较 NGD*ce"w  
Q0cY/'>4  
x48'1&m  
五、const和#define的比较 7B(bH8  
`4%;qLxngP  
const有数据类型,#define没有数据类型 5_)@B]~nM  
h.V]fS  
个别编译器中const可以进行调试,#define不可以进行调试 YN@6}B#1  
NLQE"\#a  
在类中定义常量有两种方式 'e]HP-Y<  
@ EmGexLPM  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; G*\abL  
ZCQ< %f  
2、 用枚举代替const常量。 90s;/y(  
T|@#w%c''  
Cqgk  
六、C++函数中值的传递方式 %f(S'<DhC  
JzMZB"Z?  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) pDq#8*q+v  
#9`rXEz  
void fun(char c) //pass by value YZGS-+  
w(/DTQc~d  
void fun(char *str) //pass by pointer -@2'I++"@  
A)Qh  
void fun(char &str) //pass by reference Kej|1g1f  
1TNz&=e  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 tqf&N0*  
0||"r&:X  
函数的类型不能省略,就算没有也要加个void d=XpO*v,[  
dC` tN5  
_1sMYhI  
七、函数体中的指针或引用常量不能被返回 L)F1NuR  
]4Y/xi-  
Char *func(void) !:"-:O}>=,  
SY,I >-%  
{ yI8m%g%  
o\ngR\>  
char str[]=”Hello Word”; xQJIM.  
VLsh=v   
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 XDk'2ycv  
H&X:!xa5  
return str; ATXF,o1  
F>dwLbnb  
} :N@U[Wx0A  
%bP~wl~  
函数体内的指针变量并不会随着函数的消亡而自动释放 `c"4PU^  
Yb[n{.%/g  
d/{Q t  
八、一个内存拷贝函数的实现体 53 @oP  
(*,8KLV_i  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 7DtIVMiK  
<%z@  
{ -Z%F mv8  
u7;`4P:o@  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 99e*]')A%  
XFW5AP  
byte *pbTo=(byte*)pvTo; //防止地址被改变 HU &)  
HG2GZ}~^1  
byte *pbFrom=(byte*)pvFrom; [yw%ih)  
i&`!|X-=R  
while (size-- >0) fVe@YqNa  
AnNP Ti  
pbTo++ = pbForm++; Y4#y34 We  
&<au/^F  
return pvTo; 9ilM@SR  
)Zas x6`  
} vsKl#R B  
.H8mRvd?  
%}C9  
九、内存的分配方式 &1wpGJqm  
qZaO&"q  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 Xv0F:1  
D?e"U_  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 +W9]ED  
%3M95UZ2  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 TPHYz>D]  
 tPA:_  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 '61i2\[lZQ  
91u p^   
x;u~NKy  
十、内存分配的注意事项 4O!E|/`wO  
F>N+<Z  
用new或malloc分配内存时,必须要对此指针赋初值。 @,k7xm$u  
nfX12y_SXL  
用delete 或free释放内存后,必须要将指针指向NULL 2"@Ft()]  
/D[dO6.  
不能修改指向常量的指针数据 Y0@yD#,0~  
6xarYh(  
)1f+ld%R  
十一、内容复制与比较 o/cr{>"N  
nq' M?c#E  
//数组…… R:A'&;S  
I!0JG`&  
char a[]=”Hello Word!”; $jG4pPG  
b3\B8:XFo|  
char b[10]; xP{-19s1]  
!h CS#'  
strcpy(b,a); UfR~%p>K  
Cxm6TO`-;  
if (strcmp(a,b)==0) xuU x4,Z  
S[mM4et|  
{} vZ@g@zB4o0  
|3;(~a)%  
//指针…… p<KIF>rf|  
=_ y\Y@J  
char a[]=”Hello Word!”; /b#q*x-b  
zDDK  
char *p; P16YS8$  
)~V }oKk0t  
p=new char[strlen(a)+1]; 5Z{_m;I.   
4T`&Sl  
strcpy(p,a); B'}"AC"  
+8AvTSgX%  
if (strcmp(p,a)==0) *Y%Jl o  
n'K6vW3  
{} FLZSK:3B]  
=&7@<vBpy  
=i>\2J%'R  
十二、sizeof的问题 _s+c+]bO  
;cKH1  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ;W{b $k@g  
MzzKJ;wbC6  
char a[]=”Hello World!” ^e%}[q[>|  
A W HU'  
char *p=a; r`6:Q&&  
5& !'^!  
count<<sizeof(a)<<end; //12字节 h^oH^moq<  
AW~"yI<  
count<<sizeof(p)<<endl; //4字节 sDC*J \X  
eA=WGy@IcN  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 `~h4D(n`  
#`ls)-`7  
void fun(char a[1000]) _KN/@(+F  
{.CMD9F[  
{ Ei5wel6!  
i#W*'   
count<<sizeof(a)<<endl; //输出4而不是1000  s;Y<BD  
MBw-*K'?zB  
} CPv iR<ms_  
NTmi 2c  
WUEHB  
十三、关于指针 dMvp&M\\'  
nY_?Jq  
1、 指针创建时必须被初始化 VWi2(@R^  
!tNd\ }@  
2、 指针在free 或delete后必须置为NULL T3N"CUk  
ONX8}Ob~  
3、 指针的长度都为4字节 +e P.s_t  
por/^=e{Y  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 qX#MV>1  
9+qOP>m   
char *p=new char[100]; ,9of(T(~  
:243H  
strcpy(p,”Hello World”); ~R]35Cp-#  
gfy19c 9  
delete []p; //注意前面的[]号 Z4hLdHo_  
vl:J40Kfn  
p=NULL; s8<gK.atl  
4w$_ ]ke  
5、数组指针的内容不能超过数组指针的最大容易。 (\,BxvhG=  
osH Cg  
如: 9}P"^N  
Gy"%R-j7  
char *p=new char[5]; U BZ9A  
>#(n"RCHf  
strcpy(p,”Hello World”); //报错 目标容易不够大  !HK^AwNY  
u[oUCTY  
delete []p; //注意前面的[]号 h#qN+qt}  
OqUr9?+  
p=NULL; Bv9kSu9'~  
F{m{d?:OA  
1|| +6bRP  
十四、关于malloc/free 和new /delete z[nS$]u  
0g=`DSC<(  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 E167=BD9<  
e3[:D5  
l 注意:malloc/free是库函数,new/delete是运算符 T~xwo  
3 hKBc0  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 }< 5F  
C~4PE>YtTv  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 %.HJK  
zsXpA0~3s  
l 两者都必须要成对使用 ..W-76{  
Sq2P-y!w  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 -db75=  
\3XqHf3|o  
> m q,}!n  
十五、C++的特性 m D58T2 Z  
jd-glE,Y/  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 K^[#]+nQ  
{+.r5py  
重载和内联:即可用于全局函数,也可用于类的成员函数; |L6&Gf]#5  
S:bC[}  
Const和Virtual:只可用于类的成员函数; aelO3'UN  
_5Bcwa/  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 &^".2)zU  
O;9?(:_  
覆盖是指派生类函数覆盖基类函数 ExBUpDQc  
8wZf ]_  
函数名相同; PWr(*ZP>hI  
=8{WZCW5  
参数相同; +A8j@d#:  
MGpt}|t-  
基类函数必须有Virtual关键字; _BM4>r?\  
f3MRD4+-  
不同的范围(派生类和基类)。 &&> tf%[  
0(TTw(;  
隐藏是指派生类屏蔽了基类的同名函数相同 RFaSwf,5n  
Cby;?F6w  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 B%s7bS  
s1N?/>lmB  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 t= #&fSR  
=EP13J  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 K=::)/{P  
6xK[34~ 6  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 <Zb/  
H}}$V7]^),  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 *e>]~Z,  
7[#yu2  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: A^\.Z4=d"  
4u;9J*r4  
将void Func(A a) 改为void Func(const A &a)。 */qtzt  
YIRZ+H<Q  
而void func(int a)就没必要改成void func(const int &a); (N-RIk73/O  
=uHnRY  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 }yn0IWVa  
2}6%qgnT-  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 l|2D/K5  
V9yl4q-bL  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; s ^Nw%KAv  
\Q?ip&R  
rqPo)AL  
十六、extern“C”有什么作用? d*8 $>GA  
@$^bMIj@W  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 DTRJ/ @t  
o G*5f  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 G3P &{.v  
6fo3:P*O  
K)tQ]P  
十七、构造函数与析构函数 /*FH:T<V  
uA t V".  
派生类的构造函数应在初始化表里调用基类的构造函数; d[^KL;b?6  
z4%uN |V  
派生类和基类的析构函数应加Virtual关键字。 t_z>Cl^u  
C*=Xk/0  
不要小看构造函数和析构函数,其实编起来还是不容易。 _9 .(a  
r|Z3$J{^"  
#include <iostream.h> $``1PJoi  
!LMN[3M_  
class Base Dr&('RZ4  
1@48BN8cm'  
{ \*hrW(   
PX: '/{V  
public: Ks^6.)  
Y_&g="`Q  
virtual ~Base() { cout<< "~Base" << endl ; } !l?.5Pm])  
F_iXd/  
}; -&x2&WE'  
1/1Xk,E  
class Derived : public Base 'VyM{:8  
Bs+(L [Z  
{ ok^d@zI  
=uk0@hy9b  
public: NL=|z=q  
C (n+SY^  
virtual ~Derived() { cout<< "~Derived" << endl ; } J?@DGp+t  
O4\Z!R60g  
}; EKEjv|_)  
$EZN1\  
void main(void) _ nA p6i  
k(>h^  
{ {e[%;W%c&  
=!O*/6rz  
Base * pB = new Derived; // upcast /tV/85r  
Y?CCD4"qn  
delete pB; b5$Jf jI  
[yl sz?  
} nkxzk$  
<?-YTY|  
输出结果为: h^,8rd  
4%4avEa"w  
~Derived (fNUj4[  
v 8T$ &-HJ  
~Base 'w>_+jLT  
#/"8F O%~p  
如果析构函数不为虚,那么输出结果为 mpAR7AG6  
W>r#RXmh  
~Base ?]fF3SJk  
2XTPBZNe  
bmNq[}  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 7{e{9QbJ4  
LTNj| u  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八