1、友元
友元函数
友元函数可以是其他类的成员函数,也可以是不属于类的普通函数。在类中声名友元函数,只需在其函数声名前加上friend关键词。友元函数可以访问类的所有成员。因为友元函数不是类的成员函数,所以友元函数不能直接访问类对象的数据成员,也不能通过this指针访问类的数据成员,他必须通过作为入口参数传递进来的对象名来访问引用该对象的数据成员。
上图代码中的show1函数被声名为类A的友元函数,所以show1能够访问A类对象的所有成员,而show2函数没有被声名为类A的成员函数,所以试图在show2中访问类A对象的私有成员parameter2是错误的。
将其他类的成员函数声名为友元函数:
如上图代码所示, 好像在类内部定义的成员函数被声名为类的友元函数会出问题,具体原因哪位大佬知道的请留个言指导一下。
友元类
将一个类声名为当前类的友元类,那么友元类中的所有成员函数都是当前类的友元函数。
#include<iostream>
using namespace std;
class C;
class A
{
public:
void show(C c);
};
void A::show(C c)
{
cout << c.parameter << endl;
}
class B
{
public:
void show(C c);
};
void B::show(C c)
{
cout << c.parameter << endl;
}
class C
{
public:
C()
{
parameter = 100;
}
friend A;
private:
int parameter;
};
有点奇怪,把一个类声名为另一个类的友元类时,不管成员函数是不是在类的内部定义的,都不会出错。
2、类的组合
使用多个类组成一个新的类:
class 组合类
{
public/protected/private:
类1 对象1;
类2 对象2;
类n 对象n;
};
组合类的构造函数:
组合类::组合类(形参列表):对象1(形参表1),对象2(形参表2),对象n(形参表n)
{
//组合类的构造函数体
}
使用成员初始化列表实现对组合类中各类型的数据成员的初始化。当组合类的构造函数被调用时,首先按照各类型的对象在类中声名的顺序,调用相关类的构造函数,实现这些对象的初始化,最后执行组合类构造函数函数体中的代码。析构函数的调用顺序与构造函数相反。
需要注意,友元关系不具有传递性。
3、常类型
常类型的引入,是为了在数据共享的同时又防止数据被改动。
常引用
const 类型 &引用名;
被引用对象的值,不能通过这个常引用改变。在实际应用中,常引用往往用来作为函数的形参。
常指针
常对象
类名 const 对象名[(参数表)];
或
const 类名 对象名[(参数表)];
常对象在定义时可以通过构造函数初始化,之后就不能再更新。C++不允许常对象调用普通的成员函数。
常数据成员
如果在类中说明了常数据成员,那么构造函数只能通过成员初始化列表对该常数据成员进行初始化,其他任何函数都不能对该成员赋值。
常成员函数
类型说明符 函数名(参数列表)const
const是函数类型的一个组成部分,因此声名函数和定义函数时都要有关键词const。在调用时不需要加const。关键词const可以用来区分重载函数。
如果声名了一个类的常对象,那么通过这个对象,只能调用类的常函数,而不能调用类的普通函数。