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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 =nVEdRU  
y cT@ D/  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 $,b1`*  
g1!ek  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 0mt lM(  
UFE# J  
Q1Jw7R#?l  
二、头文件的作用 "b~-`ni  
+'-i(]@!'  
加强安全检测 6dH> 0l  
(+(YQ2  
通过头文件可能方便地调用库功能,而不必关心其实现方式 .eBo:4T!d  
4!vovt{  
4](jV}Hg  
三、* , &修饰符的位置 =&_Y=>rA]0  
A$JL"~R  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 \!51I./Q/  
iBqxz:PHN(  
c"wk_ #  
四、if语句 rtjUHhF  
s%bm1$}  
不要将布尔变量与任何值进行比较,那会很容易出错的。 k<Y}BvAYB  
_?}[7K!~d  
整形变量必须要有类型相同的值进行比较 R!+_mPb=Q*  
:@~Nszlb  
浮点变量最好少比点,就算要比也要有值进行限制 YcRo>:I  
GLBzlZ?  
指针变量要和NULL进行比较,不要和布尔型和整形比较 {uCX F~v  
Eo) #t{{  
> w-fsL  
五、const和#define的比较 'DhH:PR  
'K!u}py  
const有数据类型,#define没有数据类型 gN/kNck  
F.Sc2n@7-  
个别编译器中const可以进行调试,#define不可以进行调试 fb=[gK#*,  
y/.I<5+Bu  
在类中定义常量有两种方式 e{Y8m Xu  
Jan~R ran  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; hZwbYvu  
4[XiD*  *  
2、 用枚举代替const常量。 Fkvf[!Ci  
=Hd+KvA  
>)j`Q1Qc\  
六、C++函数中值的传递方式 rOo |.4w  
up;^,I  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) V* I2  
Pb] EpyAW  
void fun(char c) //pass by value ev4f9Fhu  
)c<X.4  
void fun(char *str) //pass by pointer 3oQ?VP  
NMvNw?]  
void fun(char &str) //pass by reference /8O;Q~a  
UhX)?'J  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 Zk+c9,q  
F*4zC@;  
函数的类型不能省略,就算没有也要加个void NI^jQS M]  
my}l?S[2d@  
,]LsX"u  
七、函数体中的指针或引用常量不能被返回 &y+)xe:&S  
r.ib"W#4  
Char *func(void) 4/N{~  
J=?P`\h  
{ 7L4~yazmK  
F&_b[xso7  
char str[]=”Hello Word”; ]r(&hqdR  
WbwS!F<au  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 V|hr9  
-Q MO*PY  
return str; e ia>Y$  
bjr()NM1  
} 4(%LG)a4S  
3 +WmM4|  
函数体内的指针变量并不会随着函数的消亡而自动释放 dr gCr:Gf  
x:E:~h[.^  
Fzk%eHG=  
八、一个内存拷贝函数的实现体 Koi-b  
Kt`/+k)m  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 2]V&]s8Wi=  
DyCnL@  
{ ?3yrX _Qm{  
vo"?a~kY7  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); )qeed-{  
kKs}E| T  
byte *pbTo=(byte*)pvTo; //防止地址被改变 c\.7Z=D  
lcR1FbJ2'  
byte *pbFrom=(byte*)pvFrom; jmJeu@(  
#/ HQ?3h]  
while (size-- >0) /=[hRn@)A  
6R|^IPOGp  
pbTo++ = pbForm++; 5_[we1$P  
}G ^nK m  
return pvTo; *cy!PF&  
1a tQ9  
} r E&}B5PN=  
2o<aEn&7|e  
W}P9I&3  
九、内存的分配方式 DR(/|?k+  
y4N2gBTKu  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 il[waUfmD  
+lhnc{;WJv  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 /2x@Z>  
y7T<Auue`  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 NI85|*h  
:I(d-,C  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 k9!eu j&  
t8f:?  
sP@7%p>wt  
十、内存分配的注意事项 (2(y9r*1  
%fIYWu`X  
用new或malloc分配内存时,必须要对此指针赋初值。 ` 1v Dp.  
BV)) #D9  
用delete 或free释放内存后,必须要将指针指向NULL 9P&{Xhs7  
&l~9FE *  
不能修改指向常量的指针数据 ;$g?W"  
7_~_$I~g*  
 x-s\0l  
十一、内容复制与比较 T_ga?G<  
>Q2kXwN  
//数组…… 34I;DUdcE  
a49t/  
char a[]=”Hello Word!”;  ay,"MJ2  
3a0% J'  
char b[10]; K6 c[W%Va  
?D+H2[n\a  
strcpy(b,a); _BI[F m  
}=fls=c/0  
if (strcmp(a,b)==0) : U,-v  
UG=],\E2  
{} l9z{pZ\KM  
X }Fqif4A  
//指针…… NL-V",gI-~  
Y'Yu1mH)  
char a[]=”Hello Word!”; ttY[\D&ZS  
&HtG&RvQf  
char *p; /pL'G`  
w3FEX$`_  
p=new char[strlen(a)+1]; D77s3AyHK  
"eIE5h  
strcpy(p,a); TGZr [  
+R',$YzD  
if (strcmp(p,a)==0) v9 8s78  
B=HE i\55K  
{} A2''v3-h8  
59H~qE1Md  
y]}N [l  
十二、sizeof的问题 kC iOcl*$  
<_yy0G  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 vlo!D9zsV3  
yL_ \&v  
char a[]=”Hello World!” t[:G45].-k  
%&!B2z}  
char *p=a; ,VZ<r5NT  
+@dgHDJ  
count<<sizeof(a)<<end; //12字节 w g^'oy  
km29]V=}  
count<<sizeof(p)<<endl; //4字节 k1fX-2H  
CcZM0  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 @c=bH>Oz  
7 b 8pWM  
void fun(char a[1000]) >M7(<V  
SN;_.46k  
{ j/uzsu+  
a*qc  
count<<sizeof(a)<<endl; //输出4而不是1000 87rHW@\](  
QPX3a8w*  
} i2Sh^\Xw  
EMf"rGXu(  
w0 1u~"E  
十三、关于指针 >NZJ-:t  
il7gk<  
1、 指针创建时必须被初始化 LZ8xh  
YJ>P+e\o9  
2、 指针在free 或delete后必须置为NULL %[OZ;q& X  
8u"HW~~=  
3、 指针的长度都为4字节 OBf$0  
FSb4RuD9  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 6SEq 2   
$1n\jN  
char *p=new char[100]; $*C'{&2  
8aI^vP"7`=  
strcpy(p,”Hello World”); -Xt0=3,  
^-,@D+eW  
delete []p; //注意前面的[]号 .50ql[En  
 AtP!.p"j  
p=NULL; YXIAVSnr  
-o+; e3#  
5、数组指针的内容不能超过数组指针的最大容易。 =QhK|C!$A  
vAzSpiv-  
如: (/C 8\}Ox  
AQ)J|i  
char *p=new char[5]; #0c;2}D  
' BY|7j~  
strcpy(p,”Hello World”); //报错 目标容易不够大 Tua#~.3}J  
}Io5&ww:U  
delete []p; //注意前面的[]号 Is>~P*2Y=  
U,V+qnS  
p=NULL; ;rC< C  
$ spk.j  
i}v3MO\X  
十四、关于malloc/free 和new /delete _CG ED{b@  
w~>tpkUB  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 c"pu"t@/Z  
%18%T{|$e  
l 注意:malloc/free是库函数,new/delete是运算符 Z<`:xFy(  
cQq78Lo  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 ._6e#=  
7%5EBH &  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 9lB$i2G>Zw  
;]_h")4"c  
l 两者都必须要成对使用 U4h5K}j4  
z)%]# QO  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 lMe+.P|  
S^nI=HTm  
>~})O&t  
十五、C++的特性 &e99P{\D  
!rff/0/x"  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 40%<E  
c.}#.-b8  
重载和内联:即可用于全局函数,也可用于类的成员函数; z7R2viR[  
"X\6tl7a|  
Const和Virtual:只可用于类的成员函数; H4uHCkj  
fy={  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 FBS]U$1  
9/dADJe0b  
覆盖是指派生类函数覆盖基类函数 QFIYnxY9  
6b\JD.r*{  
函数名相同; 4oN*J +"=+  
:i* =s}cv  
参数相同; ;-8]  
$tDM U3,W  
基类函数必须有Virtual关键字; yw*| HT  
Y/y`c-VO  
不同的范围(派生类和基类)。 KB8_yo{y  
yo :63CPP  
隐藏是指派生类屏蔽了基类的同名函数相同 F-GH?sfvi  
cN~F32<  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 ?fQ8Ff  
hSG1f`  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 o`{^ptu1q  
apWv+A  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 v>sjS3  
O#Ho08*Xn  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 8B3C[?  
@# GS4I  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 8Od7e`  
U;LX"'}  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: x2tcr+o  
:\~YbA  
将void Func(A a) 改为void Func(const A &a)。 8BX9JoDi  
vo^2k13  
而void func(int a)就没必要改成void func(const int &a); K?*p|&Fi?8  
g:Ry.=F7W  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 4f'!,Q ;  
YtA<4XHU  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 c6tH'oV  
K/z2.Npn  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 8JU{]Z!G<;  
[vOk=  
:]9CdkaU  
十六、extern“C”有什么作用? .-GC,&RO  
S>y}|MG  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 iO7s zi  
CRu {Ie5B  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 %:\GYs(Y  
A}_0iwG  
VbX$\Cs:  
十七、构造函数与析构函数 ;Hn>Ew  
QI`&N(n  
派生类的构造函数应在初始化表里调用基类的构造函数; uLrZl0%HT~  
d^I:{Ii'  
派生类和基类的析构函数应加Virtual关键字。 c=33O,_  
Z5,"KhB]  
不要小看构造函数和析构函数,其实编起来还是不容易。 JdX!#\O  
x]vyt}oCmk  
#include <iostream.h> Q$A;Fk}-  
.7> g8  
class Base k\A4sj  
jfpbD /  
{ E6#")2C~  
lfqsoIn;  
public: /~pB_l  
C;oO=R3r  
virtual ~Base() { cout<< "~Base" << endl ; } e(vnnv?R{  
yZ,S$tSR  
}; CgKFI  
*kt%.wPJ  
class Derived : public Base fr8hT(,s)  
T*92o:^  
{ O}X@QG2_  
cpM]APF-  
public: aMaqlqf  
xmHW,#%ui\  
virtual ~Derived() { cout<< "~Derived" << endl ; } ,soXX_Y>  
OZ}o||/Rc  
}; p+16*f9,^  
BQ(sjJ$v6F  
void main(void) }ni@]k#q<  
LX m@h  
{ /l;_ xs  
1l\. >H\E  
Base * pB = new Derived; // upcast TmEh$M  
7x.] 9J  
delete pB; $LOf2kn  
6k;>:[p  
} '%*/iH6<U{  
/~P4<1  
输出结果为: =m U</F)  
fnK H<  
~Derived wN:vI(C  
"MgTfUIiyD  
~Base  !qTP  
)npvy>C'(  
如果析构函数不为虚,那么输出结果为 "O8iO!:  
9XX:_9|I  
~Base '3TfW61]  
IY}{1[<N  
_vUId?9@+e  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 DiSU\?N2'  
|j}%"wOh  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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