this关键字
this是一个指向当前对象实例的指针,主要用于类的成员函数中。
它允许成员函数访问调用该函数的对象。
主要用法:
1、访问成员变量:当成员函数中的局部变量名与类的成员变量名相同时,可以使用this指针来区分它们。
class MyClass
{
private:
int value;
public:
void setValue(int newValue)
{
this->value = newValue; //这个类的value = newValue
}
}
2、返回当前对象的引用:this可以用来返回当前调用对象自身的引用。
这在链式调用模式中非常有用。
class MyClass {
public:
MyClass& setA(int a) {
// 设置属性A
return *this; // 返回this,允许链式调用
}
MyClass& setB(int b) {
// 设置属性B
return *this; // 返回this,允许链式调用
}
};
MyClass obj;
obj.setA(10).setB(20); // 链式调用
3、作为函数参数传递:尽管不常见,this指针可以作为参数传递给其他函数。
这在特定情况下,如实现回调函数时可能有用。
class MyClass {
public:
void doSomething() {
// 调用外部函数,并传递this指针
externalFunction(this);
}
};
void externalFunction(MyClass* obj) {
// 使用obj指针操作MyClass对象
}
4、静态成员函数中的限制:静态成员函数没有this指针,因为它不依赖于特定的对象实例。
如果你尝试在静态成员函数内部使用this,编译器将会报错。
5、友元函数中的限制:友元函数虽然不是类的成员,但如果它们需要访问类的非静态成员,可以通过传递对象指针或引用来使用this。
然而,友元内部不允许直接使用this,因为它不是类的成员函数。
内联函数
在编译时展开,减少运行时开销的一种优化技术。
内联函数通过在编译期间将函数调用点替换为函数本体代码的方式,避免了函数调用过程中涉及到的开销(栈帧的创建和销毁、参数的传递、返回地址的管理等),提高了程序执行的速度。
定义和使用内联函数:
在函数声明前加上inline关键字来定义一个内联函数。
如:
inline int add(int a, int b)
{
return a + b;
}
或者,对于类成员函数:
class Myclass
{
public:
inline int add(int a, int b)
{
return a + b;
}
}
通过inline关键字声明,也可以在类的cpp文件里定义函数时在前面指明inline。
一个类的成员函数在类的头文件实现了,拿它也是内联函数。
最好只在类外部定义的地方说明inline,这样可以使类更容易理解。
特点:
1、编译时展开:内联函数的代码在编译期间直接插入到调用处,而不是通过函数调用的方式执行。这意味着内联函数没有函数调用的开销。
2、代码膨胀:由于内联函数的代码会在每个调用点展开,如果内联函数体很大或者被频繁调用,可能会导致最终的可执行文件体积增大。
3、不一定总是内联:如果函数体过于复杂,编译器可能会选择不内联该函数以免代码膨胀.
使用场景:
1、小型函数
2、频繁调用的函数
3、避免函数调用的开销
mutable机制
mutable关键字提供了一种机制,允许类的成员变量在const成员函数中被修改。
通常情况下,当成员函数被声明为cosnt时,它不能修改类的任何成员变量。
但是,可以通过将某个变量声明为mutable,可以解除这一限制,使得这些变量即使在const成员函数中也能被修改。
使用场景:
1、缓存值:有时,计算某个成员变量的值可能很昂贵,但在const成员函数中需要频繁访问这个值。
通过将这个变量声明为mutable,可以在const成员函数中缓存并更新这个值,而不会违反const成员函数不改变对象状态的约定。
2、计数器或状态标志:在某些情况下,可能需要跟踪const成员函数被调用的次数,或者记录对象的状态。
使用mutable成员变量可以方便地实现这一点,而不影响const成员函数的语义。
链式调用
链式调用是一种编程技术,它允许在一个对象上连续调用多个方法。
优点:大幅减少代码量,使得代码逻辑更加清晰。
核心:在于每个函数在执行完操作后,返回对象本身的引用(通常返回this或者* this),这样就可以在返回的对象上继续调用方法,形成链式效果。
关键点:
1、返回对象引用:每个函数在执行操作后,需要返回对象本身的引用,而不是返回拷贝。
2、状态改变:每个链式方法会改变对象的状态,这样链式下去,对象状态会不断改变。
3、引用传递:链式调用都是简历在对象引用的基础上,采用引用传递而不是值传递。这样对对象的操作就是对同一个对象的实例进行的。
4、无需临时变量:链式调用让代码更简洁,避免定义许多临时变量,直接通过方法链表达一个操作流程。
#include <iostream>
class Calculator {
public:
Calculator& add(int value) {
result += value;
return *this; // 返回对象本身
}
Calculator& multiply(int value) {
result *= value;
return *this; // 返回对象本身
}
void display() {
std::cout << "Result: " << result << std::endl;
}
private:
int result = 0;
};
int main() {
Calculator calc;
calc.add(5).multiply(3).add(2).multiply(4).display(); // 链式调用
return 0;
}
标签:调用,函数,访问控制,成员,int,对象,内联
From: https://www.cnblogs.com/H43724334/p/18211582