`
java-mans
  • 浏览: 11813036 次
文章分类
社区版块
存档分类
最新评论

【C++ Primer】第十五章 友元、异常和其他 --之一--->友元和嵌套类

 
阅读更多

一,友元

1)可以将类作为友元,友元类的所有方法都可以访问原始类的私有成员和保护成员。

2)下面例子介绍了 电视类和遥控器类,其中遥控器类为电视类的友元类

3)注意:友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。

#include <iostream>
using namespace std;
class TV
{
private:
	int state;// on or off
	int volume; //assumed to be digitized
	int maxchannel;// maximum number of channels
	int channel;//current channel settings
	int mode;//broadcast  or  cable
	int input;//tv or vcr
public:
	friend class Remote;//遥控器类
	enum{off,on}; //枚举
	enum{minval,maxval=20};
	enum{antenna,cable};
	enum{tv,vcr};
	
	TV(int s=off,int mc=100):state(s),volume(5),maxchannel(mc),channel(2),mode(cable),input(tv){} //构造函数
	
	void onoff(){
		state=(state == on)?off:on;
	}	
	bool ison()const{
		return state == on;
	}
	bool volup();
	bool voldown();
	void chanup();
	void chandown();
	void set_mode(){
		mode = (mode == antenna)?cable:antenna; 
	} 
	void set_input(){
		input=(input == tv)?vcr:tv;
	}
	void settings()const;
} ;

class Remote//遥控器友元类
{
private:
	int mode;
public:
	Remote(int m=TV::tv):mode(m){} //遥控的是电视而不是 vcr
	bool volup(TV &t){  //遥控器的操作都是来源于电视对自身的操作 ,所以友元遥控器的方法都是调用电视的成员函数
		return t.volup();
	}	
	bool voldown(TV &t){
		return t.voldown();
	}
	void onoff(TV &t){
		return t.onoff();
	}
	void chanup(TV &t){
		return t.chanup();
	}
	void chandown(TV &t){
		return t.chandown();
	}
	void set_chan(TV &t,int c){  //唯一需要作为友元的方法,因为它用来访问TV类的private成员
		t.channel=c;
	}
	void set_mode(TV &t){
		t.set_mode();
	}
	void et_input(TV &t){
		t.set_input();
	}
	
};
    /*下面是电视的成员方法实现*/
    bool TV::volup()
    {
    	if(volume<maxval)
    	{
	    	volume++;
	    	return true;
	    }
	    else
         	return false;
    }
	bool TV::voldown()
	{
		if(volume>minval)
    	{
	    	volume--;
	    	return true;
	    }
	    else
         	return false;
		
	}
	void TV::chanup()
	{
		if(channel<maxchannel)
		  channel++;
	    else
		  channel=1;
		
	}
	void TV::chandown()
	{
		if(channel>1)
		  channel--;
	    else
		  channel=maxchannel;
		
	}
	void TV::settings()const
	{
		cout<<"tv is "<<(state == off?"on":"off")<<endl;
		if(state == on)
		{
			cout<<"volume setting ="<<volume<<endl;
			cout<<"channel setting ="<<channel<<endl;
			cout<<"Mode ="<<(mode == antenna?"cable":"antenna")<<endl;
			cout<<"Input ="<<(input == tv?"vcr":"tv")<<endl;
		}
		
	}
	
int main()
{
	TV s27;
	cout<<"initinal settings for 27\" tv:\n";
	s27.settings();
	s27.onoff();
	s27.chanup();
	cout<<"adjust settings for 27\"tv:";
	s27.settings();
	
	
	return 0;
}
输出为:

二,嵌套类

1)嵌套与包含的区别

包含意味着将类对象作为另一个类的成员

对类进行嵌套,不创建类成员,而是定义了一种类型,该类型仅在包含嵌套类的类中使用。struct (结构)实际上是一种嵌套类

2)嵌套类和访问权限

声明位置 包含它的类是否可以使用 从包含它的类派生出来的类,是否可以使用 外部世界是否可以使用
私有部分
保护部分
共有部分


分享到:
评论

相关推荐

    c++primer第五版习题答案(第12章)

    但是,我可以根据《C++ Primer》第五版的内容结构以及一般C++的学习顺序,为读者提供第12章可能涵盖的知识点,并对C++11标准中的相关概念进行介绍。 第12章通常会涉及C++中的输入输出库(I/O库),这是C++编程中必...

    c++primer第五版习题答案(第17章)

    《C++ Primer》第五版是C++领域一本非常权威的教材,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo编著。该书是按照C++11标准编写的,它涵盖了C++语言的核心特性,包括数据类型、运算符、控制结构、函数、类...

    c++primer第五版习题答案(第18章)

    《C++ Primer》是一本经典的C++学习教程,第五版是该书的最新版本,涵盖了C++11至C++14标准的最新特性。在IT行业中,掌握C++的重要性不言而喻,因此,这本书以及它的习题集被许多程序员和开发者用作学习和提升技能的...

    c++primer第五版习题答案(第13章)

    根据提供的文件信息,文件标题为“c++primer第五版习题答案(第13章)”,描述提到这是“c++primer第五版中文版课后答案(第13章)”的PDF格式文件,且这些答案来自书籍的习题集。同时,文件内容是通过OCR技术从纸质...

    C++Primer 习题解答(第4版)--绝对完整版

    《C++ Primer 习题解答(第4版)》是一本深入C++编程语言的实践指导书籍,由Lippman, Lajoie, 和 Moo三位专家编写。这本习题解答是针对C++ Primer(第四版)教材的,旨在帮助读者巩固和深化对C++的理解。在学习C++的...

    C++Primer(第4版)-课后习题答案.pdf

    12. 第十二章类和数据抽象:讲解面向对象编程的核心概念,如类的定义、封装、构造函数、成员函数、友元等。 13. 第十三章复制控制:探讨对象的创建、复制和销毁,包括拷贝构造函数、赋值运算符重载以及浅拷贝和深...

    c++primer第五版习题答案(第19章)

    标题《c++primer第五版习题答案(第19章)》和描述《c++primer第五版中文版课后答案(第19章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚》透露出的IT知识点主要围绕《C++ ...

    c++ primer 第十五章 文本查询程序

    总结来说,C++ Primer第十五章的文本查询程序涵盖了文件操作、数据结构(如二叉搜索树和字典树)、错误处理、用户交互以及文本预处理等多个核心知识点。通过实际编写和分析这样的程序,你不仅可以深化对C++语言的...

    C++ Primer Plus 编程练习源码工程 第15章

    《C++ Primer Plus 编程练习源码工程 第15章》是针对C++初学者的一个宝贵资源,它包含了作者LeonardoLiuwenbo在学习《C++ Primer Plus》这本经典教材时所做的编程练习。这个章节聚焦于C++语言的深入特性,旨在通过...

    C++Primer 第四版课后习题解答(第1~18章完整答案)完整版

    第十二章“类和数据抽象”介绍了面向对象编程的基础,如封装、继承和多态。习题解答将涉及类的设计、对象的创建和使用,以及虚函数和抽象类的应用。 第十三章“复制控制”讲解了构造函数、析构函数、拷贝构造函数和...

    C++ primer Query(15章第九节)

    《C++ Primer 5th 第15章第九节——深入查询操作》 在C++编程中,查询(Query)操作是程序设计中的一个重要环节,它涉及到如何从数据结构或数据库中检索特定信息。《C++ Primer 5th》是C++编程领域的经典教材,其第...

    C++ Primer Plus(第六版) 7-18章 习题答案

    这一章扩展了第十五章的内容,深入探讨了如何使用文件流读写文件,包括文本文件和二进制文件的处理,以及文件的打开模式。 第十七章:回顾与展望 这一章是对前面章节的复习,总结了C++的主要特性,并为更深入的学习...

    C++ primer中文版-高清-带目录

    《C++ Primer中文版》是一本为初学者设计的C++编程教材,旨在帮助读者深入理解和掌握C++语言。这本书的高清版本提供了清晰的文本和图表,使得阅读体验更佳,尤其适合长时间学习和查阅。目录的存在使得学习者能够快速...

    c++primer高清中文版-第5版.zip

    但又是如此美妙的编程语言,在工业界和学术界都可以使用,《C++ Primer(第5版)》即针对初学者,也同样适用于有一定编程经验的读者,第5版配备了C++11新标准,是C++粉丝们书架上必备的一本经典著作。一书在手,架构...

    c++primer plus第十章 代码

    《C++ Primer Plus》是C++编程领域里一本广受欢迎的教材,它的第十章主要讲解了C++中的类和对象,这是C++的核心概念之一。在这个章节中,你会接触到类的定义、对象的创建与使用、封装、继承、多态等关键知识点。现在...

    c++primer第五版习题答案(第11章)

    c++primer第五版中文版课后答案(第11章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚

    C++Primer视频(高级)下载地址

    25.15章 定义基类和派生类 26.15章 动态绑定 27.15章 三种继承 28.15章 派生类的构造函数和析构函数 29.15章 转换与继承 30.15章 友元与继承 31.15章 静态成员与继承 32.15章 纯虚函数与抽象类 33....

    c++ primer plus 答案 c++ primer plus 答案

    C++是一种通用的、面向对象的编程语言,由Bjarne Stroustrup于1979年在贝尔实验室创建,它是C语言的增强版,引入了类、模板、命名空间和异常处理等特性,使得编程更加灵活和高效。C++的设计理念是让程序员能够以低级...

    C++ primer 5th,第十一章——关联容器

    C++ primer 5th,第十一章——关联容器,笔记&思维导图 按教材整理。

Global site tag (gtag.js) - Google Analytics