C++的友元和内部类你了解吗

目录
  • 友元函数
    • 案例
  • 友元类
  • 内部类
  • 总结

友元分为:友元函数 和 友元类

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

友元函数

友元函数 可以 直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 friend 关键字。

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用 const 修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用和原理相同

案例

friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);

cout的输出流对象和隐含的this指针再抢占第一个参数的位置。 this 指针默认是第一个参数也就是左操作数。 但是实际使用中 cout 需要是第一个形参对象, 才能正常使用。

所以要将 operator<< 重载成全局函数。但是这样的话,又会导致类外没办法访问成员。所以这里就需要友元来解决。

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

  • 友元关系是单向的,不具有交换性
  • 友元关系不能传递

如果B是A的友元,C是B的友元,则不能说明C时A的友元。

class A;
class B;

class A {
	// 声明B类为A类的友元类,则在B类中就直接访问A类中的私有成员变量
	friend class B;
public:
	A (int a = 0)
		:_a(a)
	{}
private:
	int _a;
};

class B {
public:
	B(int b = 0)
		:_b(b)
	{}

	void SetA(int a)
	{
		// 直接访问A类私有的成员变量
		_aa._a = a;
	}
private:
	int _b;
	A _aa;
};

如果B不是A的友元类,报错。

内部类

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。

此时这个内部类是一个独立的类,他不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

注:

内部类就是外部类的友元类。

内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元。

  • 内部类可以定义在 外部类的 publicprotectedprivate
  • 内部类可以直接访问外部类中的 static ,枚举成员,不需要外部类的对象或者类名
  • sizeof(外部类) = 外部类,和内部类没有关系
class A {
private:
	int _a;
	static int _k;

public:
	class B {
	public :
		void print(const A& aa)
		{
			cout << aa._a << endl;
			cout << _k << endl;
		}
	};

	A(int a = 10)
		:_a(a)
	{}
};

int A::_k = 0;

int main()
{
	A::B bb;
	bb.print(A());
	return 0;
}

输出:

10
0

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 关于C++内部类的介绍与使用示例

    介绍 1.把一个类定义在另一个类的内部,称里面的类为内部类. 例如: class A { public: class B { public: int x; int y; }; }; 类B即为内部类. 2.内部类和外部类相互没有特权,即外部类无法自由访问内部类,内部类也无法自由访问外部类. a.他们不是朋友关系 b.他们不是父子关系 内部类的使用 #include <stdio.h> class A { public: class B { public: void test() { printf

  • C++中友元函数(friend)解析

     文章转自公众号:Coder梁(ID:Coder_LT) 我们知道C++控制对象的私有部分的访问,只能通过公共的接口.这样的设计当然没错,但有的时候也会显得过于严格,产生一些问题. 因此C++提供了另外一种形式的访问权限,叫做友元(friend). 友元有三种,分别是友元函数.友元类和友元成员函数. 通过让函数成为类的友元,可以赋予该函数与类成员函数一样的访问权限,也就是说我们可以在友元函数当中访问类的私有成员变量. 在介绍友元函数的使用之前,我们需要先了解为什么需要友元函数.C++ Prime

  • C++中友元的实例详解

    C++中友元的实例详解 尽管友元被授予从外部访问类的私有部分的权限,但他们并不与面向对象的编程思想相悖:相反他提高了公共接口的灵活性. 一.友元类 友元声明可以位于公有.私有活保护部分.其所在位置无关紧要 我直接贴出一个摘自< c++ primer plus >的例子来演示 c++ 友元类 其中 Remote 为 Tv的友元类. Tv.h #ifndef TV_H_ #define TV_H_ /*一个类 电视 */ class Tv { public: friend class Remote

  • C++ 类的友元机制解读

    下面给出C++类的友元机制说明(对类private.protected成员访问),需要注意的是,友元机制尽量不用或者少用,虽然它会提供某种程度的效率,但会带来数据安全性的问题. 类的友元 友元是C++提供的一种破坏数据封装和数据隐藏的机制. 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息.可以使用友元函数和友元类. 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元. 友元函数 友元函数是在类声明中由关键字friend修饰说明的非成员函

  • C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴.希望能对初学C++的朋友起到一点帮助作用. 操作步骤: 1)在MyFriend类中,将Father类定义成友元 2)写一个Son类继承自Father类 3)在Father类和Son类的构造函数中分别创建MyFriend对象,并定义其内部的三个变量 4)在MyFriend类的构造函数中创建Father对象,并定义其内部的三个变量 结果

  • C++的友元和内部类你了解吗

    目录 友元函数 案例 友元类 内部类 总结 友元分为:友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利.但是友元会增加耦合度,破坏了封装,所以友元不宜多用. 友元函数 友元函数 可以 直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 friend 关键字. 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用 const 修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函

  • C++类与对象深入之静态成员与友元及内部类详解

    目录 一:静态成员 1.1:静态成员分类 1.2:静态成员变量 1.3:静态成员函数 1.4:总结特性 1.5:试题示例 1.6:C++11成员初始化新玩法 二:友元 2.1:全局函数做友元 2.2:类做友元 2.3:成员函数做友元 三:内部类 3.1:概念 3.2:特性 一:静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员.C++里面尽量用静态成员变量代替全局变量. 1.1:静态成员分类 1️静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,

  • C++超详细讲解友元与内部类

    目录 一.友元 1.友元函数 (1)引入原因 (2)友元函数作用 (3)友元函数特征 2.友元类 (1)解释 (2)友元类特征 二.内部类(不常用) 1.概念 2.特性 一.友元 友元分为: 友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利.但是友元会增加耦合度,破坏了封装,所以友元不宜多用. 1.友元函数 (1)引入原因 operator<<:因为cout 的 输出流对象和隐含的 this 指针在抢占第一个参数的位置 . this 指针默认是第一个参数也就是左操数了.但是实

  • java 内部类(匿名类,匿名对象,静态内部类)详解及实例

    内部类的介绍 定义在另外一个类中的类,叫内部类 成员内部类 1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象 2..this 可以通过外部类的类名.this去访问外部类的所有属性和方法. public class Test1 { String name = "asnd"; public static void main(String[] args) { Test1 test1 = new Test1(); Inner mInner = test1.

  • 深入解析Java中的内部类

    概述 最近学习python,发现python是支持多继承的,这让我想起Java是通过内部类实现的这套机制.这篇文章不是讲如何通过内部类实现多继承,而是总结一下内部类的类型和使用方法. Java内部类分为: 非静态内部类 静态内部类 局部内部类 匿名内部类 内部类在Android源码中被大量的使用,先介绍一下这四种内部类的共同点: 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号. 内部类不能用普通的方式访问.内部类是外部类的一个成员,因

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类 在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class).嵌套类有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类.其中内部类又分为三种类型: 1.在外部类中直接定义的内部类. 2.在函数中定义的内部类. 3.匿名内部类. 对于这几种类型的访问规则, 示例程序如下: package lxg; //定义外部类 public class OuterClass { //外部类静态成员变量

  • 讲解Java中如何构造内部类对象以及访问对象

    通过反射构造内部类对象 首先在 javalang 包下写一个包含内部类的类: package javalang; public class Outer { public static class Inner1{} } 注意这个类是 public static,后面我们慢慢把这些修饰符去掉. 要想通过反射来创建 Inner1 对象,首先要获得 Inner1 的 Class 对象.我们在 Outer 中写上 main 方法: public class Outer { public static cl

  • java中的内部类详细总结

    内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类 而心脏又在人体当中,正如同是内部类在外部内当中 实例1:内部类的基本结构 复制代码 代码如下: //外部类 class Out {     private int age = 12; //内部类     class In {         p

  • java 内部类的实例详解

    java 内部类的实例详解 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { private String name ; private int age; public String getName() { return name; } p

  • C++之友元:友元函数和友元类详解

    一.友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,包括公有.私有和保护成员.而类的外部函数只能访问类的公有成员. 友元是一种允许非类成员函数访问类的非公有成员的一种机制.可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元. 友元函数友元类 二.友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend  类型 友元函数名(参数表);友元的作用在于提高程序的运行效率 友

随机推荐