电商网站安全解决方案,盐城有没有做网站吗,国外有建站公司吗,wordpress 修改admin目录 一、前言
二、正文
1.友元
1.1友元函数的使用
1.1.1外部友元函数可访问类的私有成员#xff0c;友员函数仅仅是一种声明#xff0c;他不是类的成员函数。
1.1.2一个函数可以是多个类的友元函数
2.友元类的使用
2.1什么是友元类
2.2 友元类的关系是单向的#x…目录 一、前言
二、正文
1.友元
1.1友元函数的使用
1.1.1外部友元函数可访问类的私有成员友员函数仅仅是一种声明他不是类的成员函数。
1.1.2一个函数可以是多个类的友元函数
2.友元类的使用
2.1什么是友元类
2.2 友元类的关系是单向的不具有交换性。
2.3 友元类关系不能传递。
3.内部类
3.1内部类的使用
3.1.1 由于内部类是一个独立的类跟定义在全局相比它只是受外部类类域限制和访问限定符限制所以外部定义的对象不包含内部类。
3.1.2内部类默认是外部类的友元类
4.匿名对象
4.1匿名对象的应用场景 一、前言 昨天我们已经分享了类和对象中类型转换和static成员的知识有兴趣的小伙伴可以看一下 https://blog.csdn.net/yiqingaa/article/details/144066165 今天让我们在一起学习类和对象中的友元、内部类和匿名对象吧。 二、正文
1.友元 友元提供了一种突破类访问限定符封装的方式友元分为友元函数和友元类在函数声明或者类声明的前面加friend并且把友元声明放到一个类的里面。外部友元函数可访问类的私有和保护成员友元函数仅仅是一种声明他不是类的成员函数。友元函数可以在类定义的任何地方声明不受类访问限定符限制。一个函数可以是多个类的友元函数。友元类中的成员函数都可以是另一个类的友元函数都可以访问另一个类中的私有和保护成员。友元类的关系是单向的不具有交换性比如A类是B类的友元但是B类不是A类的友元。友元类关系不能传递如果A是B的友元B是C的友元但是A不是C的友元。有时提供了便利。但是友元会增加耦合度破坏了封装所以友元不宜多用。 1.1友元函数的使用 从上图可以看出在我们的Print函数中系统爆出了警告说A::_a1、A::_a2是不可访问的。那是因为_a1、_a2被限定符private给限制住了在类外面无法访问类里面的私有成员这里是_a1和_a2那么我们如何在类外面定义的函数访问我们的私有成员呢这里我们就可以借助我们的友元函数来解决这个问题 #includeiostream
using namespace std;
class A
{
public:friend void Print(const A aa);//我们只需要把函数抄写一下放在类里面然后前面加个friend就行。A(int a1 1, int a2 2){_a1 a1;_a2 a2;}
private:int _a1;int _a2;
};
void Print(const A aa)
{cout aa._a1 aa._a2 endl;
}
int main()
{A a;Print(a);return 0;
}友元函数的使用方法很简单只需要把定义在类外面的函数抄写一份到类里面然后在函数前面加个friend就行了friend函数-友元函数前提是这个函数定义在类外面不然这么做其实无实际意义毕竟如果这个函数是定义在类里面的直接就可以调用私有成员。没必要多此一举 友员函数可以这么理解之前我们是陌生人我去你家里玩私闯民宅这是违法的。不过现在我们是朋友了我是你的友元函数如上图中Print是类A的友元函数即Print是A的朋友那么我去你家玩就没有任何问题了。友元可以定义在类里面的任何地方哪怕是定义在限制符private里面都没问题不过个人建议放在类里面的第一行易于让人知道哦你使用了友元函数清晰明了。 1.1.1外部友元函数可访问类的私有成员友员函数仅仅是一种声明他不是类的成员函数。 如图所示当我们想要通过 类名的方式去访问类中的公共成员的时候只发现了类A的构造函数而没有发现Print这说明了友员函数仅仅只是一种声明而非是这个类的成员函数。 1.1.2一个函数可以是多个类的友元函数 #includeiostream
using namespace std;
class B;
class A
{
public:friend void Print(const A aa,const B bb);//Print是A的盆友A(int a1 1, int a2 2){_a1 a1;_a2 a2;}
private:int _a1;int _a2;
};
class B
{
public:friend void Print(const A aa, const B bb);//Print是B的盆友B(int b1 3, int b2 4){_b1 b1;_b2 b2;}
private:int _b1;int _b2;
};
void Print(const A aa,const B bb)
{cout aa._a1 aa._a2 endl;cout bb._b1 bb._b2 endl;
}
int main()
{A a;B b;Print(a,b);return 0;
}由上图可知函数Print不仅是类A的盆友同时也是类B的盆友。就像一个人可以是很多人的盆友一样并不是独属于你的盆友。 2.友元类的使用 2.1什么是友元类 定义一个类可以将另一个类声明为它的友元类被声明为友元的类将获得对原始类所有成员的访问权限无论是私有、保护还是公有成员 。 #includeiostream
using namespace std;
class B;
class A
{
public:friend class B;//这里我们直接让B整个类都是A的盆友这样我们不仅在Fun1函数中能使用A中隐私变量在Func2中也能使用A中隐私成员。A(int a1 1, int a2 2){_a1 a1;_a2 a2;}void Func1(){cout _a1 _a2 endl;}
private:int _a1;int _a2;
};
class B
{
public:B(int b1 3, int b2 4){_b1 b1;_b2 b2;}void Func2(const A aa){cout aa._a1 aa._a2 endl;}void Func3(const A aa){cout aa._a1 aa._a2 endl;}
private:int _b1;int _b2;
};
int main()
{A a;B b;b.Func2(a);b.Func3(a);return 0;
} 就例如上图所示如果我们想在B类中任意使用A中的私有成员_a1和_a2我们可以让B一整个类都成为类A的友元这样我们不仅让类B中的Func1能访问到A中的私有成员_a1和_a2Func2中也能访问到A中的私有成员_a1和_a2。 2.2 友元类的关系是单向的不具有交换性。 比如A类是B类的友元但是B类不是A类的友元我们如果想要在A类中访问B中私有成员_b1和_b2就访问不到。 2.3 友元类关系不能传递。 如果A是B的友元B是C的友元但是A不是C的友元。 可以理解为我是你的盆友你是他的盆友但这并不意味着我和他就是盆友。 3.内部类 如果一个类定义在另一个类的内部这个内部类就叫做内部类。内部类是一个独立的类跟定义在全局相比他只是受外部类类域限制和访问限定符限制所以外部类定义的对象中不包含内部类。内部类默认是外部类的友元类。内部类本质也是一种封装当A类跟B类紧密关联A类实现出来主要就是给B类使用那么可以考虑把A类设计为B的内部类如果放到private/protected位置那么A类就是B类的专属内部类其他地方都用不了。 3.1内部类的使用 #includeiostream
using namespace std;
class A
{
public:A(int a1 1, int a2 2){_a1 a1;_a2 a2;}void Func1()const{cout _a1 _a2 endl;}class B{public:B(int b1 3, int b2 4){_b1 b1;_b2 b2;}void Func2(const Aaa){cout aa. _a1 aa._a2 endl;}void Func3(const A aa){cout aa._a1 aa._a2 endl;}private:int _b1;int _b2;};
private:int _a1;int _a2;
};
class B
{
public:B(int b1 3, int b2 4){_b1 b1;_b2 b2;}
private:int _b1;int _b2;
};
int main()
{A a;return 0;
}上面就是我们简单的写了个内部类。类B被定义在类A的内部。 3.1.1 由于内部类是一个独立的类跟定义在全局相比它只是受外部类类域限制和访问限定符限制所以外部定义的对象不包含内部类。 看图可知外部定义的对象a中没有类B只有成员函数Fun1。 3.1.2内部类默认是外部类的友元类 因为B被定义在A中所以B是A的盆友即在B中可以任意访问到A中的私有成员。 例如B中的Func2和Func1都能访问到A的私有成员_a1和_a2。 4.匿名对象 用类型实参定义出来的对象叫做匿名对象相比之前我们定义的 类型 对象名实参 定义出来的叫有名对象。匿名对象生命周期只在当前一行一般临时定义一个对象当前用一下即可就可以定义匿名对象。 如上图所示就是有名对象和匿名对象的区别。 值得注意的是匿名对象的生命周期只有该匿名对象创建的哪一行一旦运行到下一行该匿名对象就被销毁了。 4.1匿名对象的应用场景 匿名对象的使用主要是方便。例如 我们只是想调用一下成员函数Func1 创造有名对象a再通过实例化对象a访问Func1需要两行代码。如上图标号1。直接创造匿名对象直接访问Func1只需要一行代码。如上图标号。 现在知道匿名对象的作用了吗其实就是为了图方便能写一行代码完成的事情为什么要写两行呢对吧。 三结言 本次博客的分享就到这呢同学们咱们下次再见拜拜喽。