首页 > 编程语言 >c++综合实验报告友元

c++综合实验报告友元

时间:2024-05-05 22:55:38浏览次数:15  
标签:友元 int double c++ Score Student 实验报告 display

综合性、设计性实验报告

专业:计算机科学与技术 

一、实验目的:

1.熟练掌握友元函数和友元类设计的方法

2.掌握友元函数的含义,友元函数和成员函数的区别。

3.掌握友元类的含义。

二、实验仪器或设备:微型计算机

三、总体设计(设计原理、设计方案及流程等)

实验内容:

定义Student类和Score类,输出一个学生的成绩单(包括学号、姓名、高等数学、英语成绩)。

【要求:】

方法1:非成员函数作为友元函数

方法2:成员函数作为友元函数

方法3:友元类

本实验运行环境:Microsoft Visual c++ 2010学习版,采用面向对象的程序设计方法。

四、实验步骤(包括主要步骤、代码分析等)

方法1://非成员函数作为友元函数
#include<iostream>
#include<cstring>
using namespace std;
class Score;
class Student
{ private:
int number;
char name[8];
public:
Student(int num,char na[8]);
friend void display(Student &x);

};

class Score
{
private:
double math;
double english;
public:
Score(double m,double e);
friend void display(Score &s);
};


Student::Student(int num,char na[])
{
number=num;
strcpy(name,na);
}
Score::Score(double m,double e)
{
math=m;
english=e;
}
void display(Student &x)
{
cout<<"该学生的信息 \n学号num: "<< x.number<<" 名字name: "<<x.name<<"\n";
}
void display(Score &s)
{

cout<<"该学生的高考成绩math: "<<s.math<<"分 英语成绩english: "<<s.english<<"分\n";
}
int main()
{
Student st1(123456,"小陈");
Score sc1(100,123);
display(st1) ;
display(sc1) ;
return 0;
}

方法2://成员函数作为友元函数

#include<iostream>

#include<cstring>

using namespace std;

class Score;

class Student

{

private:

int number;

char name[8];

public:

Student(int num,char na[8]);

void display(Score &s);

};

class Score

{

private:

double math;

double english;

public:

Score(double m,double e);

friend void Student::display(Score &s);

};

Student::Student(int num,char na[])

{

number=num;

strcpy(name,na);

}

Score::Score(double m,double e)

{

math=m;

english=e;

}

void Student::display(Score &s)

{

cout<<"该学生的信息 \n学号num: "<<number<<" 名字name: "<<name<<"\n";

cout<<"该学生的高考成绩math: "<<s.math<<"分 英语成绩english: "<<s.english<<"分\n";

}

int main()

{

Student st1(123456,"小陈");

Score sc1(100,123);

st1.display(sc1) ;

return 0;

}

方法3://友元类

#include<iostream>

#include<cstring>

using namespace std;

class Score;

class Student {

private:

int number;

char name[8];

public:

Student(int num,char na[8]);

void display(Score &s);

};

class Score {

private:

double math;

double english;

public:

Score(double m,double e);

friend Student;

};

Student::Student(int num,char na[]) {

number=num;

strcpy(name,na);

}

Score::Score(double m,double e) {

math=m;

english=e;

}

void Student::display(Score &s) {

cout<<"该学生的信息 \n学号num: "<<number<<" 名字name: "<<name<<"\n";

cout<<"该学生的高考成绩math: "<<s.math<<"分 英语成绩english: "<<s.english<<"分\n";

}

int main() {

Student st1(12345116,"小中");

Score sc1(107,123);

st1.display(sc1) ;

return 0;

}

五、结果分析与总结

方法1:

方法2:

方法3:

(运行结果截图,简短的体会总结)

简短的体会总结:非成员函数作为友元函数适用于封装与类相关但不属于类的逻辑;成员函数作为友元函数适用于在不同类之间实现紧密耦合和协作;而友元类则适用于需要深度交互和合作的两个类之间。

标签:友元,int,double,c++,Score,Student,实验报告,display
From: https://www.cnblogs.com/LCGJ/p/18174036

相关文章

  • C++模板
    C++模板C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为Object的泛型基类,而是包含未指......
  • Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速
    一、前言最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速。这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放。实时视频流是不可能倍速的,因为没有时长,有时长的才可以按照播放进度来。是否是文件也不能通......
  • C++ 抽象类快速使用
    在C++中,你可以通过在类定义中使用纯虚函数(purevirtualFunction)来创建一个抽象类。这里的“抽象”意味着这个类不能被实例化,即你不能创建这个类的对象。在C++中,你可以通过在类定义中使用纯虚函数(purevirtualFunction)来创建一个抽象类。这里的“抽象”意味着这个类不能被实例化......
  • C++ lambda的重载
    先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道)。而且即使代码完全一样的两个lambda也会有完全不同的类型。但虽然不能直接实现lambda重载,我们有办法去模拟。在介绍怎么模拟之前,我们先看看c++里的functor是怎么重载的。首先类的函数调用运算符是可以重载......
  • C++-研讨会(全)
    C++研讨会(全)原文:annas-archive.org/md5/5ba4b421a6ba3d7c3a23406bab386ec0译者:飞龙协议:CCBY-NC-SA4.0前言关于本书C#是一种强大而多才多艺的面向对象编程(OOP)语言,可以打开各种职业道路。但是,与任何编程语言一样,学习C#可能是具有挑战性的。由于有各种不同的资源可用,很难......
  • C++-专家编程(全)
    C++专家编程(全)原文:annas-archive.org/md5/57ea316395e58ce0beb229274ec493fc译者:飞龙协议:CCBY-NC-SA4.0前言学习路径和技术简介。这个学习路径适合谁这个学习路径适合想要提升并学习如何在最新版本的Java中构建健壮应用程序的Java开发人员。这个学习路径涵盖了什......
  • C++-游戏动画编程实用指南(全)
    C++游戏动画编程实用指南(全)原文:annas-archive.org/md5/1ec3311f50b2e1eb4c8d2a6c29a60a6b译者:飞龙协议:CCBY-NC-SA4.0前言现代游戏动画有点像黑魔法。没有太多资源详细介绍如何构建基于轨道驱动的动画系统,或者高级主题,比如双四元数蒙皮。这本书的目标就是填补这个空白。......
  • 【转载】Godot-GDExtension C++ 环境搭建 (Docker+MinGW/跨平台)
    本文原链接见 Godot-GDExtensionC++环境搭建(Docker+MinGW/跨平台)|Convexwf'sKirakiraBlog。Godot在4.X之后推出了GDExtension,通过第三方绑定扩展功能,目前官方支持的语言只有C++。通过使用GDExtensionC++编写扩展插件,可以作为库文件在Godot中交互使用。GDExten......
  • UE4 C++ 杂
    TMap中的Find和FindRef在对蓝图节点进行C++重写时,发现UE对于TMap的Find有很多方式。首先是基础的Find,其就是返回对象类型的指针,如果不存在于TMap中其会返回nullptr接下来是FindChecked,其返回的是对象类型的引用,并且会在内部检测指针是否为空,如果没有会触发断言FindRef其......
  • c++继承两个类怎么实现
    在C++中,继承两个类可以通过多重继承来实现。多重继承允许一个派生类从多个基类继承属性和方法。以下是一个继承两个类的示例:#include<iostream>//第一个基类classBase1{public:voidmethod1(){std::cout<<"Base1method1"<<std::endl;}};//......