一个类构造函数能否声明友元类为另一个类的友元函数

c++程序设计例题及答案(前面是例题后面是对应答案) -五星文库
免费文档下载
c++程序设计例题及答案(前面是例题后面是对应答案)
导读:第2章2-43编写一个程序,程序输出相应的摄氏温度,2-60采用动态内存分配方法设计一个学生成绩处理程序,2-81一个程序由两个C++源文件组成,(包含例题(2-25)第三章3-39一个名为CPerson的类有以下属性:姓名、,3-40(43)设计一个日期类CDate,3-43设计一个日期类CDate,3-47设计一个类Time(时间),再设计一个日期类Date,3-63设计一个日期类CDat
编写一个程序,输入三角形的三个边的边长,求三角形的面积。2-44
从键盘输入一个大写字母,然后改用小写字母在屏幕上输出。2-46
把华氏温度转换为摄氏温度的计算公式是:c=(5/9)×(F-32)。编写一个程序,用户输入一个华氏温度,程序输出相应的摄氏温度。要求将32和5/9用户const型变量表示。2-53
编程求两个复数的和。2-60
采用动态内存分配方法设计一个学生成绩处理程序,要求输入任意数量学生的学号、姓名和4门课的成绩,并按平均成绩高低输出每个学生的姓名和成绩。2-67
分别使用for语句、while语句、do-while 语句编程求50以内的自然数之和。2-71
输入n 个整数,利用冒泡排序法将它们从小到大排序,并在屏幕上输出。2-77
首先编写以下函数声明的函数:void swap(float
*py),该函数用于交换两个实型变量的值,然后编写一个主函数验证函数swap() 功能。2-79
首先编写一个选择排序函数,然后在主函数中调用排序函数对10个整数从小到大进行排序。提示:采用数组名作为函数参数。选择排序:每一趟从待排序的序列中选出一个最小的数据。2-80
用指针作为函数参数编写冒泡排序函数:BubbleSort(int * pArray,int n),在主函数中以指针作为实参调用函数BubbleSort(), 从而对一个数组的元素进行排序。2-81
一个程序由两个C++源文件组成,在一个源文件中定义主函数main() 并声明一个外部整型变量n,在另一个源文件中定义一个不带参数的函数factorial(void),该函数用于计算变量n的阶乘。编程在主函数main() 中输入一个整数并求它的阶乘。2-83
函数的参数传递方式有“单向值传递”、“按地址传递”和“引用传递”三种方式, 请采用内联函数的方法实现实参和形参的按地址传递。(包含例题(2-25)第三章3-39
一个名为CPerson的类有以下属性:姓名、身份证号、性别和年龄,请用C++语言定义这个类,并为上述属性定义相应的方法。3-40(43) 设计一个日期类CDate,该类用于表示日期值(年、月、日)。要求除了能够通过相应的成员函数设置和获取日期值外,还能够实现将日期加一天的操作。3-41(42) 建立一个名为CStudent的类,该类有以下几个私有成员变量:学生姓名、学号、性别和年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数,声明一个学生对象,然后调用成员函数在屏幕输出学生信息。3-42
建立一个名为CStudent的类,该类有以下几个私有成员变量:学生姓名、学号、性别和年龄。有以下
两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。此外还有一个静态成员变量,用于表示已创建对象的数量;有两个静态成员函数,一个用于输出已创建对象的数量,一个用于输出一个学生的姓名和学号。编写一个主函数,声明一个学生对象,然后调用成员函数在屏幕输出学生信息。3-43
设计一个日期类CDate,该类用于表示日期值(年、月、日)。要求除了能够通过相应的成员函数设置和获取日期值外,还能够用友元函数实现将日期加一天的操作。3-44
建立一个名为CStudent的类,该类有以下几个私有成员变量:学生姓名、学号、性别和年龄。有一个成员函数:用于初始化学生姓名、学号、性别和年龄的构造函数。还有一个用于输出学生信息的友元函数。编写一个主函数,声明一个学生对象,然后调用友元函数在屏幕输出学生信息。3-45
一个名为CPerson的类有以下属性:姓名、身份证号、性别和年龄,请用C++语言定义这个类,并为上述属性定义相应的方法。然后从CPerson类中派生出类CEmployee(雇员),派生类CEmployee增加了两个新的数据成员,分别用于表示部门和薪水。要求派生类CEmployee的构造函数显式调用基类CPerson的构造函数,可根据需要为派生类增加新的成员函数。3-46
建立一个CPoint类,该类有两个私有成员变量x,y,表示点的坐标。有一个构造函数用于设置坐标,还有两个公有的成员函数:分别用于获取x和y 的坐标。由CPoint派生出CCircle类,派生类CCircle增加一个私有成员变量用于表示半径,并用派生类的构造函数设置半径,同时增加三个成员函数:一个用于获取半径,另两个分别用于获取圆外接正方形左上角的x坐标和y坐标。3-47
设计一个类Time(时间),该类用于表示时间值(时、分、秒)。要求能设置时间和输出时间。再设计一个日期类Date,该类用于表示日期值(年、月、日)。要求除了能够通过相应的成员函数设置和获取日期值外,还能够实现将日期加一天的操作。利用建立的日期类和时间类多重派生出日期时间类DateTime,并实现日期和时间的设置和输出。3-49
设类X分别派生出类Y和类Z,类Y和类Z又共同派生出类W,请用虚基类方式定义这些类。要求为类简单添加一些成员,并编写main()函数进行验证。3-52
首先定义类CPoint类,该类有两个保护成员变量x,y,表示点的坐标。有一个构造函数用于设置坐标并输出点坐标,一个析构函数,用于输出点坐标。由CPoint派生出CCircle类,派生类CCircle增加一个保护成员变量用于表示半径;并用派生类的构造函数设置半径
和显示点坐标以及半径;析构函数用于显示点坐标以及半径。再由CCircle类派生出CCylinder类,派生类CCylinder增加一个保护成员变量用于表示高度;构造函数设置高度,并显示高度、半径和点坐标;析构函数显示高度、半径和点坐标。为类CPoint、类CCircle和类Cctlinder添加计算面积的成员函数Area(),要求函数Area()采用虚函数的形式,并通过基类指针调用虚函数Area()。3-53
首先定义类CPoint类,该类有两个保护成员变量x,y,表示点的坐标。有一个构造函数用于设置坐标并输出点坐标,一个析构函数,用于输出点坐标。由CPoint派生出CCircle类,派生类CCircle增加一个保护成员变量用于表示半径;并用派生类的构造函数设置半径和显示点坐标以及半径;析构函数用于显示点坐标以及半径。再由CCircle类派生出CCylinder类,派生类CCylinder增加一个保护成员变量用于表示高度;构造函数设置高度,并显示高度、半径和点坐标;析构函数显示高度、半径和点坐标。要求三个类的析构函数采用虚析构函数来实现,并编写代码验证所完成的功能。3-56
用函数重载形式编写函数square():求一个int型或double型参数的平方。3-58
建立一个名为CStudent的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄和高等数学、英语、操作系统、数据结构等4门课的分数和总成绩。还有以下成员函数:用于初始化学生姓名、学号、性别和年龄的构造函数,用于初始化学生姓名、学号、性别、年龄和4门课分数的构造函数,输入4门课分数的函数,计算学生总成绩的函数,输出学生信息的函数。编写一个主函数,调用第一个构造函数声明一个学生对象并输入其4门课的分数,再调用新增加的构造函数声明另一个学生对象。最后分别计算两个学生的总分,并在屏幕输出两个学生的所有信息。3-59
建立一个名为CStudent的类,该类有以下几个私有成员变量:学生姓名、学号、性别和年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。采用类继承的方法,在派生的新类中增加几个私有成员变量:高等数学、英语、操作系统、数据结构等4门课的分数和总成绩。修改或重新定义以下成员函数:用于初始化学生姓名、学号、性别、年龄和4门课分数的构造函数,输入4门课分数的函数,计算学生总成绩的函数,输出学生信息的函数。编写一个主函数,调用继承的构造函数声明一个学生对象并输入其4门课的分数,再调用新增加的构造函数声明另一个学生对象。最后分别计算两个学生的总分,并在屏幕输出两个学
生的所有信息。3-60
建立一个名为CTeacher的类,该类有以下成员变量:教师姓名、ID号、基本工资、奖金、所得税和实际发放数。还有以下成员函数:两个构造函数,一个用于只初始化教师姓名和ID号,一个用于初始化教师姓名、ID号、基本工资、奖金和所得税;一个输入基本工资、奖金和所得税的函数;一个计算实际发放数的函数;一个输出教师信息的函数。编写主函数,调用第一个构造函数声明一个教师对象并输入其工资,再调用第二个构造函数声明一个教师对象。最后分别计算两个教师的实际发放数,并在屏幕输出。3-61
建立一个名为CTeacher的类,该类有以下成员变量:教师姓名、ID号、基本工资、奖金、所得税和实际发放数。还有以下成员函数:两个构造函数,一个用于只初始化教师姓名和ID号,一个用于初始化教师姓名、ID号、基本工资、奖金和所得税;一个输入基本工资、奖金和所得税的函数;一个计算实际发放数的函数;一个输出教师信息的函数,两个Add()成员函数,一个用于将其他教师的工资加到该教师(如该教师替其他教师代课),一个函数用于将一个数值加到该教师(如提高该教师的工资)。编写主函数,调用第一个构造函数声明一个教师对象并输入其工资,再调用第二个构造函数声明一个教师对象。最后分别计算两个教师的实际发放数,在屏幕输出,并编写代码验证两个Add()函数的功能。3-62
定义矢量类型,给出平面上两个矢量的加法和减法运算。要求利用非成员函数重载运算符“+”,利用成员函数重载运算符“-”。3-63
设计一个日期类CDate,该类用于表示日期值(年、月、日)。要求除了能够通过相应的成员函数设置和获取日期值外,还能够用重载运算符“++”的方法实现将日期加一天的操作。3-64
建立一个名为CTeacher的类,该类有以下成员变量:教师姓名、ID号、基本工资、奖金、所得税和实际发放数。还有以下成员函数:两个构造函数,一个用于只初始化教师姓名和ID号,一个用于初始化教师姓名、ID号、基本工资、奖金和所得税;一个输入基本工资、奖金和所得税的函数;一个计算实际发放数的函数;一个输出教师信息的函数,两个重载运算符“+”,一个用于将其他教师的工资加到该教师(如该教师替其他教师代课),一个函数用于将一个数值加到该教师(如提高该教师的工资)。编写主函数,调用第一个构造函数声明一个教师对象并输入其工资,再调用第二个构造函数声明一个教师对象。最后分别计算两个教师的实际发放数,在屏幕输出,并编写代码验证两个重载运算符“+”
包含总结汇报、办公文档、党团工作、教程攻略、专业文献、外语学习、IT计算机、计划方案以及c++程序设计例题及答案(前面是例题后面是对应答案) 等内容。本文共6页
相关内容搜索[切换科目]
以下试题来自:
单项选择题下面关于友元的说法中错误的是(
)。A.友元函数可以访问类中的所有数据成员B.友元函数不可以在类内部定义C.友元类的所有成员函数都是另一个类友元函数D.友元函数必须声明在public区
为您推荐的考试题库
你可能感兴趣的试题
1A.仅ⅠB.仅Ⅰ、ⅡC.都是D.都不是2A.8B.16C.32D.153A.多态B.继承C.类D.过程调用4A.队列B.线性表C.二叉树D.栈5A.111B.123C.222D.333
热门相关试卷
最新相关试卷友元函数 -
分清成员函数成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。()举例看下面表示有理数的一个类:class rational {public:rational(int numerator = 0,int denominator = 1);int numerator()int denominator()private:...};这是一个没有一点用处的类。(用条款18的术语来说,接口的确最小,但远不够完整。)所以,要对它增加加,减,乘等算术操作支持,但是,该用成员函数还是非成员函数,或者,非成员的友元函数来实现呢?当拿不定主意的时候,用面向对象的方法来考虑!有理数的乘法是和rational类相联系的,所以,写一个成员函数把这个操作包到类中。class rational {public:...const rational operator*(const rational& rhs)};(如果你不明白为什么这个函数以这种方式声明——返回一个const值而取一个const的引用作为它的参数——参考条款21-23。)条款21: 尽可能使用const条款22: 尽量用“传引用”而不用“传值”条款23: 必须返回一个对象时不要试图返回一个引用可以很容易地对有理数进行乘法操作:rational oneeighth(1,8);rational onehalf(1,2);rational result = onehalf * // 运行良好result = result * // 运行良好但不要满足,还要支持混合类型操作,比如,rational要能和int相乘。但当写下下面的代码时,只有一半工作:result = onehalf * 2; // 运行良好result = 2 * // 出错!这是一个不好的苗头。记得吗?乘法要满足交换律。如果用下面的等价函数形式重写上面的两个例子,问题的原因就很明显了:result = onehalf.operator*⑵; // 运行良好result = 2.operator*(onehalf); // 出错!对象onehalf是一个包含operator*函数的类的实例,所以编译器调用了那个函数。而整数2没有相应的类,所以没有operator*成员函数。编译器还会去搜索一个可以象下面这样调用的非成员的operator*函数(即,在某个可见的名字空间里的operator*函数或全局的operator*函数):result = operator*(2,onehalf); // 错误!但没有这样一个参数为int和rational的非成员operator*函数,所以搜索失败。再看看那个成功的调用。它的第二参数是整数2,然而rational::operator*期望的参数却是rational对象。怎么回事?为什么2在一个地方可以工作而另一个地方不行?秘密在于隐式类型转换。编译器知道传的值是int而函数需要的是rational,但它也同时知道调用rational的构造函数将int转换成一个合适的rational,所以才有上面成功的调用(见条款m19)。换句话说,编译器处理这个调用时的情形类似下面这样:const rational temp⑵; // 从2产生一个临时// rational对象result = onehalf * // 同onehalf.operator*(temp);当然,只有所涉及的构造函数没有声明为explicit的情况下才会这样,因为explicit构造函数不能用于隐式转换,这正是explicit的含义。如果rational象下面这样定义:class rational {public:explicit rational(int numerator = 0,// 此构造函数为int denominator = 1); // explicit...const rational operator*(const rational& rhs)...};那么,下面的语句都不能通过编译:result = onehalf * 2; // 错误!result = 2 * // 错误!这不会为混合运算提供支持,但至少两条语句的行为一致了。例子结论然而,我们刚才研究的这个类是要设计成可以允许固定类型到rational的隐式转换的——这就是为什么rational的构造函数没有声明为explicit的原因。这样,编译器将执行必要的隐式转换使上面result的第一个赋值语句通过编译。实际上,如果需要的话,编译器会对每个函数的每个参数执行这种隐式类型转换。但它只对函数参数表中列出的参数进行转换,决不会对成员函数所在的对象(即,成员函数中的*this指针所对应的对象)进行转换。这就是为什么这个语句可以工作:result = onehalf.operator*⑵; // converts int -> rational而这个语句不行:result = 2.operator*(onehalf); // 不会转换// int -> rational第一种情形操作的是列在函数声明中的一个参数,而第二种情形不是。尽管如此,你可能还是想支持混合型的算术操作,而实现的方法应该清楚了:使operator*成为一个非成员函数,从而允许编译器对所有的参数执行隐式类型转换:class rational {... // contains no operator*};// 在全局或某一名字空间声明,// 参见条款m20了解为什么要这么做const rational operator*(const rational& lhs,const rational& rhs){return rational(lhs.numerator() * rhs.numerator(),lhs.denominator() * rhs.denominator());}rational onefourth(1,4);result = onefourth * 2; // 工作良好result = 2 * // 万岁,它也工作了!这当然是一个完美的结局,但还有一个担心:operator*应该成为rational类的友元吗?这种情况下,答案是不必要。因为operator*可以完全通过类的公有(public)接口来实现。上面的代码就是这么做的。只要能避免使用友元函数就要避免,因为,和现实生活中差不多,友元(朋友)带来的麻烦往往比它(他/她)对你的帮助多。成员的函数然而,很多情况下,不是成员的函数从概念上说也可能是类接口的一部分,它们需要访问类的非公有成员的情况也不少。让我们回头再来看看本书那个主要的例子,string类。如果想重载operator>>;和operator<<;来读写string对象,你会很快发现它们不能是成员函数。如果是成员函数的话,调用它们时就必须把string对象放在它们的左边:// 一个不正确地将operator>>;和// operator<<;作为成员函数的类class string {public:string(const char *value);...istream& operator>>(istream& input);ostream& operator<<(ostream& output);private:char *};s >> // 合法,但// 有违常规s << // 同上这会把别人弄糊涂。所以这些函数不能是成员函数。注意这种情况和前面的不同。这里的目标是自然的调用语法,前面关心的是隐式类型转换。正确用法istream& operator>>(istream& input,string& string){delete [] string.read from input into some memory,and make string.datapoint to it}ostream& operator<<(ostream& output,const string& string){return output << string.}注意上面两个函数都要访问string类的data成员,而这个成员是私有(private)的。但我们已经知道,这个函数一定要是非成员函数。这样,就别无选择了:需要访问非公有成员的非成员函数只能是类的友元函数。本条款得出的结论假设f是想正确声明的函数,c是和它相关的类:·虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数。·operator>>;和operator<>;或operator<<;,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。·只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。·其它情况下都声明为成员函数。如果以上情况都不是,让f成为c的成员函数。
友元函数 -
形式friend 类型名 友元函数名(形参表);然后在类体外对友元函数进行定义,定义的格式和普通函数相同,但可以通过对象作为参数直接访问对象的私有成员说明如下:1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;3)友元函数不能直接访问类的成员,只能访问对象成员,4)友元函数可以访问对象的私有成员,但普通函数不行;5)调用友元函数时,在实际参数中需要指出要访问的对象,6)类与类之间的友元关系不能继承。7)一个类的成员函数也可以作为另一个类的友元,但必须先定义这个类。
万方数据期刊论文
牡丹江教育学院学报
万方数据期刊论文
甘肃广播电视大学学报
万方数据期刊论文
南通工学院学报(自然科学版)
为本词条添加和相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
您也可以使用以下网站账号登录:
此词条还可添加&
编辑次数:6次
参与编辑人数:6位
最近更新时间: 07:11:00
贡献光荣榜
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品> 问题详情
下列各类函数中,不是类的成员函数的是A.构造函数B.析构函数C.友元函数D.拷贝构造函数
悬赏:0&答案豆
提问人:匿名网友
发布时间:
下列各类函数中,不是类的成员函数的是A.构造函数B.析构函数C.友元函数D.拷贝构造函数
网友回答(共0条)
我有更好的答案
您可能感兴趣的试题
1在多继承中,公用派生和私有派生对于基类成员在派生类中的可访问性与单继承规则A.完全相同B.完全不同C.部分相同,部分不同D.以上都不对2已知类A有公用数据成员a,并重载了=运算符,且有A obj2;const A * ptr= new A;则下列语句错误的是A.ptr->a=100;B.ptr=&obj2;C.ptr++;D.obj2=*
相关考试课程
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……

我要回帖

更多关于 声明友元类 的文章

 

随机推荐