C++核心特性全解析:从初始化到匿名对象
·
目录
一,初始化列表
1,概念
在C++中,初始化列表(Initializer List) 是构造函数中用于直接初始化成员变量的语法结构。它位于构造函数参数列表之后、函数体之前,以冒号(:)引导,通过逗号分隔多个成员变量的初始化语句。其核心作用是在对象构造阶段(而非函数体执行阶段)完成成员变量的初始化,尤其对const成员、引用成员、无默认构造函数的类类型成员等场景至关重要。
2,细节
3,代码:
错误代码:
class B
{
public:
private:
int b=10;
};
class A
{
public:
A(int a = 1)//如果不给_b,_c初始会报错,如果B类没有写构造(也没有默认构造)也会报错
:_a(a)
//_b(b),
//_c(c)
{
}
private:
int _a = 0;//给缺省值
int& _b;
const int _c;
B _d;
};
纠正:
class A
{
public:
A(int a = 1,int &b,const int c)//如果不给_b,_c初始会报错,如果B类没有写构造(也没有默认构造)也会报错
:_c(c),//初始化顺序是按声明顺序_a->_b->_c->_d
_a(a),
_b(b)
{
}
private:
int _a = 0;//给缺省值
int& _b;
const int _c;
B _d;
};
二,类型转换
在C++中,类型转换(Type Conversion) 是将一种数据类型的值转换为另一种类型的过程,分为隐式转换(编译器自动完成)和显式转换(开发者手动强制)。这是C++类型系统的核心机制,直接影响代码安全性、性能和可维护性。

Int*可以转换成const int*(权限可以缩小)
const int*不可以转换成int*(权限不可以放大)
float i=1.22;
int c=i;//这个时候小数部分丢失(double同理)
//double→float可能丢失精度或溢出
double→float可能丢失精度或溢出
三,static成员
1,静态成员的核心特性
| 特性 | 说明 |
|---|---|
| 全局唯一性 | 无论创建多少对象,静态成员仅初始化一次 |
| 类作用域 | 通过类名直接访问(ClassName::static_member),不依赖对象实例 |
无this指针 |
静态成员函数不能访问非静态成员(因无对象上下文) |
| 存储位置 | 位于全局数据区(与全局变量同区),非对象内存空间 |
2,初始化规则:
class B
{
public:
B(const int B)
:b(B)
{
}
private:
int b = 10;
static int i;
static const int i1 = 0;
};
int B::i = 10;
必须显式初始化:非const静态成员需在类外定义(C++17前)
3 .存储与生命周期
- 存储位置:静态成员位于全局数据段(
.data/.bss) - 生命周期:从程序启动到结束(与全局变量相同)
- 访问控制:仍受
public/private限制(不同于全局变量)
4.与普通成员对比
| 成员类型 | 存储位置 | 生命周期 | 访问方式 |
|---|---|---|---|
| 普通成员 | 对象内存空间 | 随对象创建/销毁 | 通过对象实例 |
| 静态成员 | 全局数据区 | 程序全程 | 类名或对象间接访问 |
四、友元的核心概念
1. 本质与作用
- 打破封装:在严格封装场景下提供可控的"后门"
- 单向授权:类主动声明友元(非对称关系)
- 应用场景:
- 运算符重载(如
<<、>>) - 跨类协作(如工具类访问私有数据)
- 性能优化(避免
getter/setter开销)
- 运算符重载(如
2. 友元类型
| 类型 | 声明方式 | 访问权限 |
|---|---|---|
| 友元函数 | friend void func(MyClass&); |
可访问声明类的所有成员 |
| 友元类 | friend class FriendClass; |
友元类的所有函数可访问私有成员 |
| 成员函数作为友元 | friend void Other::func(); |
特定成员函数获得访问权限 |
注意:友元会破坏类的封装,要尽量少用.
五,内部类
1. 四大核心特性
| 特性 | 说明 | |
|---|---|---|
| 非成员关系 | 不占用外部类对象空间(sizeof(Outer)不含内部类) |
|
| 默认友元权限 | 内部类自动成为外部类的友元(可访问私有成员) | |
| 访问限定符约束 | 内部类自身受外部类访问限定符控制(如private class Inner则外部不可见) |
|
| 独立作用域 | 需通过Outer::Inner访问(避免全局命名污染) |
六,匿名对象
1,匿名对象的概念
匿名对象是指在创建时未被赋予显式变量名的对象,通常直接用于方法调用或赋值操作。其生命周期仅限于当前表达式或语句,执行完毕后可能被垃圾回收机制处理(取决于语言特性)。
2,匿名对象的特性
- 无变量引用:不通过变量名访问,直接通过
new关键字创建并使用。 - 一次性使用:适用于仅需临时调用的场景,如单次方法调用或参数传递。
- 内存效率:部分语言中匿名对象可能更快被回收,但频繁创建可能影响性能。
3,常见应用场景
C++示例
// 临时对象用于函数参数
func(MyClass());
4,注意事项
- 调试困难:匿名对象无变量名,堆栈跟踪中难以标识。
- 生命周期限制:无法在后续代码中重复引用,需谨慎设计使用场景。
匿名对象的核心价值在于简化代码结构,适用于逻辑简单且无需复用的场景。
更多推荐



所有评论(0)