Rei*_*ugh 8 c++ parameter-passing
我最近看到一个被声明为的函数:
void func(type* ¶m);
Run Code Online (Sandbox Code Playgroud)
我已经知道之间的区别type* param和type& param.以上与他们有何不同?什么时候使用这个?这样做是否明智?
Sho*_*hoe 15
以上将不仅可以修改指向对象,还可以修改指针本身.例如,请考虑以下代码:
void func(int*& ptr) {
*ptr = 1;
ptr = 0;
}
int main() {
int x = 0;
int* y = &x;
func(y);
}
Run Code Online (Sandbox Code Playgroud)
在执行结束时,x具有价值1和y是0(因为你可以看到).
请注意,对于我使用的例子的目的0为空指针,但如果你使用的是C++ 11你或许应该使用nullptr,而不是(这不具有重载operaror<<的std::ostream).
通过查看以下代码可以同化这个概念:
template<class Type> using ptr = Type*;
ptr<int>& x;
Run Code Online (Sandbox Code Playgroud)
要么
std::unique_ptr<int>& x;
Run Code Online (Sandbox Code Playgroud)
在这些示例中,x是对类型(ptr<int>然后std::unique_ptr<int>)的引用,它恰好是具有指针语义(operator*和operator->)的指针/类.
可以const在指针中的限定符的位置上进行可能有趣的偏离.考虑这两个实例:
void func(const int*& ptr)void func(int*const& ptr)它们的含义是:
按照上述类比,ptr它们将是:
ptr<const int>&ptr<int> const&因此第一个将无法*ptr = 1在函数体中执行(因为它int是常量),但将很乐意执行ptr = 0.
第二个将反过来行为,允许*ptr = 1(因为指向的int不是常量),而不允许ptr = 0(因为指针是常量).
当然,在以下情况下:
void func(const int*const& ptr)
Run Code Online (Sandbox Code Playgroud)
在ptr类比中ptr<const int> const&,两者都不会被允许.
什么时候使用这个?这样做是否明智?
像每个功能一样,当您需要它时,您会发现它的用处.但是,作为一般概念,有些人在释放动态分配的资源后使用它来重置指针(我不推荐这个,见下文).
我们来看这个例子:
free_my_int(int*& ptr) {
delete ptr;
ptr = nullptr;
}
int* x = new int(42);
free_my_int(x);
Run Code Online (Sandbox Code Playgroud)
在执行结束时,x将被正确释放并且指针自动设置为nullptr(空指针).这样做是为了防止由于丢失导致的丑陋的分段错误或"已释放的指针未分配"错误消息ptr = nullptr.
但是使用C++ 11和C++ 14时,很少使用指针,甚至更少使用指针.大多数的东西指针,其中用于不与其他标准构建体取代的(参见std::optional,std::unique_ptr,std::shared_ptr或std::reference_wrapper例如).