C++注意防止指针指向空

例子

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),定义行为像值得类,和定义行为像指针的类;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值