理解复杂cd其实很简?一个类型里会出现很多运符,他们也像普通的表达式一?有优先,其优先和运优先一?所以我ȝ了一下其原则: 从变量名处v,Ҏq算W优先l合,一步一步分?
int *p[3]; //首先从P处开?先与[]l合,因ؓ其优先??所以P是一个数l?然后再与*l合,说明数组里的元素是指针类?然后再与intl合,说明指针所指向的内容的cd是整型的,所以P是一个由q回整型数据的指针所l成的数l?br>
int (*p)(int); //从P处开?先与指针l合,说明P是一个指?然后?)l合,说明指针指向的是一个函?然后再与()里的intl合,说明函数有一个int型的参数,再与最外层的intl合,说明函数的返回类型是整型,所以P是一个指向有一个整型参Cq回cd为整型的函数的指?br>int *(*p(int))[3];从P开?先与()l合,说明P是一个函?然后q入()里面,与intl合,说明函数有一个整型变量参?然后再与外面?l合,说明函数q回的是一个指?,然后到最外面一?先与[]l合,说明q回的指针指向的是一个数l?/strong>,然后再与*l合,说明数组里的元素是指?然后再与intl合,说明指针指向的内Ҏ整型数据.所以P是一个参Cؓ一个整数据且返回一个指向由整型指针变量l成的数l的指针变量的函?
搞清指针的四斚w的内容:指针的类?/span>?/span>指针所指向?nbsp;cd?/span>指针的值或者叫指针所指向的内存区?/span>指针本n所占据的内存区 学会判断好
char a[20];
int *ptr=(int *)a; //强制cd转换q不会改变a的类?nbsp;
ptr++;//此时每次+1 相当于加sizeof(int)大小的内存单位?br>两个指针不能q行加法操作。得到的l果是一个未知的位置?br>
q有sizeof的一些用法,strlen的规则?br>
关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成?br> 我们知道一个对象的状态由该对象的非静态数据成员决?所以随着数据成员的改?
对像的状态也会随之发生变?
如果一个类的成员函数被声明为constcd,表示该函C会改变对象的状?也就?br> 该函C会修改类的非静态数据成?但是有些时候需要在该类函数中对cȝ数据成员
q行赋?q个时候就需要用到mutable关键字了
例如:
class Demo
{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const
{
m_nAccess++;
return m_bFlag;
}
private:
int m_nAccess;
bool m_bFlag;
};
int main()
{
return 0;
}
~译上面的代码会出现 error C2166: l-value specifies const object的错?br> 说明在constcd的函C改变了类的非静态数据成?
q个时候需要用mutable来修C下要在const成员函数中改变的非静态数据成?br> m_nAccess,代码如下:
class Demo
{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const
{
m_nAccess++;
return m_bFlag;
}
private:
mutable int m_nAccess;
bool m_bFlag;
};
int main()
{
return 0;
}
q样再重新编译的时候就不会出现错误?
volatile关键?/strong>
volatile是c/c++中一个鲜Zh知的关键?该关键字告诉~译器不要持有变量的临时拯,它可以适用于基cd
如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,l构或?br> cȝ所有成员都会被视ؓvolatile.
使用volatileq不会否定对CRITICAL_SECTION,Mutex,Event{同步对象的需?br> 例如Q?br> int i;
i = i + 3;
无论如何QL会有一段旉Qi会被攑֜一个寄存器中,因ؓ术q算只能在寄存器中进行。一般来_volatitle
关键字适用于行与行之间Q而不是放在行内?/p>
我们先来实现一个简单的函数Q来观察一下由~译器生出来的汇编代码中的不之处Qƈ观察volatile关键字如何修?br> q个不之处。在q个函数体内存在一个busy loop(所谓busy loop也叫做busy waits,是一U高度浪费CPU旉的@环方?
void getKey(char* pch)
{
while (*pch == 0)
;
}
当你在VC开发环境中最优化选项都关闭之后,~译q个E序Q将获得以下l果(汇编代码)
; while (*pch == 0)
$L27
; Load the address stored in pch
mov eax, DWORD PTR _pch$[ebp]
; Load the character into the EAX register
movsx eax, BYTE PTR [eax]
; Compare the value to zero
test eax, eax
; If not zero, exit loop
jne $L28
;
jmp $L27
$L28
;}
q段没有优化的代码不断的载入适当的地址Q蝲入地址中的内容Q测试结果。效率相当的低,但是l果非常准确
现在我们再来看看编译器的所有最优化选项开关都打开以后Q重新编译程序,生成的汇~代码,和上面的代码
比较一下有什么不?/p>
;{
; Load the address stored in pch
mov eax, DWORD PTR _pch$[esp-4]
; Load the character into the AL register
movsx al, BYTE PTR [eax]
; while (*pch == 0)
; Compare the value in the AL register to zero
test al, al
; If still zero, try again
je SHORT $L84
;
;}
从代码的长度可以看出来Q比没有优化的情况要短的多。需要注意的是编译器把MOV指o攑ֈ了@环之外。这在单U程中是一个非常好的优化,但是Q在多线E应用程序中Q如果另一个线E改变了变量的|则@环永q不会结束。被试的值永q被攑֜寄存器中Q所以该D代码在多线E的情况下,存在一个巨大的BUG。解x法是重新
写一ơgetKey函数Qƈ把参数pch声明为volatile,代码如下Q?/p>
void getKey(volatile char* pch)
{
while (*pch == 0)
;
}
q次的修改对于非最优化的版本没有Q何媄响,下面L最优化后的l果Q?/p>
;{
; Load the address stored in pch
mov eax, DWORD PTR _pch$[esp-4]
; while (*pch == 0)
$L84:
; Directly compare the value to zero
cmp BYTE PTR [eax], 0
; If still zero, try again
je SHORT $L84
;
;}
q次的修改结果比较完,地址不会改变Q所以地址声明被移动到循环之外。地址内容是volatile,所以每ơ@?br> 之中它不断的被重新检查?/p>
把一个const volatile变量作ؓ参数传递给函数是合法的。如此的声明意味着函数不能改变变量的|但是变量?br> 值却可以被另一个线E在M旉改变掉?/p>
explicit关键?/strong>
我们在编写应用程序的时候explicit关键字基本上是很?它的作用?止单参数构造函?被用于自动型别{?其中比较典型的例子就是容器类?在这U类型的构造函C你可以将初始长度作ؓ参数传递给构造函?
例如:
你可以声明这样一个构造函?/p>
class Array
{
public:
explicit Array(int size);
......
};
在这里explicit关键字v着臛_重要的作?如果没有q个关键字的?q个构造函数有能力int转换成Array.一旦这U情况发?你可以给Array支派一个整数D不会引起Q何的问题,比如:
Array arr;
...
arr = 40;
此时,C++的自动型别{换会?0转换成拥?0个元素的Array,q且指派larr变量,q个l果Ҏ׃是我们想要的l果.如果我们构造函数声明ؓexplicit,上面的赋值操作就会导致编译器报错,使我们可以及时发现错?需要注意的?explicit同样也能L"以赋D法进行带有{型操作的初始?;
例如:
Array arr(40);//正确
Array arr = 40;//错误
看一下以下两U操?
X x;
Y y(x);//昑ּcd转换
另一U?br> X x;
Y y = x;//隐式cd转换
q两U操作存在一个小的差别,W一U方式式通过昑ּcd转换,Ҏ型别x产生了型别Y的新对象;W二U方式通过隐式转换产生了一个型别Y的新对象.
explicit关键字的应用主要是上面所说的构造函数定义种,参考该关键字的应用可以看看STL源代?其中大量使用了该关键?/p>
__based关键?/strong>
该关键字主要用来解决一些和׃n内存有关的问?它允许指针被定义Z某一点开始算?2位偏Ud?而不是内存种的绝对位|?br> 举个例子:
typedef struct tagDEMOSTRUCT {
int a;
char sz[10];
} DEMOSTRUCT, * PDEMOSTRUCT;
HANDLE hFileMapping = CreateFileMapping(...);
LPVOID lpShare = (LPDWORD)MapViewOfFile(...);
DEMOSTRUCT __based(lpShare)* lpDemo;
上面的例子声明了一个指针lpDemo,内部储存的是从lpShare开始的偏移?也就是lpHead是以lpShare为基准的偏移?上面的例子种的DEMOSTRUCT只是随便定义的一个结?用来代表L的结?
虽然__based指针使用h非常Ҏ,但是,你必d效率上付Z定的代h.每当你用__based指针处理数据,CPU都必Mؓ它加上基地址,才能指向真正的位|?
在这里我只是介绍了几个ƈ不时很常见的关键字的意义即用?其他那些常见的关键字介绍他们的文章已l不了在这里就不再一一介绍?希望q些内容能对大家有一定的帮助!
在网上看到的介绍性文章,不错
1. 保留?br>
C++中,保留字也U关键字Q它是预先定义好的标识符。见关键字的解释?br>
2.关键?br>
C++中已l被pȝ定义为特D含义的一cL识符。C++中的关键字有Q?br>
3.标识W?br>
对变量、函数、标号和其它各种用户自定义对象的命名。在C++中,标识W长度没有限ӞW一个字W必L字母或下划线Q其后若有字W则必须为字母、数字或下划Uѝ例如count2Q_x是正的标识WŞ式,而hello!Q?th则是错误的。在C++中标识符区分大小写,另外标识W不能和C++中的关键字相同,也不能和函数同名?br>
4.声明
一个标识符引入一个作用域Q此标识W必L明类型,如果同时指定了它所代表的实体,则声明也是定义?br>
5.定义
l所声明的标识符指定所代表的实体?br>
6.变量
某个作用域范围内的命名对象?br>
7.帔R
帔R是不接受E序修改的固定|可以是Q意数据类型。可以用后缀准确的描q所期望的常量类型,如Q点类型常量在数字后加FQ无W号整型帔R加后~U{等。此外还有串帔R?Please input yearQ?Q反斜线字符帔R如\n表示回RW?br>
8. const说明W?br>
const是在变量声明或函数声明时所用到的一个修饰符Q用它所修饰的实体具有只d性?br>
9. 输入
当程序需要执行键盘输入时Q可以用抽取操作付">>"从cin输入中抽取字符。如Q?br>
int myAge;
cin >> myAge;
10.输出
当程序需要在屏幕上显C出时Q可以用插入操作符"<<"向cout 输出中插入字符。如Q?br>
cout << "This is a program. \n ";
11.?br>
是既生信息又消费信息的逻辑讑֤Q通过C++pȝ和物理设备关联。C++的I/Opȝ是通过操作的。有两种cd的流Q文本流Q二q制?br>
12.标准输入输出?br>
它是C++标准库的l成部分QؓC++语言提供了输入输出的能力?br>
13.内置数据cd
由C++直接提供的类型,包括int、float、double、char 、bool、指针、数l和引用?br>
14.字符cd
包括 char、signed char、unsigned char三种cd?br>
15.整数cd
包括 short?int、long 三种cd?br>
16.long
只能修饰 int , double.
long int 指一U整数类型,它的长度大于{于int?
long double 指长双精度类?长度大于{于double型?br>
17.short
一U长度少于或{于int型的整数cd?br>
18.signed
由它所修饰的类型是带符L. 只能修饰 int ?char .
19.布尔?br>
一U数据类型,其值可为:true, false 两种?br>
20.点cd
包括float, double , long double 三种cd。其典型特征表现为有数或指数?br>
21.双精度类?br>
点cd中的一U。在基本数据cd中它是精度最高,表示范围最大的一U数据类型?br>
22.voidcd
关键字之一Q指C没有返回信息?br>
23.l构cd
cȝ一U,其成员默认ؓpublic型。大多用作无成员函数的数据结构?br>
24.枚Dcd
一U用戯定义cdQ由用户定义的值的集合l成?br>
25.cd转换
一U数据类型{换ؓ另一U,包括昑ּ,隐式两种方式?br>
26.指针
一个保存地址?的对象?br>
27. 函数指针
每个函数都有地址Q指向函数地址的指针称为函数指针,函数指针指向代码Z的某个函敎ͼ通过函数指针可以调用相应的函数。其定义形式为:
int ( * func ) ( char a, char b);
28.引用
Z个对象或函数提供的另一个名字?br>
29.链表
一U数据结构,׃个个有序的结点组成,每个l点都是相同cd的结构,每个l点都有一个指针成员指向下一个结炏V?br>
30.数组
数组是一个由若干同类型变量组成的集合?br>
31.字符?br>
标准库中的一U数据类型,一些常用操作符?=Q?=支持其操作?br>
32.q算W?br>
内置的操作常用符P例如+,* ,& {?br>
33.单目q算W?br>
只能对一个操作数q行操作
34.双目q算W?br>
可对两个操作数进行操?br>
35.三目q算W?br>
可对三个操作数进行操?br>
36.术q算W?br>
执行术操作的运符Q包括:+Q?Q?Q?Q??br>
37.条gq算W?br>
??: " ?br>
其语法ؓQ?br>
(条g表达??(条g为真时的表达?Q?条g为假时的表达?
如:x = a < b ? a : b;
相当?
if ( a < b)
x = a;
else
x = b;
38.赋D符
卻I" = "及其扩展赋D符
39.左?br>
能出现在赋D辑ּ左边的表辑ּ?br>
40.叛_?br>
能出现在赋D辑ּ双的表辑ּ?br>
41.q算W的l合?br>
指表辑ּ中出现同{优先的操作符时该先做哪个的规定?br>
42.位运符
" & "," | " , " ^ "Q? >> "Q? << "
43.逗号q算W?br>
? Q?"
44.逻辑q算W?br>
" && ", " || " ," ! "
45.关系q算W?br>
">",">=","<=","< "," <= ","== "
46.newq算W?br>
对象创徏的操作符?br>
47.deleteq算W?br>
对象释放操作W,触发析构函数?br>
48.内存泄露
操作堆内存时Q如果分配了内存Q就有责d收它Q否则这块内存就无法重新使用Q称为内存泄漏?br>
49.sizeofq算W?br>
获得对象在内存中的长度,以字节ؓ单位?br>
50.表达?br>
由操作符和标识符l合而成Q生一个新的倹{?br>
51.术表达?br>
用算术运符和括号将q算对象(也称操作?q接hQ符合C++语法规则的式子?br>
52.关系表达?br>
用关p运符和括号将q算对象(也称操作?q接hQ符合C++语法规则的式子?br>
53.逻辑表达?br>
用逻辑q算W和括号运对?也称操作?q接hQ符合C++语法规则的式子?br>
54.赋D辑ּ
pD符一个变量和一个表辑ּq接hQ符合C++语法规则的式子?br>
55.逗号表达?br>
由逗号操作W将几个表达式连接v来,W合C++语法规则的式子?br>
56.条g表达?br>
由条件运符运对象连接v来,W合C++语法规则的式子?br>
57.语句
在函C控制E序程执行的基本单位,如if语句,while语句,switch语句, do语句, 表达式语句等?br>
58.复合语句
闭于大括号{}内的语句序列?br>
59.循环语句
for 语句, while 语句, do 语句三种?br>
60.条g语句
Z某一条g在两个选项中选择其一的语句称为条件语句?br> 61.成员函数
在类中说明的函数UCؓ成员函数?br>
62.全局函数
定义在所有类之外的函数?br>
63.main函数
ql自动调用开始执行C++E序的第一个函?br>
64.外部函数
在定义函数时Q如果冠以关键字externQ表C此函数是外部函数?br>
65.内联函数
在函数前加上关键字inline说明了一个内联函敎ͼq一个函数在E序行里q行代码扩展而不被调用。这L好处是减了函数调用的开销Q生较快的执行速度。但是由于重复编码会产生较长代码Q所以内联函数通常都非常小。如果一个函数在c说明中定义Q则自动{换成内联函数而无需用inline说明?br>
66.函数重蝲
在同一作用域范围内Q相同的函数名通过不同的参数类型或参数个数可以定义几个函数Q编译时~译器能够识别实参的个数和类型来军_该调用哪个具体函数。需要注意的是,如果两个函数仅仅q回cd不同Q则~译时将会出错,因ؓq回cd不以提供够的信息以ɾ~译E序判断该用哪个函数。所以函数重载时必须是参数类型或者数量不同?br>
67.函数覆盖
对基cM的虚函数Q派生类以相同的函数名及参数重新实现之?br>
68.函数声明
在C++中,函数声明是函数原型Q它是一条程序语句,卛_必须以分L束。它有函数返回类型,函数名和参数构成QŞ式ؓQ?br>
q回cd function (参数?;
参数表包含所有参数的数据cdQ参C间用逗号分开。如下函数声明都是合法的?br>
int Area(int length , int width ) ;
?int Area ( int , int ) ;
69.函数定义
函数定义与函数声明相对应Q指函数的具体实玎ͼ卛_括函C。如Q?br>
int Area( int length , int width )
{
// other program statement
}
70.函数调用
指定被调用函数的名字和调用函数所需的信?参数)?br>
71.函数?br>
与函C相对Q函数调用时引用?br>
72.函数cd
(1) 获取函数q返回倹{?br>
(2) 获取函数但不q回倹{?br>
(3) 没有获取参数但返回倹{?br>
(4) 没有获取参数也不q回倹{?br>
73.形式参数
函数中需要用变元时Q将在函数定义时说明需要接受的变元Q这些变元称为Ş式参数。Ş式参数对应于函数定义时的参数说明。其使用与局部变量类伹{?br>
74.实际参数
当需要调用函数时Q对应该函数需要的变元所l出的数据称为实际参数?br>
75.g?br>
函数调用时Ş参仅得到实参的|调用l果不会改变实参的倹{?br>
76.引用传?br>
函数调用时Ş参ؓ实参的引用,调用l果会改变实参的倹{?br>
77.递归
函数的自我调用称为递归。每ơ调用是应该有不同的参数Q这样递归才能l止?br>
78.函数?br>
与函数名相对Q指函数最外边由{}括v来的部分?br>
79.作用?br>
指标识符在程序中有效的范_与声明位|有养I作用域开始于标识W的生命处。分Q局部作用域Q函C用域Q函数原型作用域Q文件作用域Q类作用域?br>
80.局部作用域
当标识符的声明出现在׃对花括号所括v来的一D늨序内Ӟ该标C符的作用域从声明点开始到块结束处为止Q此作用域的范围h局部性?br>
81.全局作用?br>
标识W的声明出现在函敎ͼcM外,h全局性?br>
82.cM用域
指类定义和相应的成员函数定义范围?br>
83.全局变量
定义在Q何函C外,可以被Q一模块使用Q在整个E序执行期间保持有效。当几个函数要共享同一数据时全局变量十分有效,但是使用全局变量是有一定弊端的Q全局变量在整个E序执行期间占有执行I间Q即使它只在数旉被用?大量使用全局变量导致程序乱,特别是在E序较复杂时可能引v错误?br>
84.局部变?br>
定义在函数内部的变量。局部变量只在定义它的模块内部v作用Q当该段代码l束Q这个变量就不存在了。也是说一个局部变量的生命期就是它所在的代码块的执行期,而当q段代码再次被执行时该局部变量将重新被初始化而不会保持上一ơ的倹{需要注意的是,如果ȝ序和它的一个函数有重名的变量,当函数被调用时这个变量名只代表当前函C的变量,而不会媄响主E序中的同名变量?br>
85.自动变量
由auto修饰Q动态分配存储空_存储在动态存储区中,对他们分配和释放存储I间的工作是q译系l自动处理的?br>
86.寄存器变?br>
存储在运器中的寄存器里的变量,可提高执行效率?br>
87.静态变?br>
p接器分配在静态内存中的变量?br>
88.c?br>
一U用戯定义cdQ有成员数据Q成员函敎ͼ成员帔RQ成员类型组成。类是描叙C++概念的三个基本机制之一?br>
89.外部变量
由extern修饰的变?br>
90.?br>
卌由存储区Qnew 和delete 都是在这里分配和释放内存块?br>
91.?br>
有两个含义:(1)指内存中为函数维护局部变量的区域?2)指先q后处的序列?br>
92.抽象c?br>
臛_包含一个纯虚函数的cR抽象类不能创徏对象Q但可以创徏指向抽象cȝ指针Q多态机制将Ҏ基类指针选择相应的虚函数?br>
93.嵌套c?br>
在一个类里可以定义另一个类Q被嵌入cd在定义它的类的作用域里有效?br>
94.局部类
在函C定义的类。注意在函数外这个局部类是不可知的。由于局部类的说明有很多限制Q所以ƈ不常见?br>
95.基类
被承的cȝ为基c,又称父类、超cL范化cR它是一些共有特性的集合Q可以有其它cȝ承它Q这些类只增加它们独有的Ҏ?br>
96.zc?br>
l承的类UCؓzcR派生类可以用来作ؓ另一个派生类的基c,实现多重l承。一个派生类也可以有两个或两个以上的基类。定义时在类名后?Q被l承cd"卛_?br>
97.父类
卛_cR见95基类的解释?br>
98.子类
x生类。见96zcȝ解释?br>
99.对象
有两重含义:
1. 内存中含有某U数据类型值的邻近的区域?br>
2. 某种数据cd的命名的或未命名的变量。一个拥有构造函数的cd对象在构造函数完成构造之前不能认为是一个对象,在析构函数完成析构以后也不再认ؓ它是一个对象?br>
100. 数据成员
指类中存储数据的变量?br>
101.实例?br>
卛_立类的一个对象?br>
102.构造函?br>
是一个类的实例的初始化函敎ͼ在生成cȝ实例时被自动调用Q用于完成预先的初始化工作。一个类可以有几个构造函敎ͼ以不同的参数来区别,x造函数可以被重蝲Q以便不同的情况下生不同的初始?也可以没有构造函敎ͼ此时pȝ调用缺省的I构造函数。需要注意的是构造函数没有返回类型?br>
103.成员初始化表
成员初始化表可用于初始化cM的Q何数据成员,攑֜构造函数头与构造函C之间Q用"Q?与构造函数头分开Q被初始化的数据成员的值出现在一Ҏ弧之_它们之间用逗号分开?br>
104.析构函数
是一个类的实例的回收函数Q将在该实例l束使用前被自动调用Q用于完成资源的释放。一个类只可以有一个析构函敎ͼ当析构函数执行后,该实例将不复存在。析构函数同h有返回倹{?br>
105.虚析构函?br>
由virtual 修饰的析构函敎ͼ当用基类指针释放zcd象时可根据它所指向的派生类对象释放准确的对象?br>
106.l承
面向对象的程序设计语a的特点之一。即一个对象获得另一个对象的Ҏ的q程。如公共属性和服务攑ֈ基类中,而它的各zc除了有各自的特有属性和服务外还可以׃n基类的公共属性和服务。这L好处是容易徏立体p,增强代码重复性?br>
107.单?br>
一个派生类只有一个基c,成ؓ单ѝ?br>
108.重?br>
一个派生类拥有多个基类Q成为多l承?br>
109.虚函?br>
在基cM说明为virtualq在zcM重定义的函数。重定义忽略基cM的函数定义,指明了函数执行的实际操作。当一个基cL针指向包含虚函数的派生对象时QC++根据指针指向的对象cd来决定调用哪一个函敎ͼ实现了运行时的多态性。这里的重定义类g函数重蝲Q不同的是重定义的虚函数的原型必d基类中指定的函数原型完全匚w。构造函C能是虚函敎ͼ而析构函数则可以是?br>
110.U虚函数
在基cM只有声明没有实现的虚函数。Ş式ؓQ?br>
virtual type funname(paralist)=0。这时基函数只提供派生类使用的接口,Mc要使用必须l出自己的定义?br>
111.多态?br>
l不同类型的实体提供单一接口。虚函数通过基类接口实现动态多态性,重蝲函数和模板提供了静态多态性?br>
112.复制构造函?br>
以自w类对象为参数的构造函敎ͼ如Z::Z(const Z&). 用在同类对象间进行初始化?br>
113.q算W重?br>
C++中可以重载双??Q?#215;{?和单??+)操作W,q样可以使用户像使用基本数据cd那样对自定义cd(c?的变量进行操作,增强了程序的可读性。当一个运符被重载后Q它具有和某个cȝ关的含义Q同时仍保持原有含义?br>
114.静态成员函?br>
成员函数通过前面加static说明为静态的Q但是静态成员函数只能存取类的其他静态成员,而且没有this指针。静态成员函数可以用来在创徏对象前预初始化专有的静态数据?br>
115.静态成员变?br>
在成员变量之前加static关键字将使该变量UCؓ静态成员变量,该类所有的对象共享这个变量的同一拯。当对象创徏Ӟ所有静态变量只能被初始化ؓ0。用静态成员变量可以取代全局变量Q因为全局变量是违背面向对象的E序设计的封装性的?br>
116.U有成员
只能pw类讉K的成员?br>
117.保护成员
只能pw类及其zc访问的成员?br>
118.友元
被某cL授权可讉K其成员的函数和类?br>
119.友元函数
在函数前加上关键字friend卌明了一个友元函敎ͼ友元函数可以存取cȝ所有私有和保护成员。友元在重蝲q算W时有时是很有用的?br>
120.友元c?br>
被某cL授权可讉K其成员的c?br>
121.例外处理
报告局部无法处理某错误的基本方式。由try.Q?throw , catchl成?br>
122.文g
是用于从盘文g到终端或打印机的M东西。流通过完成打开操作与某文g建立联系?br>