【发布时间】:2018-03-23 14:07:43
【问题描述】:
我对 C++ 还是很陌生,在探索智能指针时,有一个我无法完全理解的行为。
考虑以下简单类:
class Student {
public:
int studentID;
string gender;
string name;
Student(int studentID, string gender, string name)
{
this->studentID = studentID;
this->gender = std::move(gender);
this->name = std::move(name);
}
unique_ptr<string> getNameUnique()
{
return make_unique<string>(this->name);
}
string* getNamePtr()
{
return &name;
}
};
在主代码中,如果我得到指向实例的name的智能指针并尝试修改它,它不会起作用:
auto nameUniquePtr = mary.getNameUnique();
cout << "Before: " << mary.name << "\n";
cout << "Before (through pointer): " << *nameUniquePtr << "\n";
*nameUniquePtr = "Tracy";
cout << "After: " << mary.name << "\n";
cout << "After (through pointer): " << *nameUniquePtr << "\n\n";
产生:
Before: Mary
Before (through pointer): Mary
After: Mary
After (through pointer): Tracy
显然,mary 的 name 成员没有改变。在逐步调试工具时,我发现智能指针指向的地址和成员的实际地址甚至都不一样。但是,如果我直接获取指向同一个成员的指针并尝试更改它的值,它会起作用:
auto namePtr = mary.getNamePtr();
cout << "Before: " << mary.name << "\n";
cout << "Before (through pointer): " << *namePtr << "\n";
*namePtr = "Tracy";
cout << "After: " << mary.name << "\n";
cout << "After (through pointer): " << *namePtr << "\n\n";
产生:
Before: Mary
Before (through pointer): Mary
After: Tracy
After (through pointer): Tracy
即使我直接设置了一个指向成员的智能指针变量并通过它改变值,还是不行:
auto directPtr = make_unique<string>(mary.name);
cout << "Before: " << mary.name << "\n";
*directPtr = "Jessica";
cout << "After: " << mary.name << "\n\n";
产生:
Before: Tracy
After: Tracy
在使用智能指针指向类成员时是否有一些规范或限制?谢谢。
【问题讨论】:
标签: c++ pointers smart-pointers unique-ptr dereference