/*预引用.告诉编译器类B将会在后面定义.使用了预引用后,就可以声明未定义的类的友元、指针和引用。但是不可以使用那些需要知道预引用的类的定义细节的语句,如声明该类的一个实例或者任何对该类成员的引用。*/
class B; /*注明见上*/
class A
{
public:
firend B;
};
class B
{ };
若不使用预引用.则声明友元时必须加class.
class A
{
public:
friend B;//false
friend class B; // ture.
};
class B
{ };
=================下面是我写的例子=====================
Student.h:
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include "DataBase.h"
//using namespace Student;
class Student
{
private:
char name[3];
int age;
char sex;
public:
Student();
Student(char newname[3],int newage,char newsex);
friend Student &visit(Student &stu,char *name,char newsex);
friend class Teacher;
~Student();
void input(char newname[3],int newage,char newsex);
int getAge();
void output();
};
class Teacher
{
private:
char name[3];
int age;
char sex;
float sales;
public:
Teacher();
Teacher(char newname[3],int newage,char newsex);
~Teacher();
Student &visit(Student &stu,char *name,char newsex);
void output();
};
#endif
Student.cpp
#include "Student.h"
Student::Student(char newname[3],int newage,char newsex) {
cout<<"进入Student::Student(char newname[3],int newage) 构造函数!"<<endl;
for(int i=0;i<3;i++)
{
name[i] = newname[i];
}
this->age = newage;
this->sex = newsex;
}
Student::Student()
{
cout<<"进入构造函数----Student::Student"<<endl;
name[0] = 'T';
name[1] = 'o';
name[2] = 'm';
this->age = 25;
this->sex = 'F';
}
Student::~Student()
{
cout<<"进入析构函数----Student::~Student"<<endl;
}
int Student::getAge()
{
return this->age;
}
void Student::input(char newname[3],int newage,char newsex)
{
this->age = newage;
sex = newsex;
}
Student &visit(Student &stu,char *name,char newsex)
{
cout<<"=========进入友元函数!!!!==================="<<endl;
strcpy(stu.name,name);
stu.sex = newsex;
cout<<"=========友元函数结束!!!!==================="<<endl;
return stu;
}
void Student::output()
{
cout<<name<<" "<<age<<" "<<sex<<endl;
}
Student &Teacher::visit(Student &stu,char *name,char newsex)
{
cout<<"=========进入Teacher类的Student &Teacher::visit()函数!!!!==================="<<endl;
strcpy(stu.name,name);
stu.sex = newsex;
cout<<"=========访问Teacher类的Student &Teacher::visit()函数------结束!!!!==================="<<endl;
return stu;
}
Teacher::Teacher()
{
cout<<"进入构造函数----Teacher::Teacher"<<endl;
name[0] = 'T';
name[1] = 'o';
name[2] = 'm';
this->age = 25;
this->sex = 'F';
this->sales = 860.49;
}
Teacher::~Teacher()
{
cout<<"进入析构函数----Teacher::~Teacher"<<endl;
}
调用
Teacher t;
Student s;
t.visit(s,"why",'B').output();
分享到:
相关推荐
本篇文章将深入探讨C++友元函数的概念、用途、优缺点以及如何正确使用它们。 首先,友元函数不是类的成员,但可以通过声明为友元来访问类的私有和受保护成员。声明友元的语法是在类的定义中使用`friend`关键字: `...
总结来说,C++的运算符重载提供了定制运算符行为的能力,而友元函数则允许非成员函数访问类的私有和受保护成员,两者结合使用能更好地实现面向对象的设计。在实际编程中,正确使用这两个特性可以增强代码的表达力,...
本主题聚焦于“数据结构(C++描述)--多项式算数运算”,主要讨论如何使用C++编程语言来实现一元多项式的加法和乘法操作,以及如何通过单链表类来表示多项式并重载算数运算符。 首先,我们来看一下一元多项式的基本...
10. **友元关系传递**:类A是类B的友元,类B是类C的友元,并不意味着类A也是类C的友元。但是,类A的成员函数可以访问类B的对象的任何成员。 11. **宏定义**:在预处理指令中,`#define`用于宏定义,可以替换文本。 ...
友元关系是非对称的,即如果类A是类B的友元,类B并不一定是类A的友元。 3. 静态数据成员: - 静态数据成员是属于类的所有对象共享的,而不是每个对象独立拥有的。因此,对一个对象的静态数据成员的修改会影响到...
即说明类A是类B的友元时,类B不一定也是类A的友元。 17. **new/delete操作符** - `new`和**delete[]**一起作用;`delete`与**new**一起使用。 18. **友元声明位置** - 友元在**类体内**声明,其名字的作用域在...
9.5 友元类成员 461 9.5.1 友元类 462 9.5.2 对类友元关系的限制 462 9.6 虚函数 462 9.6.1 虚函数的概念 465 9.6.2 使用指向类对象的指针 467 9.6.3 使用引用处理虚函数 469 9.6.4 纯虚函数 470 ...
- 不一定。虽然C++基于C发展而来,但两者在语法上存在很多差异。C++的设计初衷是为了引入面向对象的概念,并增强类型安全性,这使得C++更加易于理解和使用。因此,即使没有C的基础,也可以直接学习C++。 2. **怎样...
- **解释**: 指针可以指向数组中的任一元素,不一定必须指向首元素。 #### 30. 指针数组的定义 - **知识点**: 对象指针数组的元素应该是对象的地址。 - **解释**: “一维对象指针数组的每个元素应该是某个类的对象...
【C++程序设计实践上机指导书第八次】主要涵盖了C++编程中关于类与对象的概念,特别是类的组合、构造函数的使用、友元函数和友元类的应用。以下是详细的知识点说明: 1. **类的组合**:类的组合是一种面向对象编程...
友元函数不一定是类的成员函数C.友元类中的成员函数可以访问友元类的私有和保护成员D.友元关系不能传递,即如果类A是类B的友元,类B的成员函数不能直接访问类A的私有和保护成员友元关系是C++中的一种特殊机制,...
《Professional C++》是一本内容丰富、涵盖面广的专业书籍,不仅适合有一定C++基础的开发者继续深化技术,也适用于希望系统学习C++语言及其应用领域的初学者。通过学习本书,读者可以全面掌握C++语言的各项特性,并...
一个基类中说明有纯虚函数,该基类的派生类不一定是抽象类。 2-4关于类的私有成员,正确答案是B选项。私有成员只能被该类的成员函数和友元函数访问。 2-5关于继承和派生的叙述正确的是C选项。如果基类没有默认...
- 单向性:A类可以访问B类的私有和保护成员,但B类不一定能访问A类的私有和保护成员。 - 非传递性:如果A是B的友元,B是C的友元,那么A并不是C的友元。 - 不能继承:即使派生类继承了基类,也不能继承基类的友元...
- 在C++中,自定义标识符必须遵循一定的规则: - 由字母、数字或下划线组成。 - 必须以字母或下划线开头。 - 不得使用C++关键字作为标识符。 - 在选项中,`switch`、`break` 和 `do` 都是C++的关键字,因此不能...