C++面向对象友元,全局函数、类、成员函数做友元

简介: 在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术友元的目的就是让一个函数或者类 访问另一个类中私有成员友元的关键字为 ==friend==友元的三种实现• 全局函数做友元• 类做友元• 成员函数做友元全局函数做友元


友元

生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是呢,你也可以允许你的好闺蜜好基友进去。

在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术

友元的目的就是让一个函数或者类 访问另一个类中私有成员

友元的关键字为  ==friend==

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

全局函数做友元

classBuilding

{

   //告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容

   friendvoidgoodGay(Building*building);

public:

   Building()

   {

       this->m_SittingRoom="客厅";

       this->m_BedRoom="卧室";

   }

public:

   stringm_SittingRoom; //客厅

private:

   stringm_BedRoom; //卧室

};

voidgoodGay(Building*building)//全局函数

{

   cout<<"好基友正在访问: "<<building->m_SittingRoom<<endl;

   cout<<"好基友正在访问: "<<building->m_BedRoom<<endl;

}

voidtest01()

{

   Buildingb;

   goodGay(&b);

}

intmain(){

   test01();

   system("pause");

   return0;

}

类做友元

classBuilding;

classgoodGay

{

public:

   goodGay();

   voidvisit();

private:

   Building*building;//在类内创建了一个指针,用指针来维护下面在堆区创建的building类,承担着在goodgay类内做一个载体的作用。

};

classBuilding

{

   //告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容

   friendclassgoodGay;

public:

   Building();

public:

   stringm_SittingRoom; //客厅

private:

   stringm_BedRoom;//卧室

};

Building::Building()//另一种初始化类内构造函数的方法

{

   this->m_SittingRoom="客厅";

   this->m_BedRoom="卧室";

}

goodGay::goodGay()//另一种初始化类内构造函数的方法

{

   building=newBuilding;

}

voidgoodGay::visit()//另一种初始化类内函数的方法

{

   cout<<"好基友正在访问"<<building->m_SittingRoom<<endl;

   cout<<"好基友正在访问"<<building->m_BedRoom<<endl;//可以访问私有权限的原因是设置了该类与要访问的类的关系,要在被访问的类里写上 friend <想要访问的类>。

}

voidtest01()

{

   goodGaygg;

   gg.visit();

}

intmain(){

   test01();

   system("pause");

   return0;

}

在类内创建了一个指针,用指针来维护下面在堆区创建的building类,承担着在goodgay类内做一个载体的作用。

告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容

可以设置类与类之间的访问权限

成员函数做友元

classBuilding;

classgoodGay

{

public:

   goodGay();

   voidvisit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容

   voidvisit2();

private:

   Building*building;

};

classBuilding

{

   //告诉编译器  goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容

   friendvoidgoodGay::visit();

public:

   Building();

public:

   stringm_SittingRoom; //客厅

private:

   stringm_BedRoom;//卧室

};

Building::Building()

{

   this->m_SittingRoom="客厅";

   this->m_BedRoom="卧室";

}

goodGay::goodGay()

{

   building=newBuilding;

}

voidgoodGay::visit()

{

   cout<<"好基友正在访问"<<building->m_SittingRoom<<endl;

   cout<<"好基友正在访问"<<building->m_BedRoom<<endl;

}

voidgoodGay::visit2()

{

   cout<<"好基友正在访问"<<building->m_SittingRoom<<endl;

   //cout << "好基友正在访问" << building->m_BedRoom << endl;

}

voidtest01()

{

   goodGay  gg;

   gg.visit();

}

intmain(){

   

   test01();

   system("pause");

   return0;

}


目录
相关文章
|
5天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
25 10
|
10天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
40 9
|
6天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
14天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
14天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
14天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
19天前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。
|
14天前
|
C++
C++】string类的使用③(修改器Modifiers)
这篇博客探讨了C++ STL中`string`类的修改器和非成员函数重载。文章介绍了`operator+=`用于在字符串末尾追加内容,并展示了不同重载形式。`append`函数提供了更多追加选项,包括子串、字符数组、单个字符等。`push_back`和`pop_back`分别用于在末尾添加和移除一个字符。`assign`用于替换字符串内容,而`insert`允许在任意位置插入字符串或字符。最后,`erase`函数用于删除字符串中的部分内容。每个函数都配以代码示例和说明。
|
14天前
|
安全 编译器 C++
【C++】string类的使用②(元素获取Element access)
```markdown 探索C++ `string`方法:`clear()`保持容量不变使字符串变空;`empty()`检查长度是否为0;C++11的`shrink_to_fit()`尝试减少容量。`operator[]`和`at()`安全访问元素,越界时`at()`抛异常。`back()`和`front()`分别访问首尾元素。了解这些,轻松操作字符串!💡 ```
|
14天前
|
存储 编译器 Linux
【C++】string类的使用②(容量接口Capacity )
这篇博客探讨了C++ STL中string的容量接口和元素访问方法。`size()`和`length()`函数等价,返回字符串的长度;`capacity()`提供已分配的字节数,可能大于长度;`max_size()`给出理论最大长度;`reserve()`预分配空间,不改变内容;`resize()`改变字符串长度,可指定填充字符。这些接口用于优化内存管理和适应字符串操作需求。