c++中->和.的区别

本文详细解释了指针类型在类实例操作中的应用,通过C++代码实例展示了如何正确使用指针来访问和修改类成员变量。

->用在指针类型的类实例的,而.用在实例化对象的指向。

下面是例子

#include <iostream>
using namespace std;
class Complex
{
private:
	double real;
	double image;
public:
	Complex()
	{
		this->image=0;
		this->real=0;
	}
	Complex(double real,double image)
	{
		this->real=real;
		this->image=image;
	}
	friend Complex operator+(Complex com1,Complex com2);
	void show();
};
Complex operator+(Complex com1,Complex com2)
{
	return Complex(com1.real+com2.real,com1.image+com2.image);
	//下面是错误的
	//return Complex(com1->real+com2->real,com1->image+com2->image);
}
void Complex::show()
{
	cout<<"实数部分为"<<this->real<<endl;
	cout<<"虚数部分为"<<this->image<<endl;
	//下面是错误的
	//cout<<"实数部分为"<<this.real<<endl;
	//cout<<"虚数部分为"<<this.image<<endl;
}
int main()
{
	Complex com1(2,5),com2(3,9),sum;
	sum=com1+com2;
	sum.show();
	system("pause");
	return 1;
}


<think>我们正在讨论Unreal Engine C++->.运算符的使用区别。 在C++中,.运算符用于直接访问对象实例的成员(包括成员变量成员函数),而->运算符用于通过指针访问对象的成员。 在Unreal Engine中,由于大量使用指针(特别是UObject及其派生类),->运算符非常常见。 具体区别: 1. 点运算符(.):用于对象(或引用)本身。例如:如果有一个对象`MyObject obj;`,那么访问其成员函数使用`obj.MyFunction();` 2. 箭头运算符(->):用于对象的指针。例如:如果有一个指针`MyObject* ptr = &obj;`,那么访问其成员函数使用`ptr->MyFunction();`,它等价于`(*ptr).MyFunction();` 在Unreal Engine中,很多类都是UObject的派生类,而UObject通常通过指针来操作(因为UE使用自己的内存管理垃圾回收机制)。因此,我们经常使用->运算符。 另外,UE的智能指针(如TSharedPtr, TWeakPtr)对象(如AActor)的指针也使用->运算符。 示例: 假设有一个AActor指针: AActor* MyActor = GetSomeActor(); 那么调用其函数: MyActor->SetActorLocation(FVector(0,0,0)); 而如果有一个AActor的引用(比如在函数参数中): void MyFunction(AActor& ActorRef) { ActorRef.SetActorLocation(FVector(0,0,0)); // 使用点运算符 } 注意:在UE的UObject系统中,不能直接实例化UObject(比如UObject obj;这样是不允许的),必须使用NewObject或CreateDefaultSubobject等方法来创建,然后通过指针操作。因此,对于UObject,我们几乎总是使用->。 另外,UE的反射系统也是基于指针的,所以很多函数参数也是指针。 总结: - 当变量是对象或引用时,使用点运算符(.)。 - 当变量是指针时,使用箭头运算符(->)。 在Unreal Engine中,由于大量使用指针,所以->运算符更常见。 生成相关问题: 1. 在Unreal Engine中,为什么UObject必须使用指针? 2. 如何安全地使用Unreal Engine中的指针(避免空指针野指针)? 3. Unreal Engine的智能指针(如TSharedPtr)如何使用? 4. 在Unreal Engine中,如何创建销毁UObject? 5. 点运算符箭头运算符在C++中还有哪些注意事项?</think>### Unreal Engine C++中`->`与`.`运算符的区别 在Unreal Engine C++开发中,`->`(箭头运算符)`.`(点运算符)的核心区别在于**操作对象的类型**: 1. **`.`运算符(点运算符)** - 用于**对象实例**(非指针)的直接成员访问 - 语法:`对象实例.成员` - 示例: ```cpp FVector Position = GetActorLocation(); // 返回对象实例 float X = Position.X; // 使用点运算符访问成员 ``` 2. **`->`运算符(箭头运算符)** - 用于**对象指针**的成员访问 - 语法:`对象指针->成员`(等价于`(*对象指针).成员`) - 示例: ```cpp AActor* ActorPtr = GetPlayerActor(); // 返回对象指针 float Health = ActorPtr->GetHealth(); // 使用箭头运算符访问成员 ``` --- ### UE中的特殊场景说明 1. **UObject系统的强制指针规则** 所有继承自`UObject`的类(如`AActor`)必须通过指针操作,禁止栈上实例化: ```cpp // 正确(指针+箭头运算符) AMyActor* Actor = NewObject<AMyActor>(); // 错误!UObject禁止栈实例化 AMyActor ActorStack; // 编译失败 ``` 2. **智能指针的访问** UE的智能指针(如`TSharedPtr`)需使用`->`: ```cpp TSharedPtr<FMyStruct> Ptr = MakeShared<FMyStruct>(); Ptr->MemberValue = 5; // 智能指针使用箭头运算符 ``` 3. **蓝图暴露函数的限制** 使用`UFUNCTION(BlueprintCallable)`的函数若返回指针,在蓝图中会自动解引用,但C++中仍需`->`: ```cpp // C++实现 UFUNCTION(BlueprintCallable) AWeapon* GetCurrentWeapon() { return CurrentWeapon; } // C++调用 int Ammo = GetCurrentWeapon()->GetAmmo(); // 必须用-> ``` --- ### 选择依据总结 | 场景 | 应使用运算符 | |----------------------|--------------| | 栈对象/值类型 | `.` | | `UObject`派生类指针 | `->` | | 智能指针(`TSharedPtr`等) | `->` | | 引用类型(`&`) | `.` | > ⚠️ 常见错误:对指针使用`.`会导致编译错误: > ```cpp > AActor* Actor = ...; > float X = Actor.Location.X; // 错误!指针必须用-> > ``` --- ### 性能与底层原理 两种运算符在编译后性能相同,`ptr->member`会被编译器转换为`(*ptr).member`。但UE的UObject系统通过指针实现垃圾回收机制,强制使用指针可确保对象生命周期被引擎管理[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值