C++ *this与this的区别(系个人转载,个人再添加相关内容)

转载地址:http://blog.csdn.net/stpeace/article/details/22220777

return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 )。return this返回当前对象的地址(指向当前对象的指针), 下面我们来看看程序吧:

#include <iostream>
using namespace std;

class A
{
public:
    int x;
    A* get()
    {
        return this;
    }
};

int main()
{
    A a;
    a.x = 4;

    if(&a == a.get())
    {
        cout << "yes" << endl;
    }
    else
    {
        cout << "no" << endl;
    }

    return 0;
}

输出的是yes。也就是说,this是对象的地址。可以赋值给一个该类型的指针。

#include <iostream>
using namespace std;

class A
{
public:
    int x;
    A get()
    {
        return *this; //返回当前对象的拷贝
    }
};

int main()
{
    A a;
    a.x = 4;

    if(a.x == a.get().x)
    {
        cout << a.x << endl;
    }
    else
    {
        cout << "no" << endl;
    }return 0;
}

输出的是4。

也就是*this在函数返回类型为A的时候,返回的是对象的拷贝。

但是,继续对代码添加如下内容:

    if(&a == &a.get())
    {
        cout << "yes" << endl;
    }
    else
    {
        cout << "no" << endl;
    }  

结果发现,编译器报错:

说明,不仅返回的是一个对象的拷贝,还是一个temporary,即临时变量。这个时候,对临时变量取地址,是错误的。error。

(该结论对我所转载的原文进行了修正。原文是错误的。)

继续对代码进行修改:

#include <iostream>
using namespace std;

class A
{
public:
    int x;
    A& get()
    {
        return *this; //返回当前对象的拷贝
    }
};

int main()
{
    A a;
    a.x = 4;

    if(a.x == a.get().x)
    {
        cout << a.x << endl;
    }
    else
    {
        cout << "no" << endl;
    }
    if(&a == &a.get())
    {
        cout << "yes" << endl;
    }
    else
    {
        cout << "no" << endl;
    }
    return 0;
}

输出结果是4和yes。

也就是*this在函数返回类型为A &的时候,返回的是该对象的引用本身。

时间: 2024-12-21 14:35:50

C++ *this与this的区别(系个人转载,个人再添加相关内容)的相关文章

软件源代码与目标代码应区别保护(转载新闻)

正如美国微软公司的新任首席执行官塞亚·纳德拉所言:“当今世界是由软件所驱动的”,软件的重要性毋庸赘言,我国将软件纳入著作权法保护已有23年, 但至今软件的法律定义与法律保护仍很模糊.我国现行<计算机软件保护条例>将同一计算机程序的源程序与目标程序视为同一作品,然而源程序与目标程序的本质 属性并不相同,条例中的谬误会对软件的保护产生不利影响.因此,我国有必要重新审视软件的法律本质从而完善软件的法律保护制度,或对软件另行制定特别法来保护与规制. 本文经阐述软件著作权保护的冲突根源,指出现行<

PHP的抽象类、接口的区别和选择[转载]

区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过关键字extends继承. 2.接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量.抽象类中可以声明各种类型成员变量,实现数据的封装.(另JAVA接口中的成员变量都要声明为public static final类型) [php] view plaincopy <?php abstract class Father { function meth1() { echo &qu

Oracle CHAR,VARCHAR,VARCHAR2,nvarchar类型的区别与使用(转载)

一 varchar,varchar2,nvarchar,nvarchar2 四个类型都属于变长字符类型, varchar和varchar2的区别在与后者把所有字符都占两字节,前者只对汉字和全角等字符占两字节,都是非 Unicode 字符数据,可以定义的最大长度为4000字节. nvarchar和nvarchar2的区别和上面一样,   与上面区别在于是根据Unicode   标准所进行的定义的类型(长度定义的是字符数,而不是字节数),通常用于支持多国语言类似系统的定义,可以定义的最大长度为400

grep系的相关内容

grep系:  grep ; egrep ; fgrep grep就是利用正则表达式进行全局搜索并将匹配的行显示出来: 格式:  grep [OPTIIONS] PATTERN [FILE...]    PATTERNN:过滤条件,是由正则表达式以及没有特殊含义的文本字符组成的: 常用选项:   -i:忽略文本字符的大小写:   -v:反向匹配,最终显示的是PATTERN所不能成功匹配的行:   -c:计数,统计匹配PATTERN的所有行数:   -o:关闭贪婪模式,仅显示PATTERN所能够匹

C#break ,continue, return区别详解 [转载]

C#编程语法中break ,continue, return这三个常用的关键字的学习对于我们编程开发是十分有用的,那么本文就向你介绍break ,continue, return具体的语法规范. C#编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢?让我们开始介绍吧: 一.C#编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循

Java中HashMap和TreeMap的区别深入理解(转载)

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫 做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应 该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一

jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解 ----转载

1.(function($) {-})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即: (function(arg){-})(param) 这就相当于定义了一个参数为arg的匿名函数,并且将param作为参数来调用这个匿名函数 而(function($){-})(jquery)则是一样的,之所以只在形参使用$,是为了不与其

Git

Git基本常用命令如下: mkdir:         XX (创建一个空目录 XX指目录名) pwd:          显示当前目录的路径. git init          把当前的目录变成可以管理的git仓库,生成隐藏.git文件. git add XX       把xx文件添加到暂存区去. git commit –m “XX”  提交文件 –m 后面的是注释. git status        查看仓库状态 git diff  XX      查看XX文件修改了那些内容 git

【LaTeX】E喵的LaTeX新手入门教程(2)基础排版

换了块硬盘折腾了好久..联想的驱动真坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇文档框架嗯昨天我们已经编写了一个最基本的文档,其内容是这样的:\documentclass{article}\begin{document}XXX is a SB.\end{document}这个文档呢其实是分为两部分的:一部分是\begin{document}之前的那部分也就是第一行,这一部分我们称之为导言区.导言区的内容可以不只一行,它的作用是完成文档的基础设定.比如在这个文档中,我们使用