C++ 必备知识总结:初始化列表、static 成员、友元、内部类与匿名对象

在 C++ 类与对象的学习中,有几个非常关键但容易被忽略的知识点:构造函数初始化列表、静态成员、友元、内部类和匿名对象。本文将用简单易懂的方式,带你快速掌握这些概念。

一、构造函数的初始化列表

在构造函数中,我们既可以在函数体内给成员变量赋值:

class A 
{
public:
    A() 
    {
        x = 10;  // 函数体内赋值
    }
private:
    int x;
};

也可以使用 初始化列表(Initialization List)

class A 
{
public:
    A() 
    : x(10)  // 初始化列表
    {}
private:
    int x;
};

初始化列表的语法

  • 以一个 : 开头

  • 后面跟多个以 逗号分隔 的成员初始化项

  • 每项格式为:成员变量(初始值)

为什么推荐使用初始化列表?

因为 所有成员变量都会在初始化阶段被构造。如果你不写初始化列表,编译器也会自动执行“默认初始化 + 赋值”,效率低一些。

 必须使用初始化列表的情况

这三类成员 必须 在初始化列表中初始化,否则报错:

  1. 引用成员变量

  2. const 成员变量

  3. 没有默认构造函数的成员类对象

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 
    {
        ...
    };
};

特点:

  1. 内部类是一个 独立的类,和外部类对象无关

  2. 外部类对象中 不包含 内部类对象

  3. 内部类天然是外部类的友元,可以访问其 private 成员

  4. 内部类受外部类作用域限制

适用场景

当某个辅助类只为外部类服务时,可以考虑将其定义为内部类,使封装性更强。

五、匿名对象(临时对象)

所谓 匿名对象,就是没有对象名的对象:

A(10);  // 匿名对象

特点:

  • 生命周期只在这一行

  • 适合买完即用、用完即销毁的情况

cout << A(5).getValue() << endl;

常见应用包括临时对象、流对象等。

知识点核心要点
初始化列表必须用于 const、引用、无默认构造成员;推荐使用
static 成员全类共享、类外初始化、静态函数无 this
友元可以访问 private,但破坏封装,应谨慎使用
内部类独立类、为外部类服务、默认是外部类友元
匿名对象只在当前行存在,用于临时用途
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值