浅析C/C++ 中return *this和return this的区别

首先我们知道~

class Test
{
public:
 Test()
 {
  return this; //返回的当前对象的地址
 }
 Test&()
 {
  return *this; //返回的是当前对象本身
 }
 Test()
 {
  return *this; //返回的当前对象的克隆
 }
private: //...
};

return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是拷贝, 若返回类型为A&, 则是本身 )。

return this返回当前对象的地址(指向当前对象的指针)

我们再来看看返回拷贝那个的地址~

#include <iostream>
using namespace std;
class Test
{
public:
 int x;
 Test get()
 {
  return *this; //返回当前对象的拷贝
 }
};
int main()
{
 Test a;
 a.x = 4;
 if(a.x == a.get().x)
 {
  cout << a.x << endl;
    cout << &a << endl;
    cout << &a.get() <<endl;
 }
 else
 {
  cout << "no" << endl;
    cout << &a << endl;
    cout << &a.get() <<endl;
 }

 return 0;
}

由运行结果得知会报下列错误!!!

cpp [Error] taking address of temporary [-fpermissive]

这是因为引用了临时对象的地址而引发的警报 临时对象不可靠……

所有要注意!

下面谈谈[C++]类成员返回语句 return *this 的理解

经常会在类似 copy-assignment 的成员函数看到返回语句 return *this ,这类函数通常返回类型是所属类的引用。

类成员函数的隐式指针 class *this const 经过 *this的解引用后成为此对象本身。此时若成员函数返回类型是 class ,那么返回的将是 this 指向的对象实体的拷贝;

若返回类型是 class& ,那么将返回一个绑定在 this 指向的对象实体上的引用。

总结

以上所述是小编给大家介绍的C/C++ 中return *this和return this的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 详解JS构造函数中this和return

    先看一段代码, function Foo(name,age){ this.name=name; this.age=age; } var foo=new Foo("Tom",14); foo.name;//Tom foo.age;//14 使用构造函数实例化发生的流程: 1.建立一个foo的空对象. 2.将构造函数中的Foo的this指向对象foo. 3.foo的_proto_属性指向Foo函数的prototype原型. 4.执行构造函数中的代码. 相对于普通函数,构造函数中的this是

  • 浅析form标签中的GET和POST提交方式区别

    目录 form标签中的GET和POST 1.form表单使用post方式提交的例子 2.form表单使用get方式提交的例子 3.一键多值的getlist方法 后端如何通过获取多选框用户选中的选项--使用getlist方法 4.request中GET和POST对象的属性 第一个:GET属性! 第二个:POST属性! 5.GET和POST请求方式总结 form标签中的GET和POST 一个表单必须指定两样东西: form的method参数用于设置表单的提交方式,默认使用POST. action用于

  • 浅析C/C++ 中return *this和return this的区别

    首先我们知道~ class Test { public: Test() { return this; //返回的当前对象的地址 } Test&() { return *this; //返回的是当前对象本身 } Test() { return *this; //返回的当前对象的克隆 } private: //... }; return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是拷贝, 若返回类型为A&, 则是本身 ). return this返回当前对象的地址(指向当前

  • javascript中return,return true,return false三者的用法及区别

    1.语法及返回方式 ①返回控制与函数结果 语法为:return 表达式; 语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去 ②返回控制无函数结果 语法为:return; 在大多数情况下,为事件处理函数如果让其返回false,可以防止默认的事件行为.例如,默认情况下,点击一个<a>标签元素,页面会跳转到该元素href属性指定的页. 而return false就相当于终止符,return true就相当于执行符. 在js中return false的作用一般是用来取消默认动作的

  • 浅析在javascript中创建对象的各种模式

    最近在看<javascript高级程序设计>(第二版) javascript中对象的创建 •工厂模式 •构造函数模式 •原型模式 •结合构造函数和原型模式 •原型动态模式 面向对象的语言大都有一个类的概念,通过类可以创建多个具有相同方法和属性的对象.虽然从技术上讲,javascript是一门面向对象的语言,但是javascript没有类的概念,一切都是对象.任意一个对象都是某种引用类型的实例,都是通过已有的引用类型创建:引用类型可以是原生的,也可以是自定义的.原生的引用类型有:Object.A

  • 浅析C/C++中动态链接库的创建和调用

    DLL 有助于共享数据和资源.多个应用程序可同时访问内存中单个DLL 副本的内容.DLL 是一个包含可由多个程序同时使用的代码和数据的库.下面为你介绍C/C++中动态链接库的创建和调用. 动态连接库的创建步骤: 创建Dll有两种方式. 一.创建Non-MFC DLL动态链接库 1.打开File -> New -> Project选项,选择Win32 Dynamic-Link Library ->sample project ->工程名:DllDemo 2.新建一个.h文件DllDe

  • fragment中的add和replace方法的区别浅析

    使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace ,对这两个方法的区别一直有点疑惑. 我觉得使用 add 的话,在按返回键应该是回退到上一个 Fragment,而使用 replace 的话,那个别 replace 的就已经不存在了,所以就不会回退了.但事实不是这样子的.add 和 replace 影响的只是界面,而控制回退的,是事务. public abstract FragmentTransaction add (int con

  • 浅析Go语言中闭包的使用

    目录 闭包基本介绍 闭包实现数字累加 代码说明 代码分析 闭包案例 上代码 代码说明 闭包基本介绍 闭包就是 一个函数 和其相关的 引用环境 组合的一个整体 好处: 保存引用的变量,下次继续使用,不会销毁 下面通过闭包的方式,写一个数字累加器,体验一下闭包的妙处 闭包实现数字累加 package main import "fmt" // 累加器 // 闭包 - 函数柯里化 // 返回值类型: func(int) int func AddUpper() func(int) int { v

  • 浅析Go语言中数组的这些细节

    目录 Go语言基础二 len&cap 二维数组的遍历 数组的拷贝与传参 求数组所有元素之和 例题:数组元素匹配问题 今日总结 Go语言基础二 len&cap 书接上文,我们提到二维数组中的第二个维度的数组不能用...来表示,接下来我们要认识两个新的函数,它们分别是len和cap package main ​ func main() { a := [2]int{} println(len(a), cap(a)) } 由上方代码可知,我们在main函数里面定义了一个a数组,长度为2,未进行初始

  • 浅析C/C++中sort函数的用法

    sort是STL中提供的算法,头文件为#include<algorithm>以及using namespace std; 函数原型如下: template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare> void sor

  • 浅析javascript中函数声明和函数表达式的区别

    javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. 3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而     函数表达式可以在任何地方声明. 下面分别用两种方法定

随机推荐