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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 w;f$oT  
9,8}4Y=GVI  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 rBR,lS$4  
/sHWJ?`&/,  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 )w\E^  
VE3,k'^v  
hS(}<B{x!  
二、头文件的作用 +*/XfPlr|  
1C) l) pV  
加强安全检测 U 8Rko)  
i`#5dIb   
通过头文件可能方便地调用库功能,而不必关心其实现方式  5`];[M9  
lU6?p")F1  
Wc] L43u  
三、* , &修饰符的位置  n *Y+y  
yKSvg5lLy  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 +JQ/DNv  
<i}lP/U  
Y [8~M8QX  
四、if语句 Ej |rf Y  
dk}T&qZ~p  
不要将布尔变量与任何值进行比较,那会很容易出错的。 v(PwE B]  
L#)F00/`  
整形变量必须要有类型相同的值进行比较 .8[Uk^q  
'L$%)`;e  
浮点变量最好少比点,就算要比也要有值进行限制 c*iZ6j"iI  
eAvOT$  
指针变量要和NULL进行比较,不要和布尔型和整形比较 C9+`sFau@  
)<Cf,R  
eRV4XB:  
五、const和#define的比较 J QSp2b@'H  
aB@D-Y"HO  
const有数据类型,#define没有数据类型 k;aV4 0N9  
aE]/w1a  
个别编译器中const可以进行调试,#define不可以进行调试 !2]eVO  
A^\A^$|O6  
在类中定义常量有两种方式 PDwi])6mf  
kY e3A &J  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 3 *0/<1f1!  
8cN[t.S  
2、 用枚举代替const常量。 O+ ].'  
d5aG6/  
_wvSLu<q  
六、C++函数中值的传递方式 i6)7)^nG  
POZ5W)F(  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) RZKdh}B?\  
V(/ @$&  
void fun(char c) //pass by value ,_ zivUU  
|ATz<"q>  
void fun(char *str) //pass by pointer }ZPO^4H;-  
'!$g<= @  
void fun(char &str) //pass by reference @(k}q3b<  
"YW&,X5R  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 q#}#A@Rg  
wOfx7D  
函数的类型不能省略,就算没有也要加个void >j&+mii  
EMe3Xb `  
=1/d>kke  
七、函数体中的指针或引用常量不能被返回 ):LgZ4h  
\U(;%V  
Char *func(void) OHEl.p]|  
x:Mh&dq?  
{ 1=R6||8ws  
rt5FecX\  
char str[]=”Hello Word”; ^T^l3B[  
+`y{r^xD  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 b#h}g>l  
zk#NM"C+  
return str; %3"xn!'vf  
wNNInS6  
} YU*u!  
G&eRhif  
函数体内的指针变量并不会随着函数的消亡而自动释放 x%J4A+kU  
2hD(zUSy  
2N)siH  
八、一个内存拷贝函数的实现体 p,(gv])ie  
V'-}B6 3S>  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 7EI5w37  
!xqy6%p  
{ %MA o<,ha  
:TPT]q d@  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); ]$4DhB  
%A]?5J)Bi  
byte *pbTo=(byte*)pvTo; //防止地址被改变 {~L{FG)O  
?%QWpKO7X  
byte *pbFrom=(byte*)pvFrom; c8@zpkMj/  
g?TPRr~$9  
while (size-- >0) {c(@u6l28  
5mtsN#  
pbTo++ = pbForm++; d*}dM "  
"UNWbsn6Qr  
return pvTo; nBN+.RB:(  
FrKI=8  
} w<qn@f  
>EacXPt-O  
+n'-%?LD&  
九、内存的分配方式 \sSt _|+  
x/<eY<Vgm?  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 vO?\u`vY  
4Go$OQ`  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 >+/2g  
fV "gL(7  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 bjR:5@"  
E]aQK.  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 5 R*  
k}0Y&cT!rU  
UPE9e   
十、内存分配的注意事项 s%6{X48vY^  
gpvzOW/  
用new或malloc分配内存时,必须要对此指针赋初值。 =ws iC'  
k <EzYh  
用delete 或free释放内存后,必须要将指针指向NULL g,k} nkIT  
jmE\+yz  
不能修改指向常量的指针数据 EF8~rKO3  
N I*x):bx  
w3<%wN>tE  
十一、内容复制与比较 '5usPD  
2HX#:y{\l  
//数组…… *XCgl*% *  
;YfKG8(0  
char a[]=”Hello Word!”; ,E._A(Z  
"p"M9P'  
char b[10]; \nzaF4+$  
+";<Kd-  
strcpy(b,a); J#/L}h;qH  
.Fl5b}C(  
if (strcmp(a,b)==0) Z=I+_p_G  
.='hYe.  
{} C/JFb zVx  
U65a _dakk  
//指针…… =/Lwprj  
=[ +)T[  
char a[]=”Hello Word!”; (fTi1 I!  
\F;  S  
char *p;  {F'~1qf  
us,~<e0  
p=new char[strlen(a)+1]; 32S5Ai@Cd"  
K^yZfpa8  
strcpy(p,a); V,?BVt  
,|7!/]0&  
if (strcmp(p,a)==0) 4iPxtVT  
h!!7LPxt  
{} 8o7%qWX  
HX`>" ?{  
>hFg,5 _l3  
十二、sizeof的问题 hgU#2`fS  
g,O3\jjQ  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 S [=l/3c  
o_#F,gze)S  
char a[]=”Hello World!” -LnNA`-  
SO#R5Mu2N  
char *p=a; 3;F+.{Icc  
.~C[D T+,  
count<<sizeof(a)<<end; //12字节 ?AlTQL~c  
< cUaIb;(4  
count<<sizeof(p)<<endl; //4字节 cg| C S?  
O Bp&64  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 FG{45/0We  
'7ps_pz  
void fun(char a[1000]) *B0 7-  
p(6!7t:  
{ 6?uo6 I  
*D:"I!Ho  
count<<sizeof(a)<<endl; //输出4而不是1000 WvVf+| Km  
`/+PZqdC  
} ^1jZwP;5eW  
s4kkzTnXE3  
0'nY  
十三、关于指针 rD*CLq K  
=e!o  
1、 指针创建时必须被初始化 Yd>ej1<  
1^R:[L4R`  
2、 指针在free 或delete后必须置为NULL 3w!,@=.q  
j%TcW!D-_  
3、 指针的长度都为4字节 okSCM#&:[2  
=zX A0%  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 kA/V=xO<  
<}z, !w8  
char *p=new char[100]; KU5|~1t 4  
l99{eD  
strcpy(p,”Hello World”); z&W5@6")`  
mq!_/3  
delete []p; //注意前面的[]号 xZ.c@u6:  
5IfyD ]<  
p=NULL; 0!(BbQnWI  
P+s-{vv{0  
5、数组指针的内容不能超过数组指针的最大容易。 (Tbw@BFk  
\Bg?QhA_D  
如: 0f]LOg  
D@ R>gqb  
char *p=new char[5]; idLCq^jnJ  
4&a,7uVer  
strcpy(p,”Hello World”); //报错 目标容易不够大 DAHQ7#qfQC  
lWe1Q#  
delete []p; //注意前面的[]号 B(l8&  
%yJ $R2%*y  
p=NULL; |8<P%:*N  
:f|X$> b  
1}>uY  
十四、关于malloc/free 和new /delete I6B4S"Q5<  
" +n\0j;  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 !5escR!\D  
\8HLQly|@  
l 注意:malloc/free是库函数,new/delete是运算符 SeX:A)*ez%  
@ApX43U(  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 FaVeP%v  
=m6yH_`@  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 /`"&n1  
LjOHlT'  
l 两者都必须要成对使用 0A. PfqYi  
@*}?4wU^k  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ^+)q@{\8Y  
Zv8I`/4?  
3.vQ~Fvl  
十五、C++的特性 `E4OgO  
jh3X G  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 UC{Tmf  
sM0o,l(5  
重载和内联:即可用于全局函数,也可用于类的成员函数; i rRe}  
eo~>|0A*V  
Const和Virtual:只可用于类的成员函数; |4tnG&=  
5Rc^5Nv  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 +CF"Bm8@  
j^&{5s  
覆盖是指派生类函数覆盖基类函数 |Vq&IfP  
h~zG*B5F  
函数名相同; |'bRVqJ  
f}_d`?K  
参数相同; ; D a[jFP  
rt5eN:'qY  
基类函数必须有Virtual关键字; i9FtS7  
b}OOG  
不同的范围(派生类和基类)。 C1 YG=!  
^%<t^sE  
隐藏是指派生类屏蔽了基类的同名函数相同 AT6:&5_`  
G>q16nS~KP  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 m=7Z8@sX},  
O{F)|<L(G  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 NcVsQV  
"BAH=ul5E  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 ".=LzjE<gv  
9^5D28y  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 /e0cx:.w  
1; "t8.*%e  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 _\y%u_W  
Z;XiA<|  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: _P]!J~$5  
]XAJ|[]sj*  
将void Func(A a) 改为void Func(const A &a)。 yXdJ5Me(T  
49("$!  
而void func(int a)就没必要改成void func(const int &a); ,%a7sk<5k  
xn)eb#r  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 O^AF+c\n  
qXQ/M]  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 Wveba)"$  
/K WR08ftp  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; ctzaqsr  
;Q0WCm\5  
Lk-%I?  
十六、extern“C”有什么作用? eyiGe1^C  
/ W,K% s]  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 >nnjL rI  
/0J1_g  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 l6C^,xU~IX  
\\WIu?  
NQD*8PGfj  
十七、构造函数与析构函数 dK=<%)N  
y+P iH  
派生类的构造函数应在初始化表里调用基类的构造函数; { fmY_T[Q8  
{0#p,l  
派生类和基类的析构函数应加Virtual关键字。 ]-D;t~  
B:pIzCP  
不要小看构造函数和析构函数,其实编起来还是不容易。 [AZN a  
8?S)>-mwv  
#include <iostream.h> 1M4I7 *r  
l-N4RCt h  
class Base $:bU<  
gD\  =  
{ zgdOugmmt_  
:.+?v*%;n  
public: dUTF0U  
H9^DlIv('  
virtual ~Base() { cout<< "~Base" << endl ; } ;'B\l@U\  
![v@+9  
}; Q6?}/p  
3xJ_%AD\'  
class Derived : public Base j|u6TG  
|Q'l&Gt6  
{ zLs[vg.(  
?}N@bsl08w  
public: +;}XWV  
6tE<`"P!  
virtual ~Derived() { cout<< "~Derived" << endl ; } ;(kU:b|j  
AU@XpaPWh  
}; *Q<%(JJ  
39W6"^q"o  
void main(void) %EZG2JjO)  
!zw)! rV=  
{ 8%UI<I,  
y<G@7?   
Base * pB = new Derived; // upcast 1|L3} 2  
?Afx{H7  
delete pB; +M+ht  
O MEPF2:  
} XeaO,P  
aqjS5!qh  
输出结果为: 2/9P&c-rp  
}Om+,!_d  
~Derived Z7eD+4gD  
!cs +tm3  
~Base iB Ld*B|#K  
f!`,!dZgkd  
如果析构函数不为虚,那么输出结果为 L`yyn/2>  
HR85!S`  
~Base 3f`+ -&|M  
{YCquoF  
a*}ZT,V  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 #L-3eW=f  
zS*X9|p  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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