C++ 类成员函数 返回值类型 为 指针 引用 或 对象副本 的 区别

类的成员函数返回对象的指针:

return this;

返回值类型 : 类名*

支持链式调用:通过返回对象的指针,可以使得调用者能够连续调用该对象的其他成员函数,使用箭头操作符 (->)
条件性操作:可以根据条件返回对象自身的指针或nullptr,以表示某种状态或条件

#include <iostream>

using namespace std;

class MyClass
{
private:
    int num1;

public:
    MyClass()
    {
        num1 = 0;
    }
    // 返回值类型为 MyClass*
    MyClass *change()
    {
        num1 += 1;
        // 表示指向MyClass类型对象的指针
        return this;
    }
    void show()
    {
        cout << num1 << endl;
    }
};
int main()
{
    MyClass mc1;
    // mc1的num1
    //  +1        +1        =2
    mc1.change()->change()->show();
    // mc1的num1
    //  +1        +1        =4
    mc1.change()->change()->show();
    // mc1的num1
    //  +1        +1        =6
    mc1.change()->change()->show();
    return 0;
}

类的成员函数返回对象的引用:

return *this

返回值类型: 类名&

支持链式调用:使得调用者可以连续调用该对象的其他成员函数,使用点操作符 (.)
修改原始对象:由于返回的是引用,对返回对象所做的任何修改都会反映在原始对象上,而不是其副本

#include <iostream>

using namespace std;

class MyClass
{
private:
    int num1;

public:
    MyClass()
    {
        num1 = 0;
    }
    // 返回值类型为 MyClass&
    MyClass& change()
    {
        num1 += 1;
        // 表示当前对象
        return *this;
    }
    void show()
    {
        cout << num1 << endl;
    }
};
int main()
{
    MyClass mc1;
    // mc1的num1
    //  +1        +1        =2
    mc1.change().change().show();
    // mc1的num1
    //  +1        +1        =4
    mc1.change().change().show();
    // mc1的num1
    //  +1        +1        =6
    mc1.change().change().show();
    return 0;
}

类的成员函数返回对象的副本:

return *this

返回值类型 类名

当类的成员函数返回对象的副本时,它创建并返回当前对象或操作结果的一个新实例。这种做法适用于不希望外部修改原始对象,或需要返回一个局部修改后状态的场合
值语义:与返回引用或指针相比,返回副本强调了值语义,即每个对象都拥有自己的状态

缺点:链式调用难以判断

#include <iostream>

using namespace std;

class MyClass
{
private:
    int num1;

public:
    MyClass()
    {
        num1 = 0;
    }
    // 返回值类型为 MyClass
    MyClass change()
    {
        num1 += 1;
        // 表示当前对象副本
        return *this;
    }
    void show()
    {
        cout << num1 << endl;
    }
};
int main()
{
    MyClass mc1;
    // 1 mc1的num1+1=1
    // 2 复制副本 副本num1+1=2
    // 3 显示副本的 num1=2
    // 4 临时副本销毁
    mc1.change().change().show();
    // 此时观察num1的值为1:
    mc1.show(); // 1
    // 1 mc1的num1+1=2
    // 2 复制副本 副本num1+1=3
    // 3 显示副本 num1=3
    // 4 临时副本销毁
    mc1.change().change().show();
    // 此时观察num1的值为2:
    mc1.show(); // 2
    // 1 mc1的num1+1=3
    // 2 复制副本 副本num1+1=4
    // 3 显示副本 num1=4
    // 4 临时副本销毁
    mc1.change().change().show();
    // 此时观察num1的值为3:
    mc1.show(); // 3
    return 0;
}

相关推荐

  1. c++qt函数中如何返回一个对象对象引用

    2024-04-11 11:58:07       23 阅读
  2. C#中类型引用类型区别

    2024-04-11 11:58:07       13 阅读
  3. c#基础-引用类型类型区别

    2024-04-11 11:58:07       18 阅读
  4. c# 类型引用类型区别

    2024-04-11 11:58:07       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 11:58:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 11:58:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 11:58:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 11:58:07       20 阅读

热门阅读

  1. 设计模式:生活中的命令模式

    2024-04-11 11:58:07       13 阅读
  2. 【免安装的MATLAB--MATLAB online】

    2024-04-11 11:58:07       13 阅读
  3. 数据结构与算法 — 贪心算法

    2024-04-11 11:58:07       13 阅读
  4. Python:迭代器

    2024-04-11 11:58:07       14 阅读
  5. 【云开发笔记No.20】中台架构的分类

    2024-04-11 11:58:07       16 阅读
  6. 【RabbitMQ】RabbitTemplate类无法自动注入

    2024-04-11 11:58:07       14 阅读
  7. 【架构五】会话、事务、进程

    2024-04-11 11:58:07       15 阅读
  8. Flutter 中 AutomaticKeepAliveClientMixin 的介绍及使用

    2024-04-11 11:58:07       18 阅读
  9. 设计模式(015)行为型之模板方法模式

    2024-04-11 11:58:07       16 阅读
  10. Android bug Unresolved reference: BR

    2024-04-11 11:58:07       14 阅读