1. 智能指针(unique_ptr、shared_ptr、weak_ptr)的区别?
unique_ptr
如名字所示,
unique_ptr
是个独占指针,C++ 11之前就已经存在,
unique_ptr
所指的内存为自己独有,某个时刻只能有一个
unique_ptr
指向一个给定的对象,不支持拷贝和赋值。
shared_ptr
shared_ptr允许多个该智能指针共享“拥有”同一堆分配对象的内存,这通过引用计数(reference counting)实现,会记录有多少个shared_ptr共同指向一个对象,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。支持复制和赋值操作。
weak_ptr
weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用计数的增加或减少。没有重载 *和 -> 但可以使用lock获得一个可用的shared_ptr对象
weak_ptr的使用更为复杂一点,它可以指向shared_ptr指针指向的对象内存,却并不拥有该内存,而使用weak_ptr成员lock,则可返回其指向内存的一个share_ptr对象,且在所指对象内存已经无效时,返回指针空值nullptr。
注意:weak_ptr并不拥有资源的所有权,所以不能直接使用资源。 可以从一个weak_ptr构造一个shared_ptr以取得共享资源的所有权。
2. const int *a和int *const a的区别
1)const int *a
这里const 修饰的是int,而int定义的是一个整值
因此*a 所指向的对象值不能通过 *a 来修改,但是可以重新给 a 来赋值,使其指向不同的对象。
eg:
const int *a = 0;
const int b = 1;
int c = 1;
a = &b // 额外:注意不能通过a来修改 b值
a = &c // 额外:虽然c本身不是一个常量
*a = 2 //error 为题就在这里,不能修改通过 *a 所指向的对象值,最后赋值得对象是c,因此不能通过*a 来修改c值。
2)int *const a
这里const修饰的是 a ,a代表的是一个指针地址
因此不能赋给a其他的地址值,但可以修改a指向的值。
至于int const *a 和 const int *a 的意义是相同的,作用等价。
补充:
3)const int * const a
这个代表a所指向的对象的值以及它的地址本身都不能被改变
4) const int *const a
a所指向的对象及对象的值均不可改变。
关于const的点滴补充:
1、const 对象的地址只能赋值给指向const 对象的指针
2、指向const 对象的指针可以 被赋 以 一个非const 对象的地址
3、指向const 得指针常被用作函数的形式参数,保证被传递给函数的实际对象在函数得实际对象在函数中不会被修改
4、常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误(上面都是在说明const得问题,所以没有赋值,实际语句中要赋值的)