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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 3@}rO~  
e\8|6< o[  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 + *xi&|%  
 =1MVF  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 e]9Z]a2  
`jHbA#sO  
}}?,({T|n  
二、头文件的作用 $U/|+*  
3Q0g4#eP  
加强安全检测 p<Oz"6_/~  
S4ys)!V1V  
通过头文件可能方便地调用库功能,而不必关心其实现方式 T]_]{%z  
"26=@Q^Y  
R$|"eb5  
三、* , &修饰符的位置 5&C:&=Y  
m%ec=%L9  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 !B*l'OJw  
+nAbcBJAl  
o;kxu(>yL'  
四、if语句 i!<1&{  
!VDNqW  
不要将布尔变量与任何值进行比较,那会很容易出错的。 -P6Z[ V%  
-){aBMOv3  
整形变量必须要有类型相同的值进行比较 J@}PBHK+  
0 s$;3qE  
浮点变量最好少比点,就算要比也要有值进行限制 <u_ vL WS  
TSKT6_IJw  
指针变量要和NULL进行比较,不要和布尔型和整形比较 d ug^oc1  
5+DId7d'n  
]&;K:#J  
五、const和#define的比较 e,K.bgi  
d1qvS@  
const有数据类型,#define没有数据类型 4'~zuUs  
,J&\) yTP  
个别编译器中const可以进行调试,#define不可以进行调试 btR~LJb  
pw.K,?kYr  
在类中定义常量有两种方式 iJU=98q  
H`bS::JI-  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; iSP}kM}  
+RBX2$kB  
2、 用枚举代替const常量。 le|Rhs%Z%  
goqm6L^Cu  
C~-.zQ$  
六、C++函数中值的传递方式 91#rP|88;  
;5 p;i 8m  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) wJc`^gj  
Y"  Ut  
void fun(char c) //pass by value oQiRjDLx  
1/ 3<u::  
void fun(char *str) //pass by pointer _C3O^/<n4V  
jO0"`|(]s  
void fun(char &str) //pass by reference PcQ\o>0")  
fW w+'xF!  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 l`<1Y|  
^)p+)5l   
函数的类型不能省略,就算没有也要加个void J kxsua  
.<zN/&MXf  
z -c1,GOD  
七、函数体中的指针或引用常量不能被返回 C=Tq/L w  
?={S"qK(q  
Char *func(void) ZOBcV,K  
ipe8U1Sc  
{ Ya `$.D  
' ~ 1/*F%8  
char str[]=”Hello Word”; nv <t$r  
A2.GNk  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ~s{ V!)0  
{)n@Rq\=v  
return str; d:Oo5t)MN  
oZ_,WwnE  
} LzQOzl@z  
>{)\GK0i 7  
函数体内的指针变量并不会随着函数的消亡而自动释放 -V&nlP  
~l8w]R3A  
JT! Cb$!  
八、一个内存拷贝函数的实现体 ~p`[z~|  
|ju+{+  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) <U y $b4h  
M%YxhuT0  
{ vW-o%u*  
n-u HKBq  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); $ ~%w21?&  
'2Lx>nByk  
byte *pbTo=(byte*)pvTo; //防止地址被改变 m}(M{^\|  
Dk Ef;P  
byte *pbFrom=(byte*)pvFrom; - -\eYVh[  
qjsEyro$-  
while (size-- >0) " ?Ux\)*  
ti^=aB   
pbTo++ = pbForm++; H0f]Swh0a  
tM|/OJ7  
return pvTo; T#\=v(_NR  
BJt]k7ku+  
} S6<#] 6 Z  
=h70!) Z5  
DYF(O-hJK  
九、内存的分配方式  {DD #&B  
"%YVAaN  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 kX2Z@ w`  
yAFt|<  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ;\(LovUy6  
%ol\ sO|  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 [Z2{S-)UM  
mM r$~^P:  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 I7\T :Q[  
qe5;Pq !G  
KF6N P  
十、内存分配的注意事项 vq+4so )/S  
2Ab`i!#  
用new或malloc分配内存时,必须要对此指针赋初值。 z(u,$vZ _  
o:B?hr'\  
用delete 或free释放内存后,必须要将指针指向NULL &]tm 'N25  
3+\Zom4  
不能修改指向常量的指针数据 Z*b$&nM  
<G0Ut6J>  
Z2 Vri  
十一、内容复制与比较 <MKX F V  
!>N+a3   
//数组…… kCALJRf~d  
"=ki_1/P  
char a[]=”Hello Word!”; QUm[7<"  
jNI9 .45y  
char b[10]; w9StW9 4p  
+k h Tl:  
strcpy(b,a); P:WxhO/  
9^8_^F  
if (strcmp(a,b)==0) WL|<xNL  
_f~$iY  
{} e=s({V  
},{sJ0To  
//指针…… k[}WYs+r  
iL!4r]~H  
char a[]=”Hello Word!”; vQGv4  
LM(r3sonb  
char *p; wv`ar>qVL  
b%KcS&-6  
p=new char[strlen(a)+1]; oWx^_wQ-=  
vw$b]MO!  
strcpy(p,a); nly}ly Q/  
9f/l"  
if (strcmp(p,a)==0) Z&4L///  
w5yX~8UzJ  
{} 0|]d^bo  
">M&/}4  
3ZN\F  
十二、sizeof的问题 x:Q$1&3N  
3ZbqZ"rE  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 #]Lodo9rS\  
N{}8Zh4op  
char a[]=”Hello World!” (J?_~(,`"  
U%0|LQk5  
char *p=a; Xy./1`X  
i&p6UU  
count<<sizeof(a)<<end; //12字节 z7z9lDS  
,@fx[5{  
count<<sizeof(p)<<endl; //4字节 0_AIKJrL  
89j:YfA=v  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 Q3Z?Z;2aR  
L]H' ]wpn=  
void fun(char a[1000]) N`{ 6<Z0  
ZNl1e'  
{ Vc6 >i|"-O  
+* F e   
count<<sizeof(a)<<endl; //输出4而不是1000 D>^g2!b:  
l D->1=z  
} ^QjkZ^<dD  
(sI`FW_  
hT,rcIkg:  
十三、关于指针 '? -N  
5wdKu,nq  
1、 指针创建时必须被初始化 P_b!^sq9  
w ~"%&SNN  
2、 指针在free 或delete后必须置为NULL [c -|`d^  
s(ap~UCOw  
3、 指针的长度都为4字节 h6IO;:P)  
86 9sS  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 >6[d&SM6  
$-|$4lrS  
char *p=new char[100]; {2QP6XsJ  
[$ uKI,l  
strcpy(p,”Hello World”); B'mUDW8\D  
:>0,MO.^~K  
delete []p; //注意前面的[]号 MBLDx sZ-  
6tjV^sjs  
p=NULL; }#; .b'`  
H+5+;`;  
5、数组指针的内容不能超过数组指针的最大容易。 Q1{9>NI  
FA\U4l-  
如: _>aP5g?Ep  
~{);Ab.9+  
char *p=new char[5]; v,8Q9<=O  
I}f7|hYX  
strcpy(p,”Hello World”); //报错 目标容易不够大 9ZG:2ncdJ  
lFduX D  
delete []p; //注意前面的[]号 m`n~-_  
/2hRL yeAZ  
p=NULL; Q&+)Kp]A  
?RIf0;G  
FV3[7w=D\  
十四、关于malloc/free 和new /delete :>o 0zG[;f  
X$@qs9?)^  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 Ryygq,>VD.  
)FmIL(vu  
l 注意:malloc/free是库函数,new/delete是运算符 k.jBu  
49<t2^1q  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 -rjQ^ze  
AlG5n'  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 i~AReJxt7  
l]#=I7 6  
l 两者都必须要成对使用 7lA_*t@y  
=F Y2O`%a  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 fBh/$    
Hq,@j{($  
#D%6b  
十五、C++的特性 Qca3{|r`  
-'L~Y~'.  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ,Vo[mB  
H3`.Y$z  
重载和内联:即可用于全局函数,也可用于类的成员函数; @$j u Qm  
].5q,A]  
Const和Virtual:只可用于类的成员函数; ~t/i0pKq.  
M# -E  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 x,cvAbwS  
`@WJ_-$#  
覆盖是指派生类函数覆盖基类函数 Y"r728T`K  
$o;c:Kh$$  
函数名相同; D^V)$ME  
j_~mP>el)  
参数相同; i7v =o#  
'*&dP"  
基类函数必须有Virtual关键字; { o5^nd  
;"ESN)*|i  
不同的范围(派生类和基类)。 ]NI CQ9  
<5 OUk  
隐藏是指派生类屏蔽了基类的同名函数相同 nT +ZSr  
D`mr>-Y  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 q,%Fvcmx+e  
/3tErc'  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 olA+B  
C^;8M'8z0  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 L;y BZLM  
= &?&}pVF  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 rly%+B `/  
/Hq  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 ~tV7yY|zr  
o)n)Z~  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: I"x~ 7  
A>e-eD xi  
将void Func(A a) 改为void Func(const A &a)。 q8-hbWNm4  
[^bq?w  
而void func(int a)就没必要改成void func(const int &a); JR xY#k  
\=[j9'N>  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 @D=%J!!*  
<1Sj_HCT  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 /988K-5k  
'6e4rn{  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; Ycq )$7p  
98O]tL+k/u  
Y*p<\{,oC  
十六、extern“C”有什么作用? U6*[}Ww  
nCp_RJu  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 e57R6g)4  
<|?)^;R5!  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ~k?wnw  
}{=}^c"t'  
bJ1Nf|3~E  
十七、构造函数与析构函数 J~om e7L  
{fHY[8su0  
派生类的构造函数应在初始化表里调用基类的构造函数; NWPT89@l  
/{jt]8/;7  
派生类和基类的析构函数应加Virtual关键字。 QT73=>^B  
=Ry8E2NuM  
不要小看构造函数和析构函数,其实编起来还是不容易。 Fj2z$   
cQ1Axs TO  
#include <iostream.h> +:=FcsY  
a~a:mM > p  
class Base &Xh>w(u  
TU2oQ1  
{ _KkaseR  
W2fcY;HZ  
public: dT% eq7=  
O"EL3$9V  
virtual ~Base() { cout<< "~Base" << endl ; } j[FB*L1!D  
Bos} `S![  
};  U#K4)(C  
~o|sma5.  
class Derived : public Base 1cMLl6Bp>  
=EM<LjO  
{ oYA"8ei=  
g\8B;  
public: Scm45"wB+  
tc)Md]S  
virtual ~Derived() { cout<< "~Derived" << endl ; } 1#7|au%:)  
|4P8N{ L>O  
}; rl~Rbi  
~TXu20c  
void main(void) rtQ{  
UBM#~~sM  
{ u0sN[<  
3`{;E{  
Base * pB = new Derived; // upcast DEhR\Z!  
#a~BigZ[G  
delete pB; }cGILH%  
z;2& d<h  
} ';8 ,RTe  
5S!j$_(  
输出结果为: 7-n HPDp'  
3`vKEThY)  
~Derived K@%T5M4j  
dY0W=,X$7T  
~Base 5pDE!6gQ  
2-N7%]h  
如果析构函数不为虚,那么输出结果为 y= f.;  
a73VDQr I  
~Base @lWNSf  
$IX(a4'  
IemhHf ^l  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用  4q7H  
B[EOz\?=m  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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