c++友元类 如何使用,请你举一个代码实例说明
时间: 2024-10-17 08:06:09 浏览: 9
C++中的友元类是指一个类将另一个类声明为它的友元,这样这个友元类就可以访问原类的私有和保护成员。下面是一个简单的示例:
```cpp
#include <iostream>
class B; // 前向声明
class A {
private:
int x;
public:
A(int val) : x(val) {}
friend class B; // 声明B为A的友元类
};
class B {
public:
void setX(A& a, int val) {
a.x = val; // 可以访问A的私有成员x
}
};
int main() {
A a(10);
B b;
b.setX(a, 20);
std::cout << "A的x值为: " << a.x << std::endl; // 输出A的x值为: 20
return 0;
}
```
在这个例子中,类A有一个私有成员变量`x`,我们通过声明类B为A的友元类,使得类B的成员函数`setX`可以直接访问类A的私有成员`x`。在`main`函数中,我们创建了类A和类B的对象,并通过类B的成员函数`setX`修改了类A的私有成员`x`的值。
相关问题
声明一个学生类,包含学生的学号、姓名、性别、C++成绩;声明一个教师类,包含教工号、姓名、职称;声明一个领导类,包含领导的工号、姓名和职位;实例化每个类的对象一个,声明一个show函数为这三个类的友元函数,分别显示其详细信息。且分析其代码的优劣
好的,这是一个问题,我将根据你的要求回答。下面是实现这个问题的代码:
```c++
#include <iostream>
#include <string>
using namespace std;
class Teacher; // 前置声明
class Student {
private:
int id;
string name;
string gender;
float cppScore;
public:
Student(int id, string name, string gender, float cppScore) {
this->id = id;
this->name = name;
this->gender = gender;
this->cppScore = cppScore;
}
friend void show(Student s, Teacher t, Leader l);
};
class Teacher {
private:
int id;
string name;
string title;
public:
Teacher(int id, string name, string title) {
this->id = id;
this->name = name;
this->title = title;
}
friend void show(Student s, Teacher t, Leader l);
};
class Leader {
private:
int id;
string name;
string position;
public:
Leader(int id, string name, string position) {
this->id = id;
this->name = name;
this->position = position;
}
friend void show(Student s, Teacher t, Leader l);
};
void show(Student s, Teacher t, Leader l) {
cout << "学生信息:" << endl;
cout << "学号:" << s.id << endl;
cout << "姓名:" << s.name << endl;
cout << "性别:" << s.gender << endl;
cout << "C++成绩:" << s.cppScore << endl;
cout << "教师信息:" << endl;
cout << "教工号:" << t.id << endl;
cout << "姓名:" << t.name << endl;
cout << "职称:" << t.title << endl;
cout << "领导信息:" << endl;
cout << "工号:" << l.id << endl;
cout << "姓名:" << l.name << endl;
cout << "职位:" << l.position << endl;
}
int main() {
Student s(1001, "张三", "男", 95.5);
Teacher t(2001, "李四", "教授");
Leader l(3001, "王五", "校长");
show(s, t, l);
return 0;
}
```
这段代码实现了题目要求的内容,将学生、教师和领导三个类实例化为对象,并实现一个名为show的友元函数,显示每个对象的详细信息。
这段代码的优点是:
1. 代码结构清晰,将每个类的定义和实现分开,易于后期维护和扩展;
2. 代码使用友元函数实现了类之间的信息共享,使得代码的可读性更强;
3. 代码使用了面向对象编程的思想,将每个类封装成一个对象,并定义了相应的构造函数,使得代码更加模块化和可复用。
这段代码的缺点是:
1. 友元函数的使用需要小心,因为它会破坏类的封装性,所以需要在使用时考虑清楚;
2. 代码中没有对输入的数据进行检查和处理,容易导致程序崩溃或者输出错误的结果;
3. 代码中使用了using namespace std;语句,这样虽然方便了代码的书写,但同时也会导致命名空间的混乱,容易引起命名冲突的问题。
1、声明一个学生类,包含学生的学号、姓名、性别、C++成绩;声明一个教师类,包含教工号、姓名、职称;声明一个领导类,包含领导的工号、姓名和职位;实例化每个类的对象一个,声明一个show函数为这三个类的友元函数,分别显示其详细信息。
好的,以下是代码实现:
```c++
#include <iostream>
#include <string>
using namespace std;
// 学生类
class Student {
private:
int id; // 学号
string name; // 姓名
string gender; // 性别
double cppScore; // C++成绩
public:
Student(int id, string name, string gender, double cppScore) {
this->id = id;
this->name = name;
this->gender = gender;
this->cppScore = cppScore;
}
friend void show(Student stu, Teacher tea, Leader leader);
};
// 教师类
class Teacher {
private:
int id; // 教工号
string name; // 姓名
string title; // 职称
public:
Teacher(int id, string name, string title) {
this->id = id;
this->name = name;
this->title = title;
}
friend void show(Student stu, Teacher tea, Leader leader);
};
// 领导类
class Leader {
private:
int id; // 工号
string name; // 姓名
string position; // 职位
public:
Leader(int id, string name, string position) {
this->id = id;
this->name = name;
this->position = position;
}
friend void show(Student stu, Teacher tea, Leader leader);
};
// 友元函数,显示三个类的详细信息
void show(Student stu, Teacher tea, Leader leader) {
cout << "学生信息:" << endl;
cout << "学号:" << stu.id << endl;
cout << "姓名:" << stu.name << endl;
cout << "性别:" << stu.gender << endl;
cout << "C++成绩:" << stu.cppScore << endl;
cout << "教师信息:" << endl;
cout << "教工号:" << tea.id << endl;
cout << "姓名:" << tea.name << endl;
cout << "职称:" << tea.title << endl;
cout << "领导信息:" << endl;
cout << "工号:" << leader.id << endl;
cout << "姓名:" << leader.name << endl;
cout << "职位:" << leader.position << endl;
}
int main() {
Student stu(20210001, "小明", "男", 90.5);
Teacher tea(10001, "张老师", "教授");
Leader leader(2001, "李领导", "部门主管");
show(stu, tea, leader);
return 0;
}
```
以上代码定义了三个类:学生类、教师类和领导类,每个类中包含一些属性和构造函数,同时定义了一个友元函数show,该函数可以访问三个类的对象的私有属性,用来显示详细信息。在主函数中实例化了一个学生对象、一个教师对象和一个领导对象,然后调用show函数显示它们的详细信息。
阅读全文