this 指针:指向对象自身的隐含指针

this 指针:指向对象自身的隐含指针

在C++面向对象编程中,我们已经学习了类的基本结构、构造函数、析构函数、静态成员变量与静态成员函数。上一篇博客中我们重点强调:静态成员函数的核心特性是"没有this指针",因此它不依赖对象、无法访问非静态成员。

而今天我们要聚焦的this指针,正是与静态成员函数形成鲜明对比的核心概念------它是隐含在非静态成员函数中的"隐形指针",悄悄指向当前调用该函数的对象,是连接非静态成员函数与对象自身的"桥梁"。没有this指针,非静态成员函数就无法区分"哪个对象在调用自己",也无法访问对象自身的非静态成员。

很多初学者在接触this指针时,都会陷入"看不见、摸不着,但又无处不在"的困惑:this指针到底是什么?它在哪里?为什么我们没写代码声明它,却能直接使用对象的非静态成员?本文将从实际场景切入,拆解this指针的本质、底层逻辑、使用规则,结合实战案例演示其显式与隐式用法,规避高频误区,同时衔接上一篇静态成员函数的知识点,帮你彻底搞懂this指针的核心价值,完善C++类与对象的知识体系,为后续学习多态、友元等知识点打下坚实基础。

核心前提回顾:非静态成员函数依赖对象调用,每个对象的非静态成员(变量/函数)是独立的;静态成员函数不依赖对象,没有this指针,只能访问静态成员------这两点是理解this指针"为什么存在""有什么用"的关键。

一、先明确:为什么需要this指针?

在讲解this指针的具体用法之前,我们先通过一个简单的实际场景,搞清楚它的核心需求:没有this指针,非静态成员函数会遇到什么问题?

我们定义一个"学生类",包含非静态成员变量(姓名、年龄)和非静态成员函数(设置信息、显示信息),代码如下:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Student {
public:
    // 非静态成员函数:设置学生信息
    void setInfo(string name, int age) {
        // 问题:这里的name、age,到底是函数参数,还是对象的成员变量?
        name = name;  // 本意:将参数name的值,赋值给对象的成员变量name
        age = age;    // 本意:将参数age的值,赋值给对象的成员变量age
    }

    // 非静态成员函数:显示学生信息
    void showInfo() {
        cout << "姓名:" << name << ",年龄:" << age << endl;
    }

private:
    // 非静态成员变量:每个对象独立拥有
    string name;
    int age;
};

int main() {
    Student s1;
    s1.setInfo("张三", 18);
    s1.showInfo();  // 预期输出:姓名:张三,年龄:18,实际输出什么?

    Student s2;
    s2.setInfo("李四", 19);
    s2.showInfo();  // 预期输出:姓名:李四,年龄:19

    return 0;
}

运行结果(不符合预期):

Plain 复制代码
姓名: ,年龄:0
姓名: ,年龄:0

问题分析:

setInfo()函数中,name = name;age = age; 之所以无效,是因为函数参数名与对象的成员变量名重名,编译器会优先识别"局部变量(函数参数)",导致赋值操作变成"自己给自己赋值",完全没有修改到对象的成员变量。

更核心的问题的是:当我们调用 s1.setInfo("张三", 18) 时,setInfo()函数怎么知道"自己要修改的是s1对象的成员变量",而不是s2对象的?毕竟s1和s2都有独立的name和age,且setInfo()是同一个非静态成员函数。

这两个问题,都需要this指针来解决:

  1. 区分重名的成员变量与函数参数:this指针可以明确指向"对象自身的成员变量",避免歧义;

  2. 定位当前调用函数的对象:this指针指向"正在调用当前非静态成员函数的对象",让函数知道自己要操作哪个对象的成员。

修改代码,使用this指针解决问题:

cpp 复制代码
// 核心修改:使用this指针区分成员变量与参数
void setInfo(string name, int age) {
    // this->name:当前对象的成员变量name
    // name:函数参数name
    this->name = name;
    this->age = age;
}

int main() {
    Student s1;
    s1.setInfo("张三", 18);
    s1.showInfo();  // 输出:姓名:张三,年龄:18(符合预期)

    Student s2;
    s2.setInfo("李四", 19);
    s2.showInfo();  // 输出:姓名:李四,年龄:19(符合预期)

    return 0;
}

这就是this指针的核心价值之一:它是隐含在非静态成员函数中的"对象定位器",悄悄指向当前调用函数的对象,帮函数区分"操作哪个对象""哪个是对象的成员"。没有this指针,非静态成员函数就无法正常工作------因为它不知道自己要操作的对象是谁。

二、核心概念:什么是this指针?

this指针(this pointer),是C++编译器自动隐含在所有非静态成员函数 中的一个"隐含指针参数",它的本质是:指向当前正在调用该非静态成员函数的对象,即"对象自身的指针"。

我们可以把this指针理解为:每个非静态成员函数都有一个"隐藏的第一个参数",这个参数就是this指针,它由编译器自动传递,不需要我们手动声明、也不需要我们手动传递------我们看不见它,但它一直存在,默默发挥作用。

1. this指针的核心特性(必记,紧扣"隐含、指向对象")

  1. 隐含性:this指针是编译器自动添加到非静态成员函数中的"隐藏参数",无需我们手动声明、无需手动传递;我们在函数中可以直接使用this指针(显式使用),也可以不用(隐式使用)------即使不用,编译器也会自动通过this指针访问对象的成员。

  2. 指向性:this指针的指向是"当前调用该非静态成员函数的对象"------调用不同的对象,this指针就指向不同的对象。比如调用s1.setInfo(),this就指向s1;调用s2.setInfo(),this就指向s2。

  3. 不可修改性:this指针是一个"常量指针"(this本身的值不能修改),即我们无法在非静态成员函数中修改this指针的指向(比如不能写 this = &s2;)------因为它的作用就是固定指向"当前对象",修改它的指向没有意义,还会导致错误。

  4. 只存在于非静态成员函数中:

    • 非静态成员函数:有this指针(编译器自动添加),可以通过this指针访问当前对象的所有成员(静态+非静态);

    • 静态成员函数:没有this指针(上一篇重点强调)------因为静态成员函数不依赖对象调用,没有"当前对象",所以编译器不会为它添加this指针,这也是静态成员函数无法访问非静态成员的核心原因。

  5. 类型固定:this指针的类型是"类类型* const"(常量指针),比如Student类的this指针,类型是 Student* const ------指针指向Student类型的对象,且指针本身的值不能修改。

  6. 生命周期:this指针的生命周期与当前调用的非静态成员函数一致------函数被调用时,编译器传递this指针(指向当前对象);函数执行结束时,this指针自动销毁,不会占用额外内存。

2. 关键补充:this指针的"隐式使用"与"显式使用"

我们在非静态成员函数中访问对象的成员时,其实有两种方式:隐式使用this指针、显式使用this指针------两种方式本质一致,都是通过this指针访问成员,只是写法不同。

(1)隐式使用this指针(最常用,我们平时写的都是这种)

当我们在非静态成员函数中直接访问对象的非静态成员时,编译器会自动帮我们"补全"this指针------即隐式使用this指针访问成员。

比如之前的showInfo()函数,我们写的是:

cpp 复制代码
void showInfo() {
    cout << "姓名:" << name << ",年龄:" << age << endl;
}

但编译器在编译时,会自动将其转换为(显式使用this指针的形式):

cpp 复制代码
void showInfo() {
    cout << "姓名:" << this->name << ",年龄:" << this->age << endl;
}

也就是说:我们平时写的 name,本质上是 this->name 的简写------this指针的隐式使用,让我们的代码更简洁、更易读。

(2)显式使用this指针(场景化使用,解决特定问题)

显式使用this指针,就是我们手动写出 this->成员名 的形式,主要用于解决以下3个常见场景:

  1. 解决"函数参数与成员变量重名"的歧义(最常用场景):比如之前的setInfo()函数,参数name、age与成员变量name、age重名,必须用this指针区分;

  2. 在非静态成员函数中,返回当前对象本身(实现链式调用):比如实现"连续设置对象信息""连续调用成员函数";

  3. 明确指出"访问的是当前对象的成员",提升代码可读性(尤其是在复杂类中)。

示例:显式使用this指针实现链式调用(实用场景)

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Student {
public:
    // 显式使用this指针,返回当前对象本身(*this表示当前对象)
    Student& setName(string name) {
        this->name = name;
        return *this;  // 返回当前对象,支持链式调用
    }

    Student& setAge(int age) {
        this->age = age;
        return *this;  // 返回当前对象,支持链式调用
    }

    void showInfo() {
        cout << "姓名:" << this->name << ",年龄:" << this->age << endl;
    }

private:
    string name;
    int age;
};

int main() {
    // 链式调用:连续调用setName、setAge,简洁高效
    Student s1;
    s1.setName("张三").setAge(18).showInfo();  // 输出:姓名:张三,年龄:18

    Student s2;
    s2.setAge(19).setName("李四").showInfo();  // 输出:姓名:李四,年龄:19

    return 0;
}

关键说明:return *this; 表示"返回当前对象本身"------因为this是指向当前对象的指针,*this 就是当前对象。返回值类型必须是"类类型&"(引用),这样才能实现链式调用(否则返回的是对象副本,链式调用会失效)。

3. this指针与静态成员函数的对比(衔接上一篇,必记)

上一篇我们重点讲解了静态成员函数"没有this指针",这里我们用表格明确this指针与静态成员函数的核心关联,帮你巩固知识点、避免混淆:

对比维度 非静态成员函数(有this指针) 静态成员函数(无this指针)
this指针 有(编译器自动添加的隐含指针,指向当前对象) 没有(核心区别)
调用方式 必须通过对象调用(this指针需要指向具体对象) 可通过类名调用(推荐)或对象调用(无需this指针)
访问成员权限 可访问所有成员(静态+非静态,通过this指针访问非静态) 只能访问静态成员(无this指针,无法访问非静态)
依赖对象 依赖对象(没有对象,this指针无指向,无法调用) 不依赖对象(无this指针,无需指向具体对象)
核心作用 操作当前对象的成员,区分重名参数与成员,实现链式调用 实现类级别的操作,配合静态成员变量使用

三、实战核心:this指针的常见使用场景(必会)

this指针的使用,核心是"利用它指向当前对象"的特性,解决实际开发中的具体问题。结合前文案例,我们总结3个高频使用场景,每个场景搭配实战代码,帮你快速掌握显式使用this指针的技巧,同时理解其底层逻辑。

场景1:解决函数参数与成员变量重名的歧义(最常用)

这是this指针最基础、最常用的场景------当非静态成员函数的参数名,与对象的非静态成员变量名重名时,必须用this指针区分"参数"和"成员变量",否则编译器会优先识别局部变量(参数),导致赋值失败。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Teacher {
public:
    // 构造函数:参数与成员变量重名(name、age、subject)
    Teacher(string name, int age, string subject) {
        // this->成员变量 = 参数:明确区分,避免歧义
        this->name = name;
        this->age = age;
        this->subject = subject;
    }

    // 非静态成员函数:参数与成员变量重名
    void setSubject(string subject) {
        this->subject = subject; // 区分:当前对象的subject = 参数subject
    }

    void showInfo() {
        cout << "姓名:" << name << ",年龄:" << age << ",科目:" << subject << endl;
    }

private:
    string name;    // 成员变量
    int age;        // 成员变量
    string subject; // 成员变量
};

int main() {
    Teacher t1("王老师", 35, "数学");
    t1.showInfo();  // 输出:姓名:王老师,年龄:35,科目:数学

    t1.setSubject("英语");
    t1.showInfo();  // 输出:姓名:王老师,年龄:35,科目:英语

    return 0;
}

关键提醒:如果参数名与成员变量名不重名,就不需要显式使用this指针------编译器会自动隐式使用this指针访问成员。但在实际开发中,很多人习惯将参数名与成员变量名保持一致(比如都用name、age),此时this指针就必不可少。

场景2:实现成员函数的链式调用(实用高效)

链式调用的核心是"连续调用同一个对象的多个成员函数",实现方式是:在每个非静态成员函数中,显式返回当前对象本身(return *this;),返回值类型为"类类型&"(引用)------这样就能连续调用下一个成员函数。

示例:实现一个"计算器类",用链式调用完成连续的加减乘除操作:

cpp 复制代码
#include <iostream>
using namespace std;

// 计算器类:实现链式调用
class Calculator {
public:
    // 构造函数:初始化计算结果为0
    Calculator() {
        result = 0;
    }

    // 加法:返回当前对象,支持链式调用
    Calculator& add(int num) {
        this->result += num;
        return *this; // 返回当前对象,继续调用下一个函数
    }

    // 减法:返回当前对象,支持链式调用
    Calculator& subtract(int num) {
        this->result -= num;
        return *this;
    }

    // 乘法:返回当前对象,支持链式调用
    Calculator& multiply(int num) {
        this->result *= num;
        return *this;
    }

    // 除法:返回当前对象,支持链式调用(简单处理,不考虑除数为0)
    Calculator& divide(int num) {
        if (num != 0) {
            this->result /= num;
        } else {
            cout << "错误:除数不能为0" << endl;
        }
        return *this;
    }

    // 获取计算结果
    int getResult() {
        return this->result;
    }

private:
    int result; // 非静态成员变量:存储计算结果
};

int main() {
    // 链式调用:连续执行 0 + 10 - 2 * 3 / 2
    Calculator calc;
    int res = calc.add(10).subtract(2).multiply(3).divide(2).getResult();
    cout << "计算结果:" << res << endl; // 计算过程:( (10-2)*3 )/2 = 12,输出12

    // 继续链式调用,基于上一次的结果继续计算
    res = calc.add(5).multiply(2).getResult();
    cout << "继续计算结果:" << res << endl; // 12 + 5 = 17,17*2=34,输出34

    return 0;
}

优势说明:链式调用让代码更简洁、更易读------原本需要多次写对象名调用函数,现在只需写一次对象名,连续调用多个函数,大幅提升开发效率。这也是this指针非常实用的一个场景,在实际开发中经常用到(比如C++的流操作cout << "a" << "b";,本质也是链式调用,底层依赖this指针)。

场景3:在成员函数中明确访问当前对象的成员(提升可读性)

在一些复杂的类中(比如成员变量、成员函数较多),即使参数名与成员变量名不重名,显式使用this指针,也能明确指出"当前访问的是当前对象的成员",让代码更易读、更易维护,避免他人阅读代码时产生歧义。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Product {
public:
    Product(string name, double price, int stock) {
        // 显式使用this指针,明确访问当前对象的成员,提升可读性
        this->m_productName = name;
        this->m_price = price;
        this->m_stock = stock;
    }

    // 检查库存:显式使用this指针,明确访问当前对象的库存
    bool checkStock(int num) {
        if (this->m_stock >= num) {
            this->m_stock -= num; // 扣减库存
            return true;
        } else {
            return false;
        }
    }

    void showProductInfo() {
        // 显式使用this指针,明确每个成员都是当前对象的
        cout << "商品名称:" << this->m_productName << endl;
        cout << "商品价格:" << this->m_price << "元" << endl;
        cout << "剩余库存:" << this->m_stock << endl;
    }

private:
    string m_productName; // 商品名称
    double m_price;       // 商品价格
    int m_stock;          // 商品库存
};

int main() {
    Product p1("C++编程书籍", 89.9, 50);
    p1.checkStock(10); // 购买10本,扣减库存
    p1.showProductInfo();

    return 0;
}

说明:这种场景下,显式使用this指针不是必须的,但能让代码的可读性更强------尤其是在团队开发中,他人看到 this->m_stock 就能立刻明白,这里访问的是"当前调用checkStock()函数的商品对象的库存",避免歧义。

四、常见误区:this指针的5个高频坑(必避)

结合初学者的常见错误,聚焦this指针的"隐含性、指向性、不可修改性"三大核心特性,总结5个高频坑,每个坑对应错误示例和正确写法,帮你少走弯路,彻底规避编译错误和逻辑问题。

误区1:在静态成员函数中使用this指针(编译报错)

cpp 复制代码
class Test {
public:
    static void staticFunc() {
        // 错误:静态成员函数没有this指针,无法使用this指针
        cout << this->m_data << endl;

        // 错误:即使不显式写this,编译器也不会为静态函数添加this指针
        cout << m_data << endl;
    }

private:
    int m_data; // 非静态成员变量
};

// 正确写法:静态成员函数只能访问静态成员,不能使用this指针
class Test {
public:
    static void staticFunc() {
        cout << m_staticData << endl; // 访问静态成员,合法
    }

private:
    static int m_staticData; // 静态成员变量
};

int Test::m_staticData = 100;

关键提醒:this指针只存在于非静态成员函数中,静态成员函数没有this指针------这是上一篇和本文的核心衔接点,也是初学者最容易混淆的点,务必牢记。

误区2:手动声明或传递this指针(编译报错)

cpp 复制代码
class Test {
public:
    // 错误:this指针是编译器自动添加的隐含参数,无需手动声明
    void func(Test* this, int num) {
        this->m_data = num;
    }

private:
    int m_data;
};

int main() {
    Test t;
    // 错误:this指针无需手动传递,编译器会自动传递
    t.func(&t, 100);
    return 0;
}

// 正确写法:无需声明、无需传递this指针,直接使用即可
class Test {
public:
    void func(int num) {
        this->m_data = num; // 直接使用this指针,编译器自动处理
    }

private:
    int m_data;
};

int main() {
    Test t;
    t.func(100); // 无需传递this指针
    return 0;
}

误区3:修改this指针的指向(编译报错)

cpp 复制代码
class Test {
public:
    void func(Test* other) {
        // 错误:this指针是常量指针,不能修改它的指向
        this = other;

        // 正确:可以修改this指针指向的对象的成员(即当前对象的成员)
        this->m_data = other->m_data;
    }

private:
    int m_data;
};

int main() {
    Test t1, t2;
    t1.func(&t2);
    return 0;
}

关键区分:this指针"本身的指向"不能修改(它是常量指针),但this指针"指向的对象的成员"可以修改------比如 this->m_data = 100; 是合法的,因为它修改的是当前对象的成员,而不是this指针的指向。

误区4:认为this指针是对象的一部分(逻辑误区)

cpp 复制代码
class Test {
public:
    int m_data;
};

int main() {
    Test t;
    // 误区:认为this指针是对象t的一部分,会占用对象的内存空间
    cout << "对象t的大小:" << sizeof(t) << endl; // 输出4(仅m_data的大小,无this指针)
    return 0;
}

关键说明:this指针不是对象的一部分,不会占用对象的内存空间------对象的内存空间,只存储它的非静态成员变量(静态成员变量存储在全局数据区,不属于对象)。this指针是编译器添加到非静态成员函数中的"隐含参数",存储在栈上(和普通函数参数一样),函数执行结束后自动销毁,与对象本身无关。

误区5:在构造函数/析构函数中滥用this指针(逻辑错误)

cpp 复制代码
#include <iostream>
using namespace std;

class Test {
public:
    Test() {
        // 错误:构造函数执行时,对象还未完全创建完成,此时this指针指向的对象不完整
        this->func(); // 调用非静态成员函数,可能导致未初始化的成员被访问
    }

    ~Test() {
        // 错误:析构函数执行时,对象已经开始销毁,成员可能已被释放
        this->func(); // 调用非静态成员函数,可能访问已释放的内存
    }

    void func() {
        cout << m_data << endl; // m_data可能未初始化(构造时)或已释放(析构时)
    }

private:
    int m_data;
};

int main() {
    Test t;
    return 0;
}

关键提醒:构造函数执行时,对象还未完全创建(成员变量可能未初始化);析构函数执行时,对象已经开始销毁(成员变量可能已被释放)------此时使用this指针调用非静态成员函数,可能访问未初始化或已释放的成员,导致逻辑错误或程序崩溃,尽量避免在构造/析构函数中通过this指针调用非静态成员函数。

五、综合实战:完整类设计(this指针+非静态成员+静态成员)

结合本文this指针的知识点,以及上一篇静态成员函数的内容,设计一个完整的"员工管理类",合理使用this指针(解决重名、实现链式调用),区分非静态成员函数(有this指针)和静态成员函数(无this指针),实现员工信息的设置、查询、统计等功能,代码可直接运行测试,巩固所学内容。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

// 完整类设计:this指针 + 非静态成员 + 静态成员
class Employee {
private:
    // 非静态成员变量:每个员工独立拥有(对象级数据)
    string m_id;       // 员工编号
    string m_name;     // 员工姓名
    int m_age;         // 员工年龄
    double m_salary;   // 员工薪资

    // 静态成员变量:所有员工共享(类级数据,统计员工总数)
    static int m_totalCount;

public:
    // 1. 有参构造:参数与成员变量重名,用this指针区分
    Employee(string id, string name, int age, double salary) {
        this->m_id = id;
        this->m_name = name;
        this->m_age = age;
        this->m_salary = salary;

        m_totalCount++; // 静态成员变量,所有对象共享,无需this指针
    }

    // 2. 析构函数:员工对象销毁时,总数自减
    ~Employee() {
        m_totalCount--;
    }

    // 3. 非静态成员函数:用this指针实现链式调用,修改员工信息
    Employee& setName(string name) {
        this->m_name = name;
        return *this;
    }

    Employee& setAge(int age) {
        this->m_age = age;
        return *this;
    }

    Employee& setSalary(double salary) {
        this->m_salary = salary;
        return *this;
    }

    // 4. 非静态成员函数:用this指针访问当前对象的成员,显示员工信息
    void showEmpInfo() {
        cout << "------------------" << endl;
        cout << "员工编号:" << this->m_id << endl;
        cout << "员工姓名:" << this->m_name << endl;
        cout << "员工年龄:" << this->m_age << endl;
        cout << "员工薪资:" << this->m_salary << "元" << endl;
        cout << "------------------" << endl;
    }

    // 5. 静态成员函数:无this指针,统计员工总数(类级操作)
    static int getTotalCount() {
        // 错误:静态成员函数无this指针,无法访问非静态成员
        // cout << this->m_name << endl;

        return m_totalCount; // 只能访问静态成员变量
    }
};

// 类外初始化静态成员变量
int Employee::m_totalCount = 0;

int main() {
    // 1. 创建3个员工对象
    Employee emp1("001", "张三", 25, 8000.0);
    Employee emp2("002", "李四", 28, 10000.0);
    Employee emp3("003", "王五", 30, 12000.0);

    // 2. 用this指针实现链式调用,修改员工信息
    emp1.setName("张三三").setAge(26).setSalary(8500.0);

    // 3. 显示员工信息(隐式/显式使用this指针)
    emp1.showEmpInfo();
    emp2.showEmpInfo();
    emp3.showEmpInfo();

    // 4. 静态成员函数:查询员工总数(无this指针,无需对象调用)
    cout << "当前员工总数:" << Employee::getTotalCount() << endl; // 输出3

    return 0;
}

运行结果(正常):

Plain 复制代码
------------------
员工编号:001
员工姓名:张三三
员工年龄:26
员工薪资:8500元
------------------
------------------
员工编号:002
员工姓名:李四
员工年龄:28
员工薪资:10000元
------------------
------------------
员工编号:003
员工姓名:王五
员工年龄:30
员工薪资:12000元
------------------
当前员工总数:3

代码说明(核心重点):

  • 合理使用this指针:构造函数中用this指针区分重名参数与成员变量,set系列函数中用this指针实现链式调用,showEmpInfo()中用this指针提升可读性;

  • 明确区分有/无this指针的函数:非静态成员函数(setName、showEmpInfo等)有this指针,可访问非静态成员;静态成员函数(getTotalCount)无this指针,只能访问静态成员;

  • 衔接上一篇知识点:静态成员变量m_totalCount统计员工总数,静态成员函数getTotalCount作为访问接口,无需对象调用;非静态成员函数通过this指针操作当前对象的成员,依赖对象调用;

  • 规避误区:静态成员函数中不使用this指针,不修改this指针的指向,不手动声明/传递this指针,确保代码合法、逻辑正确。

六、总结

this指针的核心是"隐含在非静态成员函数中的、指向当前对象的常量指针"------它看不见、摸不着,但无处不在,是连接非静态成员函数与对象自身的"桥梁"。没有this指针,非静态成员函数就无法区分"哪个对象在调用自己",也无法访问对象的非静态成员,无法正常工作。

相关推荐
梵刹古音6 小时前
【C++】构造函数
开发语言·c++
Gain_chance6 小时前
37-学习笔记尚硅谷数仓搭建-ADS层分析并以各品牌商品下单统计为例
笔记·学习
独自破碎E6 小时前
【曼哈顿距离】BISHI25 最大 FST 距离
java·开发语言
苏涵.6 小时前
Java三大集合:List、Set、Map
java·开发语言
Amumu121386 小时前
Vue3 Composition API(一)
开发语言·javascript·ecmascript
存在的五月雨6 小时前
Spring Security认证流程
java·开发语言·mysql
树码小子6 小时前
综合练习:验证码案例(1)总体设计
java·开发语言·spring
草莓熊Lotso6 小时前
Qt 主窗口核心组件实战:菜单栏、工具栏、状态栏、浮动窗口全攻略
运维·开发语言·人工智能·python·qt·ui
Ronin3056 小时前
持久化数据管理中心模块
开发语言·c++·rabbitmq·gtest