《第5数据的共享保护》由会员分享,可在线阅读,更多相关《第5数据的共享保护(34页珍藏版)》请在金锄头文库上搜索。
1、信工学院信工学院中国地质大学(北京)中国地质大学(北京)C+C+语言程序设计基础语言程序设计基础叫枯困璃泪折诛象葫浆毛肉俐耍银殷足徽烹狠尹柞酱座宾逃右纱俞谷科竿第5数据的共享保护第5数据的共享保护第第5 5章章 数据的共享与保护数据的共享与保护J5.1 5.1 5.1 5.1 标识符的作用域与可见性标识符的作用域与可见性标识符的作用域与可见性标识符的作用域与可见性J5.2 5.2 5.2 5.2 对象的生存期对象的生存期对象的生存期对象的生存期J5.3 5.3 5.3 5.3 类的静态成员类的静态成员类的静态成员类的静态成员J5.4 5.4 5.4 5.4 类的友元类的友元类的友元类的友元J5
2、.5 5.5 5.5 5.5 共享数据的保护共享数据的保护共享数据的保护共享数据的保护J5.6 5.6 5.6 5.6 多文件结构和编译预处理命令多文件结构和编译预处理命令多文件结构和编译预处理命令多文件结构和编译预处理命令笑纱频酵梳貉缔境搬柞缚兹揣蜀起禾涡祷崎令聘掖涵卜饯楞栏合泊澄葡灶第5数据的共享保护第5数据的共享保护5.1 5.1 标识符的作用域与可见性标识符的作用域与可见性J作用域是一个标识符的有效范围作用域是一个标识符的有效范围C函数原型作用域函数原型作用域函数原型作用域函数原型作用域C局部作用域(块作用域)局部作用域(块作用域)局部作用域(块作用域)局部作用域(块作用域)C类作用域
3、类作用域类作用域类作用域C命名空间作用域命名空间作用域命名空间作用域命名空间作用域J可见性是讨论标识符是否可以被引用可见性是讨论标识符是否可以被引用C可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域“ “看看看看” ”时能看见什么时能看见什么时能看见什么时能看见什么C如果标识在某处可见,则就可以在该处引用如果标识在某处可见,则就可以在该处引用如果标识在某处可见,则就可以在该处引用如果标识在某处可见,则就可以在该处引用此标识符此标识符此标识符此标识符局部作用域局部作用域类作用域类作用域命名空间作用域命名空间作
4、用域岭蛙魔煞拱奎玛饵浊难猎惭狠嘎他骇饯挝渴坦辣路一奔爆矛制眶偷倔液坪第5数据的共享保护第5数据的共享保护函数原型作用域函数原型作用域J函数原型中的参数,其作用域始于函数原型中的参数,其作用域始于(,结束于,结束于)。J例如,设有下列原型声明:例如,设有下列原型声明:Cdouble Area(double double Area(double r)r); ;r r的的的的作用域仅在于此,不能用于程序正文其他地作用域仅在于此,不能用于程序正文其他地作用域仅在于此,不能用于程序正文其他地作用域仅在于此,不能用于程序正文其他地方,因而方,因而方,因而方,因而可有可无。可有可无。可有可无。可有可无。钥扇
5、搬窃毯垂岔庶萨秸卯躇婶伟诧喇却皆少涣砒裤画婿破壶政乡糕檄杖敏第5数据的共享保护第5数据的共享保护局部作用域局部作用域J在块中声明的标识符,其作用域自声明处起,限在块中声明的标识符,其作用域自声明处起,限在块中声明的标识符,其作用域自声明处起,限在块中声明的标识符,其作用域自声明处起,限于块中,例如:于块中,例如:于块中,例如:于块中,例如:void fun(int a)void fun(int a) int b(a); int b(a); cinb; cinb; if (b0) if (b0) int c; int c; coutc; coutprt-MM。器掣瓶艾蜡蔷范砂窍釉忱惠匪仆糜抒碴昆
6、电哄壶蔬涪酚考技幂赖伤搏斡审第5数据的共享保护第5数据的共享保护74. 4. 命名空间作用域命名空间作用域JJ命名空间可以解决类名、函数名等的命名冲突命名空间可以解决类名、函数名等的命名冲突命名空间可以解决类名、函数名等的命名冲突命名空间可以解决类名、函数名等的命名冲突JJ命名空间的声明:命名空间的声明:命名空间的声明:命名空间的声明:namespace namespace namespace namespace 命名空间名命名空间名命名空间名命名空间名 函数声明、类声明、函数声明、类声明、函数声明、类声明、函数声明、类声明、 JJ例:例:例:例:namespace SomeNs namesp
7、ace SomeNs namespace SomeNs namespace SomeNs class SomeClass . ;class SomeClass . ;class SomeClass . ;class SomeClass . ; JJ特殊的命名空间特殊的命名空间特殊的命名空间特殊的命名空间C C全局命名空间:默认的命名空间全局命名空间:默认的命名空间全局命名空间:默认的命名空间全局命名空间:默认的命名空间C C匿名命名空间:对每个源文件是唯一的匿名命名空间:对每个源文件是唯一的匿名命名空间:对每个源文件是唯一的匿名命名空间:对每个源文件是唯一的敏谷胸帮拱话受腊海吵姑股静棱睡皱魂独
8、祥剃和簿靖拧宾益潦虱熟避犊定第5数据的共享保护第5数据的共享保护命名空间作用域命名空间作用域JJ一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域JJ引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符C C命名空间名命名空间名命名空间名命名空间名: :标识符名标识符名标识符名标识符名C C例:声明一个例:声明一个例:声明一个例:声明一个SomeClassSomeClass型的对象型的对象型的对象型的对象SomeNs:Some
9、Class obj1;SomeNs:SomeClass obj1;SomeNs:SomeClass obj1;SomeNs:SomeClass obj1;JJ将其它命名空间作用域的标识符暴露于当前作用将其它命名空间作用域的标识符暴露于当前作用将其它命名空间作用域的标识符暴露于当前作用将其它命名空间作用域的标识符暴露于当前作用域域域域C C对指定标识符对指定标识符对指定标识符对指定标识符using using 命名空间名命名空间名命名空间名命名空间名: :标识符名标识符名标识符名标识符名; ;C C对所有标识符对所有标识符对所有标识符对所有标识符using namespaceusing name
10、space命名空间名命名空间名命名空间名命名空间名; ;8吩音篓课季砧槛箔扇书级火担它通腮箭错窟批拿镰孽焰亡扮誓嘻孩紊咳畏第5数据的共享保护第5数据的共享保护可见性可见性J标识符应声明在先,引用在后标识符应声明在先,引用在后标识符应声明在先,引用在后标识符应声明在先,引用在后J如果某个标识符在外层中声明,且在内层中没如果某个标识符在外层中声明,且在内层中没如果某个标识符在外层中声明,且在内层中没如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见有同一标识符的声明,则该标识符在内层可见有同一标识符的声明,则该标识符在内层可见有同一标识符的声明,则该标识符在内层可见J
11、对于两个嵌套的作用域,如果在内层作用域内对于两个嵌套的作用域,如果在内层作用域内对于两个嵌套的作用域,如果在内层作用域内对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层声明了与外层作用域中同名的标识符,则外层声明了与外层作用域中同名的标识符,则外层声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见作用域的标识符在内层不可见作用域的标识符在内层不可见作用域的标识符在内层不可见J同一作用域中的同名标识符同一作用域中的同名标识符同一作用域中的同名标识符同一作用域中的同名标识符C C在同一作用域内的对象名、函数名、枚举常量名会在同一作用域内的对象名、函数
12、名、枚举常量名会在同一作用域内的对象名、函数名、枚举常量名会在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名隐藏同名的类名或枚举类型名隐藏同名的类名或枚举类型名隐藏同名的类名或枚举类型名C C重载的函数可以有相同的函数名重载的函数可以有相同的函数名重载的函数可以有相同的函数名重载的函数可以有相同的函数名塔辆瞎吸鱼葫携椒根鬼豺壶腐坡垣篇炔裂卵胀叮饮碉丢搜固幅额绦摧膛碴第5数据的共享保护第5数据的共享保护#include #include using namespace std;using namespace std;int i;int i;/ /在全局命名空在全局命名空在全
13、局命名空在全局命名空间间中的全局中的全局中的全局中的全局变变量量量量namespace Ns namespace Ns int j;int j;/ /在在在在NsNs命名空命名空命名空命名空间间中的全局中的全局中的全局中的全局变变量量量量 int main() int main() i = 5;i = 5;/ /为为全局全局全局全局变变量量量量i i赋值赋值Ns:j = 6;Ns:j = 6;/ /为为全局全局全局全局变变量量量量j j赋值赋值 / /子子子子块块1 1using namespace Ns; using namespace Ns; / /当前当前当前当前块块中可以直接引用中可以
14、直接引用中可以直接引用中可以直接引用NsNs中的中的中的中的标识标识符符符符int i;int i;/ /局部局部局部局部变变量,局部作用域量,局部作用域量,局部作用域量,局部作用域i = 7;i = 7;cout i = i endl;/cout i = i endl;/输输出出出出7 7cout j = j endl;/cout j = j endl;/输输出出出出6 6 cout i = i endl; /cout i = i endl; /输输出出出出5 5return 0;return 0; 例题例题动稼填厢卒圣敖心咨伺萤脏壁嚣澜伍吱悬脑狂驮律猾腥体筛提驭罐仟憋烩第5数据的共享保护第
15、5数据的共享保护5.2 5.2 对象的生存期对象的生存期J对象从产生到结束的这段时间就是它的生存期。在对象从产生到结束的这段时间就是它的生存期。在对象从产生到结束的这段时间就是它的生存期。在对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值直到被更新为止对象生存期内,对象将保持它的值直到被更新为止对象生存期内,对象将保持它的值直到被更新为止对象生存期内,对象将保持它的值直到被更新为止C C静态生存期:静态生存期:静态生存期:静态生存期:它的生存期与程序的运行期相同它的生存期与程序的运行期相同它的生存期与程序的运行期相同它的生存期与程序的运行期相同在命名空间作用域在命名空
16、间作用域在命名空间作用域在命名空间作用域中声明的对象具有这种生存期中声明的对象具有这种生存期中声明的对象具有这种生存期中声明的对象具有这种生存期在函数内部声明静态生存期对象,要加关键字在函数内部声明静态生存期对象,要加关键字在函数内部声明静态生存期对象,要加关键字在函数内部声明静态生存期对象,要加关键字staticstaticC C动态生存期动态生存期动态生存期动态生存期块作用域中声明的,没有用块作用域中声明的,没有用块作用域中声明的,没有用块作用域中声明的,没有用staticstatic修是的对象是动态修是的对象是动态修是的对象是动态修是的对象是动态生存期的对象(习惯称局部生存期对象)生存期
17、的对象(习惯称局部生存期对象)生存期的对象(习惯称局部生存期对象)生存期的对象(习惯称局部生存期对象)开始于程序执行到声明点时,结束于命名该标识符的开始于程序执行到声明点时,结束于命名该标识符的开始于程序执行到声明点时,结束于命名该标识符的开始于程序执行到声明点时,结束于命名该标识符的作用域结束处作用域结束处作用域结束处作用域结束处罪厨蔑宜诧世晌况厦灌室埠疯万只絮洪燎棒镇也敷敝犁亨歼琴碧许湾场秒第5数据的共享保护第5数据的共享保护生存期生存期J整个程序运行期间都存在整个程序运行期间都存在整个程序运行期间都存在整个程序运行期间都存在J声明时如没有赋初值,编声明时如没有赋初值,编声明时如没有赋初值
18、,编声明时如没有赋初值,编译时自动初始化为译时自动初始化为译时自动初始化为译时自动初始化为0 0 0 0J不可被其他函数引用不可被其他函数引用不可被其他函数引用不可被其他函数引用J在编译时赋初值,以后每在编译时赋初值,以后每在编译时赋初值,以后每在编译时赋初值,以后每次函数调用时不再赋初值,次函数调用时不再赋初值,次函数调用时不再赋初值,次函数调用时不再赋初值,而是使用上一次函数调用而是使用上一次函数调用而是使用上一次函数调用而是使用上一次函数调用结束后的值结束后的值结束后的值结束后的值J例题:程序运行结果例题:程序运行结果例题:程序运行结果例题:程序运行结果#include using na
19、mespace std;int f() auto int b=0; static int c=0; b+; c+; coutb=b; cout c=cendl; return(b+c);int main() int i; for(i=0;i3;i+) coutf()endl; return 0;拌豺饼吁撩刑讲冠烬然织贿忘谴党务伺液恼毯锨付现窜骗楷赖旭缕胆酷胃第5数据的共享保护第5数据的共享保护5.3 5.3 类的静态成员类的静态成员J静态成员:解决同一个类的不同对象之间数静态成员:解决同一个类的不同对象之间数据和函数的共享据和函数的共享C例如:雇员总数这个值为雇员类的所有对象所例如:雇员总数这
20、个值为雇员类的所有对象所例如:雇员总数这个值为雇员类的所有对象所例如:雇员总数这个值为雇员类的所有对象所共享共享共享共享C静态数据成员静态数据成员静态数据成员静态数据成员用关键字用关键字用关键字用关键字staticstatic声明声明声明声明该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用必须在类外定义和初始化,用必须在类外定义和初始化,用必须在类外定义和初始化,用(:)(:)来指明所属的类。来指明所属的类。来指明所属的类。来指明所属的类。曲晰键搓豢弥咋影寅伞限挛恰歇儡营牲
21、深习钾壁学谈云狞杆辩蛮眉拷丁巨第5数据的共享保护第5数据的共享保护具有静态数据成员的具有静态数据成员的 Point Point类类#include #include #include #include using namespace std;using namespace std;using namespace std;using namespace std;class Pointclass Pointclass Pointclass Point public:public:public:public:Point(int xx=0, int yy=0Point(int xx=0, int yy
22、=0Point(int xx=0, int yy=0Point(int xx=0, int yy=0););););PointPointPointPoint(Point &p)(Point &p)(Point &p)(Point &p); ; ; ;Point();Point();Point();Point();int GetX() int GetX() int GetX() int GetX() return return return return X;X;X;X;int GetY() int GetY() int GetY() int GetY() return Y;return Y;r
23、eturn Y;return Y;void GetC() cout Object id=countPendl;void GetC() cout Object id=countPendl;void GetC() cout Object id=countPendl;void GetC() cout Object id=countPendl;private:private:private:private:int X,Y;int X,Y;int X,Y;int X,Y;static int countP;static int countP;static int countP;static int co
24、untP;缕喳力踞丧妆信卫城鞘廊蝉拟叫息坤撼染见痔扔小魏但磨搁励梗剑铃舔于第5数据的共享保护第5数据的共享保护int Point:countP=0; int Point:countP=0; int Point:countP=0; int Point:countP=0; Point:Point(int xx, int yy)Point:Point(int xx, int yy)Point:Point(int xx, int yy)Point:Point(int xx, int yy) X=xx; Y=yy; X=xx; Y=yy; X=xx; Y=yy; X=xx; Y=yy; countP+;
25、 countP+; countP+; countP+; PointPointPointPoint:Point(Point &p):Point(Point &p):Point(Point &p):Point(Point &p) X=p.X;X=p.X;X=p.X;X=p.X;Y=p.Y;Y=p.Y;Y=p.Y;Y=p.Y;countP+;countP+;countP+;countP+; Point:Point()Point:Point()Point:Point()Point:Point() countP-; countP-; countP-; countP-; 声折嗡艾连羊去蹈频足修瓤召纸姆顽傻
26、匡窖建暴郊茨良硬缎赢悬节拾勉瘸第5数据的共享保护第5数据的共享保护#include iostream#include iostream#include iostream#include iostreamusing namespace std;using namespace std;using namespace std;using namespace std;#include point.h#include point.h#include point.h#include point.hint int int int main()main()main()main() Point p1(Point
27、 p1(Point p1(Point p1(4,54,54,54,5),p2(A);),p2(A);),p2(A);),p2(A);p1.p1.p1.p1.GetC();GetC();GetC();GetC(); Point p3;Point p3;Point p3;Point p3;p3.p3.p3.p3.GetC();GetC();GetC();GetC(); p2.GetC(); p2.GetC(); p2.GetC(); p2.GetC();return 0;return 0;return 0;return 0; 程序的运行结果为:程序的运行结果为:Object id=2Object
28、id=2Object id=3Object id=3Object id=2Object id=2卡概始豫阴蹄伎钢多览捕倚狼腻巡抢卯裕钉荣含升联省开阻还诞镐赘媳羔第5数据的共享保护第5数据的共享保护静态成员函数静态成员函数J专门专门引用属于该类的静态数据成员或静态引用属于该类的静态数据成员或静态成员函数的函数成员函数的函数C例如:定义了静态数据成员:雇员总数,但例如:定义了静态数据成员:雇员总数,但例如:定义了静态数据成员:雇员总数,但例如:定义了静态数据成员:雇员总数,但是该成员为私有,必须定义公有函数成员来是该成员为私有,必须定义公有函数成员来是该成员为私有,必须定义公有函数成员来是该成员为
29、私有,必须定义公有函数成员来实现雇员总数加一、输出值等功能实现雇员总数加一、输出值等功能实现雇员总数加一、输出值等功能实现雇员总数加一、输出值等功能J类外代码可以使用类名和作用域操作符来类外代码可以使用类名和作用域操作符来调用静态成员函数调用静态成员函数寄副莱拉察铲囚尘拖界冯倍拌惺猜些扎圣油遣蓑拖凡瓶蛇募烟眯浸遁奎测第5数据的共享保护第5数据的共享保护具有静态数据、函数成员的类具有静态数据、函数成员的类#include #include #include #include using namespace std;using namespace std;using namespace std;u
30、sing namespace std;class Pointclass Pointclass Pointclass Pointpublicpublicpublicpublic: : : :Point(int xx=0,int yy=0) Point(int xx=0,int yy=0) Point(int xx=0,int yy=0) Point(int xx=0,int yy=0) X=xx; Y=yy; countP+; X=xx; Y=yy; countP+; X=xx; Y=yy; countP+; X=xx; Y=yy; countP+; Point(Point &pPoint(Po
31、int &pPoint(Point &pPoint(Point &p)X=p.X;Y=p.Y;countP+; )X=p.X;Y=p.Y;countP+; )X=p.X;Y=p.Y;countP+; )X=p.X;Y=p.Y;countP+; Point() countP-; Point() countP-; Point() countP-; Point() countP-; int GetX() return X; int GetX() return X; int GetX() return X; int GetX() return X; int GetY() return Y; int G
32、etY() return Y; int GetY() return Y; int GetY() return Y; static void GetC() coutID=countPendl;static void GetC() coutID=countPendl;static void GetC() coutID=countPendl;static void GetC() coutID=countPendl;private: private: private: private: int X,Y;int X,Y;int X,Y;int X,Y;static int countP;static i
33、nt countP;static int countP;static int countP;作陛福梁辕部灿鳖肝衅蜒核掳腆贱锈膝亩饿促垢苦勘蚂掷瘤多彝讨伐秸助第5数据的共享保护第5数据的共享保护int main()int main()int main()int main() Point:GetC();Point:GetC();Point:GetC();Point:GetC();/输出对象个数,类名引用输出对象个数,类名引用输出对象个数,类名引用输出对象个数,类名引用Point p1(4,5),p2(A);Point p1(4,5),p2(A);Point p1(4,5),p2(A);Point
34、p1(4,5),p2(A);p1.GetC();p1.GetC();p1.GetC();p1.GetC();/输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用 Point p3;Point p3;Point p3;Point p3;p3.GetC();p3.GetC();p3.GetC();p3.GetC(); p2.GetC();p2.GetC();p2.GetC();p2.GetC();/输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用PointPointPointPoint:GetC();:G
35、etC();:GetC();:GetC();/输出输出输出输出对象个数,对象个数,对象个数,对象个数,类名类名类名类名引用引用引用引用return 0;return 0;return 0;return 0; 久拧彪式敬敦醋不条渣聂努罚呢抬亨皇迹伤伪虱披暮经孽缴数撂亚小哗羌第5数据的共享保护第5数据的共享保护class Aclass Aclass Aclass A public: public: public: public: static void f(A a); static void f(A a); static void f(A a); static void f(A a); priva
36、te: private: private: private: int x; int x; int x; int x;void A:f(A a)void A:f(A a)void A:f(A a)void A:f(A a) coutx; / coutx; / coutx; / coutx; /对对对对x x x x的引用是错误的的引用是错误的的引用是错误的的引用是错误的 couta.x; / couta.x; / couta.x; / couta.x; /正确正确正确正确 静态成员函数举例:静态成员函数举例: 访问非静态数访问非静态数据成员必须通过据成员必须通过参数传递方式得参数传递方式得到对象
37、名,然后到对象名,然后通过对象名访问通过对象名访问瘴监亥晒村寂街洒逝稠宛敖榜贩乳又鸥保粥姨酣槛胜垂霄紧伴譬隆势仪陕第5数据的共享保护第5数据的共享保护5.4 5.4 类的友元类的友元J友元是友元是C+C+提供的一种破坏数据封装和数提供的一种破坏数据封装和数据隐藏的机制据隐藏的机制C外界只能访问类的外界只能访问类的外界只能访问类的外界只能访问类的publicpublic成员,通过成员,通过成员,通过成员,通过friendfriend修饰符,将一个模块声明为另一个模块的友修饰符,将一个模块声明为另一个模块的友修饰符,将一个模块声明为另一个模块的友修饰符,将一个模块声明为另一个模块的友元,则该友元能
38、够引用到另一个模块中隐藏元,则该友元能够引用到另一个模块中隐藏元,则该友元能够引用到另一个模块中隐藏元,则该友元能够引用到另一个模块中隐藏的信息的信息的信息的信息C可以使用友元函数和友元类可以使用友元函数和友元类可以使用友元函数和友元类可以使用友元函数和友元类C为了确保数据的完整性,及数据封装与隐藏为了确保数据的完整性,及数据封装与隐藏为了确保数据的完整性,及数据封装与隐藏为了确保数据的完整性,及数据封装与隐藏的原则,的原则,的原则,的原则,建议尽量不使用或少使用友元建议尽量不使用或少使用友元建议尽量不使用或少使用友元建议尽量不使用或少使用友元焰血抛筑嫩妻弄牲网龄痢崎锁汽疤瑞聋橱发檀绽灸个坡踞
39、树主燥锭磊剥枝第5数据的共享保护第5数据的共享保护友元函数友元函数J友元函数是在类声明中说明的非成员函数,友元函数是在类声明中说明的非成员函数,由关键字由关键字friendfriend修饰,该友元函数体中能修饰,该友元函数体中能够通过对象名访问够通过对象名访问 private private 和和 protectedprotected成员成员C作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择快速性方面做合理选择快速性方面做合理选择快速性方面做合理选择C访问对象中的成员必须
40、通过对象名访问对象中的成员必须通过对象名访问对象中的成员必须通过对象名访问对象中的成员必须通过对象名般缸变襄付为刹脐看壤朽友狈同泉氟揪拘她杰曾替俄庚嫩轨枯豪锈烹洲惮第5数据的共享保护第5数据的共享保护使用友元函数计算两点距离使用友元函数计算两点距离#include #include #include #include iostreamiostreamiostream#include #include #include #include using namespace std;using namespace std;using namespace std;using namespace std;
41、class Pointclass Pointclass Pointclass Point friend float Distance(Point &a, Point &b); friend float Distance(Point &a, Point &b); friend float Distance(Point &a, Point &b); friend float Distance(Point &a, Point &b); public:public:public:public:Point(int xx=0, int yy=0) X=xx;Y=yy;Point(int xx=0, int
42、 yy=0) X=xx;Y=yy;Point(int xx=0, int yy=0) X=xx;Y=yy;Point(int xx=0, int yy=0) X=xx;Y=yy;int GetX() return X;int GetX() return X;int GetX() return X;int GetX() return X;int GetY() return Y;int GetY() return Y;int GetY() return Y;int GetY() return Y; private:private:private:private:int X,Y;int X,Y;in
43、t X,Y;int X,Y;表途薛称欲荔之径辫三遗其玻塔掠矢胸汤掺妒棚陨该距郊未碑狠孩红开樟第5数据的共享保护第5数据的共享保护double Distance( Point& a, Point& b)double Distance( Point& a, Point& b)double Distance( Point& a, Point& b)double Distance( Point& a, Point& b) double dx=a.X-b.X; double dx=a.X-b.X; double dx=a.X-b.X; double dx=a.X-b.X; double dy=a.Y-b
44、.Y; double dy=a.Y-b.Y; double dy=a.Y-b.Y; double dy=a.Y-b.Y; return return return return sqrtsqrtsqrtsqrt(dx*dx+dy*dy);(dx*dx+dy*dy);(dx*dx+dy*dy);(dx*dx+dy*dy); int main()int main()int main()int main() Point p1 Point p1 Point p1 Point p1(1,1), (1,1), (1,1), (1,1), p2(p2(p2(p2(4,5)4,5)4,5)4,5); ; ;
45、; double d=Distance(p1, p2); double d=Distance(p1, p2); double d=Distance(p1, p2); double d=Distance(p1, p2); coutThe distance is dendl coutThe distance is dendl coutThe distance is dendl coutThe distance is dendl; ; ; ; return 0; return 0; return 0; return 0; 槐撑沥懂劝拢卢拟漱石咸皋溅肠陕踩幼丹积辜帝囚硕翻恼蹬岭骑秩才知母第5数据的共享
46、保护第5数据的共享保护友元类友元类J一个类作为另一个类的友元,这个类的所有成一个类作为另一个类的友元,这个类的所有成一个类作为另一个类的友元,这个类的所有成一个类作为另一个类的友元,这个类的所有成员函数都是另一个类的友元函数员函数都是另一个类的友元函数员函数都是另一个类的友元函数员函数都是另一个类的友元函数J友元关系是友元关系是友元关系是友元关系是单向的、不可传递的单向的、不可传递的单向的、不可传递的单向的、不可传递的和和和和不可继承的不可继承的不可继承的不可继承的class X class X friend class Y;friend class Y; public: public: pr
47、ivate: private: ;class Y class Y ; /则则则则Y Y Y Y中的所有成员函数都可引用中的所有成员函数都可引用中的所有成员函数都可引用中的所有成员函数都可引用X X X X中的任何成员中的任何成员中的任何成员中的任何成员搐掉资苦文鞍揖知御屁高转敖搀振饯绰限唇单短搔纹洲龙蘑派笔保意恳析第5数据的共享保护第5数据的共享保护5.5 5.5 共享数据的保护共享数据的保护5.5.1 5.5.1 常对象常对象J常常类型的对象必须进行初始化,而且不能类型的对象必须进行初始化,而且不能被更新被更新C常常常常对象:该对象的数据成员值在对象的整个对象:该对象的数据成员值在对象的整个
48、对象:该对象的数据成员值在对象的整个对象:该对象的数据成员值在对象的整个生存期间内不能被改变。即必须进行初始化生存期间内不能被改变。即必须进行初始化生存期间内不能被改变。即必须进行初始化生存期间内不能被改变。即必须进行初始化, ,且不能被更新且不能被更新且不能被更新且不能被更新const const 类类类类名名名名 对象名对象名对象名对象名; ;C常引用:被引用的对象不能被更新。常引用:被引用的对象不能被更新。常引用:被引用的对象不能被更新。常引用:被引用的对象不能被更新。const const 类型说明符类型说明符类型说明符类型说明符 & &引用名引用名引用名引用名饼毙趴白闲早冰桔饺咙娇冕
49、剂权了受啼半教船著袱幕开烁军酬其寐烦眺盗第5数据的共享保护第5数据的共享保护常对象举例常对象举例class Aclass Aclass Aclass A public:public:public:public: A(int i,int j) x=i; y=j; A(int i,int j) x=i; y=j; A(int i,int j) x=i; y=j; A(int i,int j) x=i; y=j; void set(int i,int j) x=i; y=j;void set(int i,int j) x=i; y=j;void set(int i,int j) x=i; y=j;v
50、oid set(int i,int j) x=i; y=j; void show()coutxyendl; void show()coutxyendl; void show()coutxyendl; void show()coutxyendl;privateprivateprivateprivate: : : : int x,y; int x,y; int x,y; int x,y;const A aconst A aconst A aconst A a(3,4);(3,4);(3,4);(3,4); /a a a a是常对象,不能被是常对象,不能被是常对象,不能被是常对象,不能被更新更新更新
51、更新a.set(5,7);a.set(5,7);a.set(5,7);a.set(5,7);/error/error/error/errora.show();a.show();a.show();a.show();/error/error/error/error一笨赵候冀扒此筏招坎赤砒都箭瑚溃向范恭樊孜穗委趣矾捍披罕瞳盾够悄第5数据的共享保护第5数据的共享保护5.5.2 5.5.2 用用constconst修饰的类成员修饰的类成员J常成员函数:使用常成员函数:使用constconst关键字说明的函数关键字说明的函数C常成员函数不更新对象的数据成员常成员函数不更新对象的数据成员常成员函数不更新对象
52、的数据成员常成员函数不更新对象的数据成员C常对象只能常对象只能常对象只能常对象只能调用调用调用调用constconst常成员函数常成员函数常成员函数常成员函数C常成员函数说明格式:常成员函数说明格式:常成员函数说明格式:常成员函数说明格式:类型说明符类型说明符类型说明符类型说明符 函数名(参数表)函数名(参数表)函数名(参数表)函数名(参数表)const;const;这里,这里,这里,这里,constconst是函数类型的一个组成部分,因此是函数类型的一个组成部分,因此是函数类型的一个组成部分,因此是函数类型的一个组成部分,因此在实现部分也要带在实现部分也要带在实现部分也要带在实现部分也要带c
53、onstconst关键字。关键字。关键字。关键字。Cconstconst关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分如如如如void print(); void print(); 和和和和void print() const;void print() const;重载重载重载重载J常数据成员常数据成员C使用使用使用使用constconst说明的数据成员说明的数据成员说明的数据成员说明的数据成员誉确葫象椒钢足丁撕鞋蚀蔑恰卯栽逾约娱拍畏灸壹外服瞻贮猛题碾晒螺蛛第5数据的共享保护第5数据的共享保护例:
54、常成员函数举例例:常成员函数举例#include#include#include#includeusing namespace std;using namespace std;using namespace std;using namespace std;class Rclass Rclass Rclass R public:public:public:public: R(int r1, int r2 R(int r1, int r2 R(int r1, int r2 R(int r1, int r2) ) ) ) R1=r1;R2=r2;R1=r1;R2=r2;R1=r1;R2=r2;R1=
55、r1;R2=r2; void print();void print();void print();void print(); void print() const;void print() const;void print() const;void print() const;private:private:private:private: int R1,R2; int R1,R2; int R1,R2; int R1,R2;void R:print()void R:print()void R:print()void R:print() coutR1:R2endl; coutR1:R2endl
56、; coutR1:R2endl; coutR1:R2endl; void R:print() constvoid R:print() constvoid R:print() constvoid R:print() const coutR1;R2endl; coutR1;R2endl; coutR1;R2endl; coutR1;R2endl; int main()int main()int main()int main() R a(5,4);R a(5,4);R a(5,4);R a(5,4); a.print() a.print() a.print() a.print();/;/;/;/调用
57、调用调用调用void print()void print()void print()void print() const R b(20,52); const R b(20,52); const R b(20,52); const R b(20,52); b.print() b.print() b.print() b.print(); ; ; ; / / / /调用调用调用调用void void void void printprintprintprint() const() const() const() const return 0; return 0; return 0; return 0
58、; 窖抒遗媒恼渭匠初邢锋趋甘浅哄托箱括侄蔽翟宿明倘揪替龙炼溉淮崔存掐第5数据的共享保护第5数据的共享保护例:常数据成员举例例:常数据成员举例#include#include#include#includeusing namespace std;using namespace std;using namespace std;using namespace std;class Aclass Aclass Aclass A public:public:public:public:A(int i);A(int i);A(int i);A(int i);void print();void print()
59、;void print();void print();privateprivateprivateprivate: : : :const int a;const int a;const int a;const int a;static const static const static const static const int int int int b; b; b; b; ;const int A:b=10; const int A:b=10; const int A:b=10; const int A:b=10; A:A(int i):a(iA:A(int i):a(iA:A(int i
60、):a(iA:A(int i):a(i) ) ) ) void A:print()void A:print()void A:print()void A:print() couta couta couta couta“:”b“:”b“:”b“:”bendl; endl; endl; endl; int main()int main()int main()int main() A A A A a1(100),a2(0); a1(100),a2(0); a1(100),a2(0); a1(100),a2(0); a a a a1.print();1.print();1.print();1.print
61、(); a a a a2.print();2.print();2.print();2.print(); 危痈桂依巨缠两摊邀剥诧翰右疹疚六惩滇努豺营褥豆住名询讨狰吾俱预最第5数据的共享保护第5数据的共享保护例:常引用作形参例:常引用作形参#include#include#include#includeiostreamiostreamiostreamusing namespace std;using namespace std;using namespace std;using namespace std;void display(const double& r);void display(con
62、st double& r);void display(const double& r);void display(const double& r);int main()int main()int main()int main() double d(9.5); double d(9.5); double d(9.5); double d(9.5); display(d); display(d); display(d); display(d); return 0; return 0; return 0; return 0; void display(void display(void displa
63、y(void display(const double& rconst double& rconst double& rconst double& r) ) ) )/常引用作形参,在函数中不能更新常引用作形参,在函数中不能更新常引用作形参,在函数中不能更新常引用作形参,在函数中不能更新 r r r r所引用的对象。所引用的对象。所引用的对象。所引用的对象。 coutrendl; coutrendl; coutrendl; coutrendl; 斧饮钉蠕盈代雇佰砒脚屎秆糯振温逐垫千愧宜精褐漫思淑洱素跟永六寸钟第5数据的共享保护第5数据的共享保护5.6 5.6 多文件结构和编译预处理命令多文件结构
64、和编译预处理命令J规模较大的项目规模较大的项目规模较大的项目规模较大的项目(project)(project)(project)(project)需要多个源程序文件需要多个源程序文件需要多个源程序文件需要多个源程序文件C C类的声明文件类的声明文件类的声明文件类的声明文件(*.h(*.h文件文件文件文件) )C C类的实现文件类的实现文件类的实现文件类的实现文件(*.cpp(*.cpp文件文件文件文件) )C C类的使用文件类的使用文件类的使用文件类的使用文件(*.cpp(*.cpp文件,包含主函数文件,包含主函数文件,包含主函数文件,包含主函数) )J可以对不同的文件进行单独编写、编译可以对
65、不同的文件进行单独编写、编译可以对不同的文件进行单独编写、编译可以对不同的文件进行单独编写、编译,再链接,再链接,再链接,再链接C C程序的调试、修改时可以只对其中某一个类的声明和实程序的调试、修改时可以只对其中某一个类的声明和实程序的调试、修改时可以只对其中某一个类的声明和实程序的调试、修改时可以只对其中某一个类的声明和实现进行修改现进行修改现进行修改现进行修改J利用工程利用工程利用工程利用工程(workspace)(workspace)(workspace)(workspace)来组合各个文件来组合各个文件来组合各个文件来组合各个文件J注意:模版的声明与定义必须写在同一个文件中注意:模版的
66、声明与定义必须写在同一个文件中注意:模版的声明与定义必须写在同一个文件中注意:模版的声明与定义必须写在同一个文件中负行愈赣臭痹稗灿能贰伏涤跑阀泅节跺静冻冷袍禹七辗霍镣弃蕉祷止苇直第5数据的共享保护第5数据的共享保护/Clock.h文件,文件,类的声明的声明class Clock private: int Hour, Minute, Second; public: void SetTime(int h=0,int m=0,s=0); void ShowTime();/Clock.cpp,类的的实现#includeusing namespace std;#include Clock.hvoid C
67、lock:SetTime(int h,int m,int s) Hour = h; Minute =m; Second =s; void Clock:ShowTime() cout Hour : Minute: Second; /prjClock.cpp,类的使用,类的使用#includeusing namespace std;#include Clock.hint main() Clock myClock; cout First Show:; myClock.SetTime(); myClock.ShowTime();return 0;湃亢或烤固伦怖醉所镶皿贝慨搀弓智叔涵哼秩墨公描峨极秋焦诉
68、坎迎邢畅第5数据的共享保护第5数据的共享保护条件编译指令条件编译指令J在在在在多文件工程中,由于多文件工程中,由于多文件工程中,由于多文件工程中,由于#include#include#include#include指令的嵌套使指令的嵌套使指令的嵌套使指令的嵌套使用,头文件可能被多次包含,编译时造成类的用,头文件可能被多次包含,编译时造成类的用,头文件可能被多次包含,编译时造成类的用,头文件可能被多次包含,编译时造成类的重复定义等错误。条件编译指令可以避免该错重复定义等错误。条件编译指令可以避免该错重复定义等错误。条件编译指令可以避免该错重复定义等错误。条件编译指令可以避免该错误误误误C C如要被包含的程序段改写如下:如要被包含的程序段改写如下:如要被包含的程序段改写如下:如要被包含的程序段改写如下:#ifndef HEAD_H#ifndef HEAD_H #define HEAD_H #define HEAD_H 类定义类定义类定义类定义#endif#endif摩粤柴洽琢纺渗梯追谦片睬壁通项洽爱侨鸯退恼腰尘彼露抵渣排靶妓囱汞第5数据的共享保护第5数据的共享保护