权限与构造函数
构造函数与析构函数与成员中的方法一样是具有权限的,而且调用者就是使用者的那段代码域
如果把构造函数设置成私有的话,那只有友元或友类才能创建。
同理,析构函数不一定要求是public的,如果析构函数是private,那除了友元和友元类之外,只能使用堆的方式建立对象
class a{
private:
~a(){
...
}
};
main{
a Temp; //invalid,无法使用析构函数
a* temp=new a;//ok,可以再友元类中使用构造函数。
}
智能指针
class A{...};
auto_ptr 已被摒弃
//原理就是把new分配的堆内存放到智能指针对象中,当智能指针随着栈解析的时候,堆内存就被delete了。
auto_ptr<A> ptr(new A);
//但是缺点很明显,相同的auto_ptr对象进行拷贝构造的时候会导致同一块堆内存被析构两次等问题。
//因此,auto_ptr在指针对象之间赋值的时候会完全将控制权转移
auto_ptr<A>ptr2=ptr;
ptr->fn(); //error 没有该对象了
ptr2->fn(); //ok
unique_ptr
1.//不允许第二个指针对象指向同一个对象,除非右值是一个临时对象
unique_ptr<A> ptr(new A);
unique_ptr<A> ptr2=ptr; //error
----------------------------------------------------
unique_ptr<A> fn(){
return unique_prt<A> (new A) ;
}
unique_ptr temp=fn();//ok
2.unique_ptr支持[]数组类型,而shared_pre和auto_ptr不支持
unique_ptr<A[]> ptr(new A[]);
但切忌不能这样使用
unique_ptr<A[]> ptr(new A);
shared_ptr
//对指向同一个对象的指针会有数量的统计,只有次数变成0的时候才会释放堆内存。可能是使用了地址-引用指针数量的rbtree完成的。
继承类的内存模型
函数符
可以类似于函数的使用方式的符号,如函数名, 函数指针,重载了()运算符的类对象等。