标题:this指针链接问题
只看楼主
生命太短暂
Rank: 2
等 级:论坛游民
帖 子:16
专家分:15
注 册:2020-4-30
结帖率:100%
已结贴  问题点数:20 回复次数:8 
this指针链接问题
可是this链接我有点不懂如这一句calc.add(5).sub(3).mult(4);
在学习过程中知道了this其实是一个const指针,可接受类成员变量的地址,
这个代码是我教材的代码,并不是自己扣字扣出来的,
对于代码的解读,add是calc类型的引用,并且add等于*this,可这样理解this=&calc.m_value,然后this+=value然后进行return   this解引用,其他的类似(这一句是我自己琢磨出来的可能不对)然后得到(5-3)*4,最终返回m_value;的值。
可是calc.add(5).sub(3).mult(4);就不怎么理解了?说是返回的是*this

class Calc
{
private:
    int m_value;
public:
    Calc() { m_value = 0; }
 
    Calc& add(int value) { m_value += value; return *this; }
    Calc& sub(int value) { m_value -= value; return *this; }
    Calc& mult(int value) { m_value *= value; return *this; }
 
    int getValue() { return m_value; }
};


#include <iostream>
int main()
{
    Calc calc;
    calc.add(5).sub(3).mult(4);
 
    std::cout << calc.getValue() << '\n';
    return 0;
}
搜索更多相关主题的帖子: return int this add value 
2020-05-03 20:39
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
得分:10 
在这个类里,系统自己维护了一个this指针指向这个类的实例
那几个函数的类型是Calc的引用类型,也就是说传回一个实例,而return *this;就是说把调用函数的这个实例传回去
其实就是如下步骤:
calc.add(5)先做完这一步,返回calc这个实例
calc.sub(3)然后上边那一段代码就等于calc
calc.mult(4)同样,上方调用结束,返回这个实例
所以,这样的写法差不多是用来减少代码量的,本来你需要写三行分别调用,现在你可以一连串的写下去
【不知道对不对,如果有误请指出,谢谢!】
2020-05-04 08:28
生命太短暂
Rank: 2
等 级:论坛游民
帖 子:16
专家分:15
注 册:2020-4-30
得分:0 
我也知道分开是这样的写法,可是像calc.add(5).sub(3).mult(4);这样的写法有点不科学,为什么可以连续.
2020-05-04 09:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
返回的是自身的引用
2020-05-04 09:55
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
得分:0 
calc.add(5)这段返回的是*this,而this就是calc的指针,加上星号就是返回了calc实例,它的函数类型是Calc&就是楼上的引用类型
然后上边返回了calc以后,
calc.add(5).sub(3).mult(4);
这段红色代码的结果就是calc
也就变成了
calc.sub(3).mult(4);
这个红色的是上边calc.add(5)的返回值
2020-05-04 12:53
生命太短暂
Rank: 2
等 级:论坛游民
帖 子:16
专家分:15
注 册:2020-4-30
得分:0 
就是说自身的引用就是说this->add,sub,mult, 实际是this->calc的别名?对了实例是什么意思
2020-05-04 13:22
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
得分:0 
这个……
总之,类型后边儿加上&表示引用,比如说
func(int &a)
这个函数你传入参数的时候,不再是创建一个int型名为a的变量,将传入参数赋值给a,而是将你传入的参数的地址给a。可以理解为a没有属于自己的内存空间,而是直接与传入参数共用一块内存
那几个函数因为是引用类型,也就是返回的实例将会被引用,而this是一个指针,存的是地址,所以需要返回*this才是这块空间的具体值,然后返回了一个实例,让表达式去对这个实例进行操作。
calc.add(5)返回了一个实例*this,而*this就是calc自己,所以此函数引用了这个实例,而后边表达式(或者说后边代码)想要进行的操作是:.sub(3),调用这个实例的成员函数sub,调用结束,再次返回这个实例,接下来的操作是.mult(4),调用这个实例的成员函数mult。所以可以连着写一起。

这段代码拿回去琢磨琢磨,差不多就可以知道引用了(引用变量似乎必须要在声明时就初始化)
程序代码:
#include<cstdio>
int main() {
    int b;
    int &a=b;
    b=5;
    a++;
    printf("%d %d\n",a,b);
    a--;
    printf("%d %d\n",a,b);
    return 0;
}


实例就是说,系统按照某一个类型去分配内存,那么那个分配内存的总称就叫做这个类型的实例
比如:int a;   a就是int实例
DATA b;     b就是DATA实例
2020-05-04 14:07
生命太短暂
Rank: 2
等 级:论坛游民
帖 子:16
专家分:15
注 册:2020-4-30
得分:0 
谢谢耐心指导,根据7楼的思维,可以理解为实例就是变量名?
2020-05-04 14:29
雪影辰风
Rank: 6Rank: 6
来 自:衡阳市
等 级:贵宾
威 望:22
帖 子:177
专家分:387
注 册:2019-6-17
得分:0 
差不多是这个意思
基本上可以理解为,某个类型实际存在的一个可以直接使用的变量或者常量都叫做实例吧。
2020-05-04 15:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501406-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.325303 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved