• 辨析指针、引用所指向对象的存储位置、生命周期、以及是否拥有对象所有权。
• 尽可能避免以原始指针(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;
}