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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 R\3VB NX.g  
5Qwh(C^H  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 xgu `Q`~  
cf_|nL#9  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 x3+oAb@o/  
I?#85l{>  
9p* gU[  
二、头文件的作用 YIhm$A"z0"  
+EXJ\wy  
加强安全检测 Y*oDO$6  
,8'>R@o  
通过头文件可能方便地调用库功能,而不必关心其实现方式 @D^^_1~  
=<@2#E)  
! |waK~jK  
三、* , &修饰符的位置 ?4H#G)F  
rf:XRJ <4  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 VXBY8;+Yp  
pO  Iq%0]  
eDI= nSo  
四、if语句 8LkP)]4^sO  
q<W=#Sx  
不要将布尔变量与任何值进行比较,那会很容易出错的。 W<ZK,kv  
^>x|z.  
整形变量必须要有类型相同的值进行比较 6DIZ@oi  
g6t"mkMY L  
浮点变量最好少比点,就算要比也要有值进行限制 -/C)l)V}  
T  VmH  
指针变量要和NULL进行比较,不要和布尔型和整形比较 ^[E' 1$D  
lT&wOm3  
L WoG4s?w  
五、const和#define的比较 S{]7C?4`  
u9woEe?  
const有数据类型,#define没有数据类型 Jq.lT(E8D  
$3T_ .  
个别编译器中const可以进行调试,#define不可以进行调试 620%Z*   
IzOYduJ.  
在类中定义常量有两种方式 &GTI  
3f Xv4R;!:  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; Am0{8 '  
>Hb^P)3  
2、 用枚举代替const常量。 KOq;jH{$  
l ASL8O&\  
n]_[NR) i  
六、C++函数中值的传递方式 rPNb\Ri  
63|+2-E2Q  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) O%~jop7# 6  
_mvxsG  
void fun(char c) //pass by value -~[9U,  
Jf)bHjC_V  
void fun(char *str) //pass by pointer JCcZuwu[  
 9fnA  
void fun(char &str) //pass by reference YYEJph@06q  
%=AxJp!a  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 zJDSbsc$%  
>7`<!YJkK  
函数的类型不能省略,就算没有也要加个void =o}"jVE  
nMfFH[I4  
/v|"0  
七、函数体中的指针或引用常量不能被返回 UUKP"  
iB0WEj[?  
Char *func(void) ,r^M?>  
r"2V  
{ 5AS[\CB4  
Qp"y?S  
char str[]=”Hello Word”; TC~Q G$NW  
ne61}F"E  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 87)zCq  
(6CN/A{qe  
return str; n,HE0Zn]Y_  
,/&'m13b/L  
} l.\re"Q  
(bOpV>\Q7  
函数体内的指针变量并不会随着函数的消亡而自动释放 Tu{&v'!j6  
f'Iz G.R  
o*x*jn:hm  
八、一个内存拷贝函数的实现体 p(xC*KWB  
^,F;M`[  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 6$a$K,dZ  
b `2|I {  
{ c^rOImZ  
tt?58dm|  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); -7/s]9o'  
O1 .w,U  
byte *pbTo=(byte*)pvTo; //防止地址被改变 <^b7cOFQ  
G2LK]  
byte *pbFrom=(byte*)pvFrom; <H1 `  
n,eJ$2!J  
while (size-- >0) scuHmY0  
, P'P^0qJ  
pbTo++ = pbForm++; >&g}7d%  
'}g*!jL  
return pvTo; QIN."&qC^  
ri`R<l8  
} $@d9<83=  
wiaX&-c]8  
IM$2VlC  
九、内存的分配方式 <2!v(EkI  
k4qp u=@U  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 e__@GBG  
Ftw;Yz  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 l$K,#P<)  
 $Y=T&O  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 :+{ ?  
-U<Upn)2  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 ZT02"3F  
1:NrP'W^  
"G-1>:   
十、内存分配的注意事项 aK,z}l(N  
c`lJu_  
用new或malloc分配内存时,必须要对此指针赋初值。 48|s$K^  
t E` cau  
用delete 或free释放内存后,必须要将指针指向NULL :Ih|en^w  
N=:5eAza  
不能修改指向常量的指针数据 0JgL2ayIVI  
`28};B>  
%}86D[PF  
十一、内容复制与比较 G*S|KH  
B!gGK|8  
//数组…… DjU9 uZT  
SVjl~U-^  
char a[]=”Hello Word!”; ,+qVu,  
22kpl)vbU  
char b[10]; WwC 5!kZ  
2([2Pb3<"  
strcpy(b,a); w;Q;[:y  
cPgfTT  
if (strcmp(a,b)==0) 2&+#Vsm`V  
J--m[X  
{} T081G`li  
MYBx&]!\  
//指针…… yCJFo  
st"{M\.p  
char a[]=”Hello Word!”; mzQ`N}]T:  
b}T6v  
char *p; 8 #ndFpu  
Tirux ;  
p=new char[strlen(a)+1]; Xh J,"=E+  
Rwr 2gMt7  
strcpy(p,a); H Te<x  
kc/{[ME  
if (strcmp(p,a)==0) =9kN_:-  
ZEYgK)^  
{} |F.)zC5{  
7?B.0>$3>V  
,!V]jP)  
十二、sizeof的问题 @&D?e:|!U  
 g PAX4'  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 {;2vmx9  
s >0Nr  
char a[]=”Hello World!” [D5t{[i  
9%* wb`&  
char *p=a; >3awn*N  
:'aAZegQY  
count<<sizeof(a)<<end; //12字节 3E f1bhi  
0y&I/2  
count<<sizeof(p)<<endl; //4字节 {lth+{&L#  
`mye}L2I  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 64-#}3zL  
xEuN   
void fun(char a[1000]) _"4xKh)  
GE>[*zN  
{ 9Pw0m=4  
D>Gt]s  
count<<sizeof(a)<<endl; //输出4而不是1000 !v]b(z`Y  
AmwWH7,g  
} 4tSv{B/}  
.I}:m%zv  
%4 \OPw&  
十三、关于指针 9WJz~SP+vR  
fYE(n8W3  
1、 指针创建时必须被初始化 /6O??6g  
+GsWTEz   
2、 指针在free 或delete后必须置为NULL 9Lh|DK,nV/  
Le"oAA#[  
3、 指针的长度都为4字节 dD<fn9t  
TO2c"7td  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 Mg#j3W}]  
2MA]jT  
char *p=new char[100]; #_mi `7!B#  
DF6c|  
strcpy(p,”Hello World”); DO7W}WU  
~OePp a\  
delete []p; //注意前面的[]号 u*  
8A{_GH{:  
p=NULL; , @m@S ^  
A`{y9@h(  
5、数组指针的内容不能超过数组指针的最大容易。 >;z<j$;F<  
S osj$9E  
如: 1b8p~-LsU  
4@.|_zY  
char *p=new char[5]; %3HVFhl  
iTW? W\d  
strcpy(p,”Hello World”); //报错 目标容易不够大 Bx[rC  
%p&k5:4<"#  
delete []p; //注意前面的[]号  Av0y?oGH  
~j#~ \Ir  
p=NULL; V|)>{Xdn  
(;. AS  
 -C#PQV  
十四、关于malloc/free 和new /delete n;R#,!<P  
`si#aU  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 Oi"a:bCU  
7FN<iI&7\  
l 注意:malloc/free是库函数,new/delete是运算符 W4;m H}#0  
gn5)SP8  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 K;7f?52  
k`".  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 nN$Y(2ZN  
8Ry74|`=R  
l 两者都必须要成对使用 Ax oD8|  
g~UUP4<$"  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 e6=]m#O9  
 ]*O/+  
+l^LlqA  
十五、C++的特性 5-)#f?  
*/ G<!W  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 |}){}or  
UN"(5a8.  
重载和内联:即可用于全局函数,也可用于类的成员函数; s<x1>Q7X~  
|%~+2m  
Const和Virtual:只可用于类的成员函数; QrApxiw  
(h']a!  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 IPuA#C  
6)pH |d.FR  
覆盖是指派生类函数覆盖基类函数 w@2Vts  
lCW8<g^  
函数名相同; ~}Z\:#U  
z9W`FBg  
参数相同; (BX83)  
5q@LxDy,b  
基类函数必须有Virtual关键字; dk8wIa"K`  
`ovtHl3Q  
不同的范围(派生类和基类)。 UEak^Mm;=2  
4Ij-Ilg)%  
隐藏是指派生类屏蔽了基类的同名函数相同 <"o"z2  
hO{cvHy`  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 _wb0'xoK"  
93[DAs  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 k {-  
k\Q ,h75  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 >]'yK!a?  
9*6]&:fm  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ,? E&V_5  
9>/wUQs!]  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 HG/p$L*  
=TR,~8Z|  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: w",? Bef  
G ;?qWB,  
将void Func(A a) 改为void Func(const A &a)。 Ou'?]{  
l0*Gb  
而void func(int a)就没必要改成void func(const int &a); 3CTX -#)vS  
? _\$  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 (3\Xy   
7dihVvL $  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 QbhW!9(,  
Hy{ Q#fq  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; $]aBe !  
[fu!AIQs  
3#wcKv%>&_  
十六、extern“C”有什么作用? A5#y?Aq  
v"+k~:t*  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 ]L2Oz  
2EQ 6J  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 0;sRJ  
8GJdRL(  
a )*6gf<5  
十七、构造函数与析构函数 3*DXE9gA9  
^GN8V-X4y  
派生类的构造函数应在初始化表里调用基类的构造函数; QbYc[8-[  
Kr  L>FI  
派生类和基类的析构函数应加Virtual关键字。 x4Rk<Th"o  
\(I6_a_{  
不要小看构造函数和析构函数,其实编起来还是不容易。 Z.Rb~n&  
G@S&1=nj3  
#include <iostream.h> ~;-9X|  
us?&:L|!=  
class Base %IL6ix  
kfC0zd+  
{ B68H&h]D#'  
4{9d#[KW  
public: x@P{l&:>  
6FfOH<\z6i  
virtual ~Base() { cout<< "~Base" << endl ; } }:iBx  
b|^I<7  
}; ^ L:cjY/  
zH)_vW  
class Derived : public Base lQPqcZd  
4C~UcGMv\  
{ (k-YI{D3  
jm>3bd  
public: BpAB5=M0  
B7Ntk MK  
virtual ~Derived() { cout<< "~Derived" << endl ; } Z\X'd_1!  
qZ2&Xw.{1  
}; Bt^K]F\  
~>ME'D~  
void main(void) ?4PQQd  
{I%y;Aab8  
{ _X5_ez^/=  
.R 44$F  
Base * pB = new Derived; // upcast 5''*UFIF1  
{}e^eJ  
delete pB; Y{Ap80'\6  
QHf$f@bjI  
} /<)-q-W;  
n1(?|aJ#1  
输出结果为: }4jC_ZAupt  
ty1fcdFZM  
~Derived #S QXTR  
5#:pT  
~Base 1r`i]1<H  
 SVP:D3)  
如果析构函数不为虚,那么输出结果为 ru.5fQ U  
74vmt<Q  
~Base NlR"$  
' |K.k6  
GA^mgm"O  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 y<r}"TAf-  
Uku5wPS  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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