C++中return this与*this这两种不同的返回值形式

本文探讨了C++中函数返回*this与this的区别。通过实例演示,return*this返回当前对象的拷贝或引用,而returnthis返回当前对象的地址。深入解析了不同返回类型对对象行为的影响。

本文讨论的是在C++的类相关知识中,关于函数的返回值为 *thisthis 的情况。

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

#define _CRT_SECURE_NO_WARNINGS
#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 << "地址" << endl;
	}
	else
	{
		cout << "非地址" << endl;
	}

	return 0;
}

控制台显示:地址
这说明get()方法中的return this,返回的是当前对象的地址

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class A
{
public:
	int x;
	A() {
		x = 0;
	}
    //这里写了一个拷贝构造函数,所以得再提供一个构造函数
	A(const A &a) {
		x = a.x;
		printf("copy constructor is called\n");
	}
	
	//* 如果显示的写了一个普通的构造函数,会隐藏默认的无参构造函数
	//*如果显示的写了一个拷贝构造函数,会隐藏默认的无参构造函数和默认构造函数
	//* 如果显示的写了一个析构函数,会隐藏默认的析构函数
	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 << "地址" << endl;
	}
	else
	{
		cout << "不是地址" << endl;
	}

	return 0;
}

控制台显示:

copy constructor is called
4
copy constructor is called
不是地址

这说明get()方法中的return *this在程序运行过程中返回的不是地址,而是当前对象的一个拷贝(因为调用了拷贝构造函数)

如果将程序返回值改为A&,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class A
{
public:
	int x;
	A() {
		x = 0;
	}
    //这里写了一个拷贝构造函数,所以得再提供一个构造函数
	A(const A &a) {
		x = a.x;
		printf("copy constructor is called\n");
	}
	
	//* 如果显示的写了一个普通的构造函数,会隐藏默认的无参构造函数
	//*如果显示的写了一个拷贝构造函数,会隐藏默认的无参构造函数和默认构造函数
	//* 如果显示的写了一个析构函数,会隐藏默认的析构函数
	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 << "地址" << endl;
	}
	else
	{
		cout << "不是地址" << endl;
	}

	return 0;
}

控制台显示:

4
不是地址

说明当返回类型为 A& 时,没有调用拷贝构造函数,返回的是当前对象本身(即引用),而不是拷贝出来的副本。

<think>好的,用户的问题是关于C++中特定表达式的含义,具体是“Nequals dereferencedthis moduloB”。首先,我需要分解这个表达式中的各个部分,并逐一解释它们在C++中的意义。 首先,用户提到了“dereferenced this”。在C++中,`this`是一个指向当前对象的指针,通常用于类的成员函数中。当使用`*this`时,就是对`this`指针进行解引用,得到当前对象本身。例如,在类的成员函数中,`*this`会返回该对象的实例。接下来是“moduloB”。这里的modulo指的是取模运算,即计算除法的余数。在C++中,取模运算符是`%`,例如`a% B`会得到a除以B后的余数。 组合起来,“dereferenced thismodulo B”可能是指对`*this`进行某种操作后的结果再取模B。但这里需要明确的是,`*this`是一个对象实例,而取模运算通常适用于整数类型。因此,可能存在两种情况:要么该对象重载了取模运算符,使得`*this% B`是合法的;要么用户可能误解了表达式,实际上是指某个成员变量的值取模B。假设表达式是`N =(*this) %B`,那么需要确保该对象的类重载了`%`运算符。例如:```cppclassMyClass{ public:int value;int operator%(intmod){returnvalue %mod;}}; ```在这种情况下,`*this %B`会调用重载的`%`运算符,返回`value %B`的值,并赋值给N。如果用户的问题中涉及到指针运算,例如将`this`指针转换为整数再进行取模,这在C++中是不安全的,因为指针和整数之间的转换需要谨慎处理,且依赖于具体平台和编译器。此外,还需要考虑上下文环境。例如,在特定的数据结构或算法中,可能通过对象的地址进行哈希或其他计算,这时`this`指针的地址值取模B可能用于确定索引位置。但这种情况通常需要将指针转换为适当的整数类型,如`uintptr_t`,再进行运算: ```cppN= reinterpret_cast<uintptr_t>(this) %B;``` 不过,这种用法较少见,且涉及底层操作,容易引发移植性问题。总结来说,用户的问题需要明确表达式中的操作对象和上下文。如果是对象重载了运算符,则表达式合法;如果是直接对指针进行取模,则需要类型转换,但需注意安全性和可移植性。 在生成相关问题时,需要考虑用户可能想了解的运算符重载、指针操作、取模运算的应用场景,以及可能的错误使用情况。这些问题可以帮助用户更全面地理解该表达式的含义和使用方式。</think>在C++中,表达式`N = *this % B`的含义需要分步解析: 1. **`this`指针** `this`是类成员函数中的隐式参数,类型为`T*`(指向当前类对象的指针)。例如在类`MyClass`中,`this`的类型是`MyClass*`。 2. **解引用操作`*this`** `*this`表示获取`this`指针指向的实际对象,类型为`T`。例如`*this`可以访问当前对象的成员变量或方法。 3. **取模运算`% B`** 取模运算符`%`要求左操作数为整数类型。如果当前类重载了`%`运算符,则`*this % B`会调用该重载函数;否则需检查是否有隐式类型转换(如对象定义了`operator int()`)。 4. **完整表达式** 表达式`N = *this % B`表示:将解引用后的当前对象`B`进行取模运算,结果赋值给变量`N`。例如: ```cpp class Number { int value; public: Number(int v) : value(v) {} operator int() const { return value; } // 隐式转换为int }; Number obj(7); int N = *obj % 3; // 等价于7 % 3 → N=1 ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值