<九>指针和引用

• 辨析指针、引用所指向对象的存储位置、生命周期、以及是否拥有对象所有权。

• 尽可能避免以原始指针(T*)或引用(T&)来传递所有权(使用智能指针传递所有权)。默认情况下,指针不传递所有权。

以裸指针的形式传递的对象,假定由调用方所有,其生命周期也由调用方负责

不涉及生命周期的函数应当接受裸指针或引用

当不会改变被指代的对象时,引用通常比指针更好


void process1(const Point& p)
{
    //引用传参比较常见的做法
    //p.x++;

}
void process2( Point p)
{
    //值传参数,会涉及对象的拷贝特别当对象很大的时候,不会影响原始对象内容,也比较常见使用方式
}
void process3( Point* p)
{
   //指针传参,经常会遇见,不是非常的建议, 
   //在这个函数里面不应该处理指针的资源释放 即 delete p; 裸指针的生命周期由调用方控制
        
}

///返回值 形式/
Point process4()
{
    //返回对象,这种形式最常见,往往会结合编译器返回值优化特性提高效率
    Point p{10,20};
    return p;
}

Point& process5()
{
    //返回引用,该例子错误,栈对象p释放了,返回应用 变成了悬浮引用
    Point p{10,20};
    return p;//错误
}

//返回引用,有一种使用方式是可以的,就是参数传过来的就是引用,再返回,这种是可以的,但是不多见
Point& process5_1(Point&  p)
{
    return p;
}


//这种方式就比较常见了,但是不是特别的推荐了,结合智能指针,我们往往推荐返回智能指针
Point* process6( )
{
    Point *p=new Point{10,20};
    return p; 
}


int main()
{
    func();

    Point* p=new Point{10,20};
    process3(p);
    delete p;

    //比较推荐
    Point p2;
    process1(p2);


    Point* p3=process6();
    //...
    delete p3;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值