例子
static size_t sn;
class Employee{
private:
//std::string name;
std::shared_ptr<std::string>name;
size_t ID = ++sn; //每次生成唯一ID
public:
Employee() = default; //默认构造函数
Employee(const std::string &s) :name(std::make_shared<std::string>(s)){}
//Employee(const std::string &s) :name(new std::string(s)){}
size_t GetID()const{ return ID; }
std::string GetName()const{ return *name; }
};
void print(const Employee s)
{
std::cout << s.GetID() << "\t" << s.GetName() << std::endl;
}
Employee a;//此处调用a的默认构造函数,name智能指针会初始化为空
Employee b("zhangyi"), c = b;
//print(a); //name指针为空,不能进行访问,程序运行出错
print(b);
print(c);
防止指针指空,运行时注意if检查;
智能指针可以用在合成拷贝函数,合成拷贝赋值运算符下,使一个类的对象初始化另外一个类(含有智能指针数据成员的类)
对于含有普通指针的类,而且构造时给它动态分配了内存空间,必须要自己定义析构函数(显示delete),然而一旦一个类定义了析构函数,那么它几乎肯定也需要一个拷贝构造函数和一个拷贝赋值运算符(C++ primer P447),定义行为像值得类,和定义行为像指针的类;