#include<iostream> using namespace std; class student; class teacher { public: int a = 1; student *p; teacher(int a); ~teacher(); }; teacher::teacher(int a) :a(a) { cout << "teacher构造函数调用" << endl; ///p = new student; } teacher::~teacher() { cout << "teacher析构函数调用" << endl; } class student { public: //友元函数可以访问类中的公有和私有成员,不可以访问保护成员 friend void func2(student &s); friend class teacher; int a = 10; student(int x); ~student(); void func3(); private: int b = 20; }; student::student(int x) :a(x) { cout << "student 构造函数调用1" << endl; } student::~student() { cout << "student 析构函数调用!" << endl; } void student::func3() { cout << b << endl; } void func1() { student s1(100); cout << s1.a << endl; s1.func3(); func2(s1); cout << s1.a << endl; } //友元函数,全局函数做友元 //在形参中加入const防止传入的参数被改变,不加const则可以改变 void func2( student &s) { //传入普通类对象不可以改变类中的值,只能改变形参类的值 /*s.a = 123; cout<<s.a << endl; cout << s.b << endl;*/ ////传入指针可以改变类的值 /*s->a = 1000; s->b = 123; cout << s->a << endl; cout << s->b << endl;*/ ///传入引用也可以改变类中的值 //s.a = 12345; //s.b = 123456; cout << s.a << endl; cout << s.b << endl; } //类做友元 void func3() { student s1(10); cout << s1.a << endl; teacher t1(100); cout << t1.a << endl; cout << t1.p->a<< endl; } int main() { //成员函数做友元 //func1(); //类做友元 func3(); system("pause"); return 0; }
时间: 2024-03-12 10:43:25 浏览: 57
在 `teacher` 类的构造函数中,你注释掉了分配内存的语句:
```c++
teacher::teacher(int a) :a(a)
{
cout << "teacher构造函数调用" << endl;
///p = new student;
}
```
因此,在 `teacher` 类的析构函数中,不需要释放任何内存:
```c++
teacher::~teacher()
{
cout << "teacher析构函数调用" << endl;
}
```
如果你想要在 `teacher` 类的构造函数中为 `p` 分配内存,需要取消注释这一行代码:
```c++
teacher::teacher(int a) :a(a)
{
cout << "teacher构造函数调用" << endl;
p = new student;
}
```
这样,在 `teacher` 类的析构函数中,就需要释放 `p` 指向的内存,否则会造成内存泄漏:
```c++
teacher::~teacher()
{
cout << "teacher析构函数调用" << endl;
delete p;
}
```
另外,你在 `func2()` 函数中讲到传入普通类对象不可以改变类中的值,只能改变形参类的值。实际上,传入参数时,可以使用引用或指针,这样就可以在函数中修改原始对象的值了。例如:
```c++
void func2( student &s)
{
s.a = 12345;
s.b = 123456;
cout << s.a << endl;
cout << s.b << endl;
}
```
可以看到,这里使用了一个引用 `&s`,这样就可以修改原始对象 `s1` 的值了。
阅读全文