C++ operator -> 的几种用法

The Arrow Operator in C++


#include <iostream>
#include <string>

class Entity
{
public:
    void Print() const { std::cout << "Hello" << std::endl;}
};

class ScopedPtr
{
private:
    Entity* m_Obj;
public:
    ScopedPtr(Entity* entity)
        :m_Obj(entity)
    {
    }    
    
    ~ScopedPtr()
    {
        delete m_Obj;
    }
    
    //重载之前
    Entity* GetObject() { return m_Obj; }

    //重载-> 可以不需要 GetObject()来获取 m_Obj,
    //并且可以直接调用 m_Obj 的方法和获取成员(public)
    Entity* operator->()
    {
        return m_Obj;
    }
};

struct Vector3
{
    float x, y, z;
}

int main()
{
    Entity e;
    e.Print();
    
    Entity* ptr = &e;

    //第一种用法

    (*ptr).Print();    //不太美观
    
    ptr->Print();    //用来代替上面的写法 , 也是最常用的用法


    //第二种用法
    
    ScopedPtr entity = new Entity();

    entity.GetObject()->Print();  //用起来不太美观,这时候我们可以重载->
    
    entity->Print();    //重载之后我们可以直接这么用了


    //第三种方法

    //可以获取struct 里变量的偏移地址(从0开始) ,Ex: x. offset = 0 ,y. offset =4 ,z. offset =8

    int offset = (int)  &((Vector3*)0)->x;
    std::cout << offset << std::endl;

     offset = (int) & ((Vector3*)0)->y;
    std::cout << offset << std::endl;

     offset = (int) & ((Vector3*)0)->z;
    std::cout << offset << std::endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值