class Sum
{
public:
Sum()
{
_ret += _i;
++_i;
}
static int GetRet()
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Sum::_i = 1;
int Sum::_ret = 0;
class Solution {
public:
int Sum_Solution(int n) {
Sum arr[n]; // 变长数组,创建n个Sum对象,触发构造累加
return Sum::GetRet();
}
};
#include<iostream>
using namespace std;
class B; // 前置声明:func参数含B,需提前声明
class A
{
// 声明func为A的友元函数
friend void func(const A& aa, const B& bb);
private:
int _a1 = 1;
int _a2 = 2;
};
class B
{
// 声明func为B的友元函数
friend void func(const A& aa, const B& bb);
private:
int _b1 = 3;
int _b2 = 4;
};
// 友元函数定义:可访问A和B的私有成员
void func(const A& aa, const B& bb)
{
cout << aa._a1 << endl; // 访问A的私有成员
cout << bb._b1 << endl; // 访问B的私有成员
}
int main()
{
A aa;
B bb;
func(aa, bb);
return 0;
}
4.2 友元类
核心特性
声明:在类内加friend class 类名;,格式:friend class B;(A 声明 B 为友元类)。
本质:友元类的所有成员函数,均可访问当前类的私有和保护成员。
规则:
单向性:A 是 B 的友元,不代表 B 是 A 的友元。
不可传递性:A 是 B 的友元,B 是 C 的友元,不代表 A 是 C 的友元。
破坏封装:增加类间耦合度,不宜多用。
示例代码
cpp复制代码
#include<iostream>
using namespace std;
class A
{
// 声明B为A的友元类
friend class B;
private:
int _a1 = 1;
int _a2 = 2;
};
class B
{
public:
void func1(const A& aa)
{
cout << aa._a1 << endl; // 访问A的私有成员
}
void func2(const A& aa)
{
cout << aa._a2 << endl; // 访问A的私有成员
}
private:
int _b1 = 3;
int _b2 = 4;
};
int main()
{
A aa;
B bb;
bb.func1(aa); // 输出1
bb.func2(aa); // 输出2
return 0;
}
5. 内部类
5.1 核心定义
一个类定义在另一个类的内部,称为内部类(嵌套类),是独立的类,仅受外部类的类域和访问限定符限制。
外部类对象中不包含内部类成员(内部类不属于外部类对象)。
5.2 关键特性
友元关系:内部类默认是外部类的友元类,可访问外部类的私有 / 保护成员(包括静态成员)。
访问方式:外部类名::内部类名(如A::B b)。
封装性:若内部类声明在private/protected区,仅外部类可访问,成为外部类的专属类。
大小计算:外部类的大小与内部类无关(内部类不占外部类对象空间)。
5.3 示例代码
cpp复制代码
#include<iostream>
using namespace std;
class A
{
private:
static int _k; // 静态成员
int _h = 1; // 非静态成员
public:
// 内部类B,默认是A的友元
class B
{
public:
void foo(const A& a)
{
cout << _k << endl; // 访问A的静态私有成员(OK)
cout << a._h << endl; // 访问A的非静态私有成员(OK,需通过A对象)
}
private:
int _b1;
};
};
int A::_k = 1; // 外部类静态成员初始化
int main()
{
cout << sizeof(A) << endl; // 输出4(仅包含A的非静态成员_h,内部类B不占空间)
A::B b; // 内部类对象定义
A aa;
b.foo(aa); // 输出1 和 1
return 0;
}
5.4 例题(求 1+2+...+n,内部类版本)
cpp复制代码
class Solution {
// 内部类Sum
class Sum
{
public:
Sum()
{
_ret += _i;
++_i;
}
};
private:
static int _i;
static int _ret;
public:
int Sum_Solution(int n) {
Sum arr[n]; // 变长数组,创建n个Sum对象触发累加
return _ret;
}
};
int Solution::_i = 1;
int Solution::_ret = 0;