尽可能简单地解释一下?
答案 0 :(得分:0)
让T成为本教程中的一个类 C ++中的指针可分为3种类型:
1)原始指针:
T a;
T * _ptr = &a;
它们将内存地址保存到内存中的某个位置。请谨慎使用,因为程序变得复杂,难以跟踪。
带有const数据或地址的指针{Read backwardwards}
T a ;
const T * ptr1 = &a ;
T const * ptr1 = &a ;
指向数据类型T的指针,它是一个const。这意味着您无法使用指针更改数据类型。即*ptr1 = 19
;不管用。但你可以移动指针。即ptr1++ , ptr1--
;等会工作。
向后读:指向类型T的指针,即const
T * const ptr2 ;
指向数据类型T的const指针。意味着您无法移动指针,但您可以更改指针指向的值。即*ptr2 = 19
将起作用,但ptr2++ ; ptr2--
等不起作用。向后读:指向类型T的const指针
const T * const ptr3 ;
指向const数据类型T的const指针。这意味着您既不能移动指针也不能将数据类型指针更改为指针。即。 ptr3-- ; ptr3++ ; *ptr3 = 19;
将无效
3)智能指针:{#include <memory>
}
共享指针:
T a ;
//shared_ptr<T> shptr(new T) ; not recommended but works
shared_ptr<T> shptr = make_shared<T>(); // faster + exception safe
std::cout << shptr.use_count() ; // 1 // gives the number of "
things " pointing to it.
T * temp = shptr.get(); // gives a pointer to object
// shared_pointer used like a regular pointer to call member functions
shptr->memFn();
(*shptr).memFn();
//
shptr.reset() ; // frees the object pointed to be the ptr
shptr = nullptr ; // frees the object
shptr = make_shared<T>() ; // frees the original object and points to new object
使用引用计数实现跟踪多少&#34;事情&#34;指向指针指向的对象。当此计数变为0时,将自动删除对象,即当指向对象的所有share_ptr超出范围时,将删除对象。 这消除了必须删除使用new分配的对象的麻烦。
弱指针: 帮助处理使用共享指针时出现的循环引用 如果有两个共享指针指向两个对象,并且有一个指向彼此共享指针的内部共享指针,则会有一个循环引用,当共享指针超出范围时,不会删除该对象。要解决此问题,请将内部成员从shared_ptr更改为weak_ptr。注意:要访问弱指针所指向的元素,请使用lock(),这将返回weak_ptr。
T a ;
shared_ptr<T> shr = make_shared<T>() ;
weak_ptr<T> wk = shr ; // initialize a weak_ptr from a shared_ptr
wk.lock()->memFn() ; // use lock to get a shared_ptr
// ^^^ Can lead to exception if the shared ptr has gone out of scope
if(!wk.expired()) wk.lock()->memFn() ;
// Check if shared ptr has gone out of scope before access
请参阅:When is std::weak_ptr useful?
唯一指针: 轻量级智能指针,拥有独家所有权。当指针指向唯一对象而不共享指针之间的对象时使用。
unique_ptr<T> uptr(new T);
uptr->memFn();
//T * ptr = uptr.release(); // uptr becomes null and object is pointed to by ptr
uptr.reset() ; // deletes the object pointed to by uptr
要更改唯一ptr指向的对象,请使用move semantics
unique_ptr<T> uptr1(new T);
unique_ptr<T> uptr2(new T);
uptr2 = std::move(uptr1);
// object pointed by uptr2 is deleted and
// object pointed by uptr1 is pointed to by uptr2
// uptr1 becomes null
参考文献: 它们本质上可以作为const指针,即一个const指针,不能用更好的语法移动。
请参阅:What are the differences between a pointer variable and a reference variable in C++?
r-value reference : reference to a temporary object
l-value reference : reference to an object whose address can be obtained
const reference : reference to a data type which is const and cannot be modified
参考: https://www.youtube.com/channel/UCEOGtxYTB6vo6MQ-WQ9W_nQ