C++ this指针、常函数、内联函数
2.5.2 this指针
this 指针是C++提供的隐含在⾮静态成员函数中的指针,指向当前调⽤函数的对象,⽤于区分不同对象的成员。
2.5.2.1 特性
this 指针的本质是 类名* const (指针指向不可修改)
只能在⾮静态成员函数中使⽤⾃动传递,⽆需⼿动调⽤
2.5.2.2 ⽤途
1. 区分成员变量和函数参数重命
2. 返回当前对象本⾝
class Person
{
public:
int age; // 成员变量
void setAge(int age)
{
this->age = age; // this->age指成员变量,age指参数
}
Person(int age)
{
this->age = age;
}
}
}
2.5.3 const 修饰成员函数(常函数)
2.5.3.1 常函数
声明: 返回类型 函数名() const
意义:限制函数不能修改成员变量( this 指针变为 const 类名* const )
例外:被 mutable 修饰的成员变量可以在常函数中修改。
class MyNumber
{
public:
int num;
Person& addNum(int num)
{
this->num += num;
return *this; // 返回当前对象(引用方式)
}
};
int main()
{
MyNumber myNumber;
myNumber.addNum(5).addNum(6).addNum(7); // 链式调用
cout << myNumber.num << endl; // 18
return 0;
}
class Person
{
public:
int mA;
mutable string mB;
Person(int a, string b) : mA(a),mB(b){}
// 常函数(常函数中,普通成员变量只有 读的权限)
void show() const
{
// mA = 10; // 错误:常函数中不能修改普通成员变量的值
2.5.3.2 常对象
声明: const 类名 对象名
特性:常对象只能调⽤常函数,不能调⽤普通成员函数(避免修改成员变量)
2.6 内联函数
在 C++ 中,内联函数(Inline Function)是⼀种特殊的函数,它可以在编译时被嵌⼊到调⽤它的代
码处,⽽不是像普通函数那样通过函数调⽤机制(如压栈、跳转)来执⾏。这种特性可以减少函数
调⽤的开销,提⾼程序运⾏效率。
2.6.1 内联函数的声明与定义
内联函数通过 inline 关键字声明,通常需要在头⽂件中同时完成声明和定义(这⼀点与普通函
数不同)。
⽰例:
mB = "美美桑内"; // 正确:mutable成员可以修改
}
};
int main()
{
const Person p; // 常对象
// p.mA = 10; // 错误:常对象不能修改普通成员变量
p.mb = "沈佳润"; // 正确:mutable成员可修改
p.show(); // 正确:常对象正常调用常函数
return 0;
}
2.6.2 内联函数的特点
1. 消除函数调⽤开销:编译器会将内联函数的代码直接插⼊到调⽤它的地⽅,避免了函数调⽤时的栈操作、跳转等开销。
2. 适⽤于短⼩函数:内联机制更适合代码量少(通常⼏⾏代码)、被频繁调⽤的函数。如果函数体过⼤,频繁内联会导致代码膨胀,反⽽降低效率。
3. 编译器的决策: inline 关键字只是对编译器的⼀种建议,编译器可以根据实际情况(如函数复杂度、优化策略)决定是否真正内联该函数。
4. 不能包含复杂结构:内联函数通常不能包含循环、递归、switch 等复杂控制结构,否则编译器可能会忽略内联请求。
5. 链接特性:内联函数具有内部链接(internal linkage),这意味着在多个源⽂件中可以有相同的内联函数定义,⽽不会导致链接错误。
2.6.3 内联函数与宏的区别
内联函数常被⽤来替代 C 语⾔中的宏(Macro),但两者有重要区别:
内联函数会进⾏类型检查,⽽宏只是简单的⽂本替换,可能导致类型安全问题。
内联函数由编译器处理,⽽宏由预处理器处理。
内联函数可以像普通函数⼀样调试,⽽宏难以调试。
⽰例(宏与内联函数的对⽐):
// 在头文件中声明并定义内联函数
inline int add(int a, int b) {
return a + b;
}
2.6.4 使⽤场景
频繁调⽤的⼩函数(如⼯具函数、getter/setter ⽅法)。 对性能要求较⾼的代码段。
2.6.5 注意事项
不要滥⽤内联:过⼤的函数内联会增加可执⾏⽂件的⼤⼩(代码膨胀),可能导致缓存命中率下降。类的成员函数:在类内部定义的成员函数会被⾃动视为内联函数,⽆需显式添加 inline 关键字。
⽰例(类内⾃动内联的成员函数):
// 宏定义(存在类型安全问题)
#define ADD(a, b) (a + b)
// 内联函数(类型安全)
inline int add(int a, int b) {
return a + b;
}
class MyClass {
private:
int value;
public:
// 自动成为内联函数
int getValue() const {
return value;
}
void setValue(int v); // 声明,需在类外定义
};
// 类外定义的成员函数,若要内联需显式声明
inline void MyClass::setValue(int v) {
value = v;
总之,内联函数是 C++ 中⽤于优化⼩型、频繁调⽤函数的有效⼿段,但需合理使⽤以避免代码膨胀和性能问题。
