1、匿名对象
(1)用类型(实参)定义出来的对象叫做匿名对象,相比之前我们定义的 类型 对象名(实参) 定义出来的叫做有名对象。
示例:
#include<iostream>
using namespace std;
class person
{
public:person(){cout << "person()的默认构造函数" << endl;}
};
int main()
{person p;//有名对象person();//匿名对象return 0;
}
结果:
(2)匿名对象声明周期声明周期只在当前一行。如果我们定义一个对象只有当前用一下即可,那我们就可以定义匿名对象。
2、友元
(1)友元提供了一种突破类访问限定符封装的方式,友元分为:友元函数、友元类,在函数声明或者类声明的前面加friend,并且把友元声明放到一个类的里面。
示例:
友元类:
#include<iostream>
using namespace std;
class A
{//友元类声明friend class B;
private:int _a1 = 12;int _a2 = 13;
};
class B
{
public:void func1(const A& aa){cout << aa._a1 << endl;cout << _b1 << endl;}void func2(const A& aa){cout << aa._a2 << endl;cout << _b2 << endl;}
private:int _b1 = 11;int _b2 = 22;
};
注意:类B是类A的友元类,如果一个普通类中有一个友元类,则该友元类的所有成员函数都是该普通类的友元函数,这些友元函数可以访问该普通类的private/protected的成员变量。
友元函数:
代码:
#include<iostream>
using namespace std;
class B;//前置声明,否则A的友元函数声明编译器不认识B
class A
{//友元函数声明friend void func(const A& aa, const B& bb);
private:int _a1=1;int _a2=2;
};
class B
{//友元函数声明friend void func(const A& aa, const B& bb);
private:int _b1 = 3;int _b2 = 4;};
void func( const A&aa, const B&bb)
{cout << aa._a1 << endl;cout << bb._b1 << endl;}
int main()
{A aa;B bb;func(aa, bb);return 0;
}
结果:
(2)友元函数可访问类的私有(被private修饰)和保护(被protected修饰)成员,友元函数仅仅是一种声明,它不是类的成员函数。
(3)友元函数可以在类中任何位置声明,不受访问限定符限制。
(4)一个函数可以是多个类的友元函数
(5)友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类的友元函数,
(6)友元类的关系是单向的,不具有交换性,比如:A类是B类的友元,但是B类不是A类的友元。
(7)友元类关系不能传递,如果A是B的友元,B是C的友元,但是A不是C的友元。
(8)友元提供了函数可以访问一个类的私有成员变量,但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
总结:
(1)全局函数做友元
代码:
//全局函数做友元
#include<iostream>
using namespace std;class MyClass {
private:int secret;
public:friend void globalFriend(); // 声明全局函数为友元
};// 全局函数定义
void globalFriend() {MyClass obj;obj.secret = 42; // 可以访问私有成员cout << "obj.secret=" << obj.secret << endl;
}
int main()
{globalFriend();return 0;
}
结果:
(2)成员函数做友元
代码:
//一个类中的成员函数做另一个类的友元函数
#include<iostream>
using namespace std;class OtherClass {
public:void memberFriend(); // 成员函数声明
};class MyClass {
private:int secret;
public:friend void OtherClass::memberFriend(); // 声明其他类的成员函数为友元
};// 成员函数定义
void OtherClass::memberFriend() {MyClass obj;obj.secret = 44; // 可以访问私有成员cout << "obj.secret=" << obj.secret << endl;
}
int main()
{OtherClass p1;p1.memberFriend();return 0;
}
结果: