在 C++ 类与对象的学习中,有几个非常关键但容易被忽略的知识点:构造函数初始化列表、静态成员、友元、内部类和匿名对象。本文将用简单易懂的方式,带你快速掌握这些概念。
一、构造函数的初始化列表
在构造函数中,我们既可以在函数体内给成员变量赋值:
class A
{
public:
A()
{
x = 10; // 函数体内赋值
}
private:
int x;
};
也可以使用 初始化列表(Initialization List):
class A
{
public:
A()
: x(10) // 初始化列表
{}
private:
int x;
};
初始化列表的语法
-
以一个
:开头 -
后面跟多个以 逗号分隔 的成员初始化项
-
每项格式为:成员变量(初始值)
为什么推荐使用初始化列表?
因为 所有成员变量都会在初始化阶段被构造。如果你不写初始化列表,编译器也会自动执行“默认初始化 + 赋值”,效率低一些。
必须使用初始化列表的情况
这三类成员 必须 在初始化列表中初始化,否则报错:
-
引用成员变量
-
const 成员变量
-
没有默认构造函数的成员类对象
class B
{
public:
B(int& r)
: ref(r)
, c(10)
{}
private:
int& ref; // 引用
const int c; // const
};
C++11 的新特性:成员变量默认值
class A
{
private:
int x = 10; // 声明处默认值
};
如果初始化列表没有指定这个成员,它就会使用默认值。
二、static 静态成员
用 static 修饰的成员(变量或函数)称为 静态成员。
静态成员变量特点
-
被整个类 共享
-
不属于任何对象
-
存放在静态区(不是对象里)
-
必须在类外初始化一次
class A
{
public:
static int count;
};
int A::count = 0; // 类外初始化
静态成员函数
-
没有
this指针 -
只能访问静态成员
-
可以通过类名直接调用:
A::count = 5;
A::func();
静态成员也受 public/private 限制
不是 public 就不能随便访问。
三、友元(friend)
C++ 提供友元机制,让某个函数或类可以访问另一个类的 private 成员。
友元函数
class A
{
friend void show(A& a); // 声明友元
private:
int x = 10;
};
show() 即使不是类成员,也可以访问 A 的私有数据。
友元类
class A
{
friend class B; // B 是 A 的友元类
};
B 的所有成员函数都能访问 A 的私有成员。
⚠ 注意事项
-
友元关系是 单向的
-
不能传递
-
过度使用友元会破坏封装,谨慎使用
四、内部类(Nested Class)
如果一个类定义在另一个类内部,就称为内部类。
class Outer
{
public:
class Inner
{
...
};
};
特点:
-
内部类是一个 独立的类,和外部类对象无关
-
外部类对象中 不包含 内部类对象
-
内部类天然是外部类的友元,可以访问其 private 成员
-
内部类受外部类作用域限制
适用场景
当某个辅助类只为外部类服务时,可以考虑将其定义为内部类,使封装性更强。
五、匿名对象(临时对象)
所谓 匿名对象,就是没有对象名的对象:
A(10); // 匿名对象
特点:
-
生命周期只在这一行
-
适合买完即用、用完即销毁的情况
cout << A(5).getValue() << endl;
常见应用包括临时对象、流对象等。
| 知识点 | 核心要点 |
|---|---|
| 初始化列表 | 必须用于 const、引用、无默认构造成员;推荐使用 |
| static 成员 | 全类共享、类外初始化、静态函数无 this |
| 友元 | 可以访问 private,但破坏封装,应谨慎使用 |
| 内部类 | 独立类、为外部类服务、默认是外部类友元 |
| 匿名对象 | 只在当前行存在,用于临时用途 |
973

被折叠的 条评论
为什么被折叠?



