在动态内存上操作,重载constmemeber函数有意义吗

Operating on dynamic memory, is it meaningful to overload a const memeber function?

本文关键字:constmemeber 函数 有意义 重载 动态 内存 操作      更新时间:2023-10-16

C++Primer 5 Edition的一个练习让我陷入困境,就像一样

练习12.3:此类是否需要常量版本的push_backpop_back?如果是,请添加它们。如果没有,为什么不需要它们?(第458页)

下面是类。为了简化代码,省略了成员frontback的定义。

class StrBlob 
{
public:
typedef std::vector<std::string>::size_type size_type;
StrBlob();
StrBlob(std::initializer_list<std::string> il);
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
// add and remove elements
void push_back(const std::string &t) {data->push_back(t);}
void pop_back();
// element access
std::string& front();
std::string& back();
private:
std::shared_ptr<std::vector<std::string>> data;
// throws msg if data[i] isn't valid
void check(size_type i, const std::string &msg) const;
};
StrBlob::StrBlob(): data(make_shared<vector<string>>()) { }
StrBlob::StrBlob(initializer_list<string> il):
data(make_shared<vector<string>>(il)) { }
void StrBlob::check(size_type i, const string &msg) const
{
if (i >= data->size())
throw out_of_range(msg);
}
void StrBlob::pop_back()
{
check(0, "pop_back on empty StrBlob");
data->pop_back();
}

我试图重载常量成员void StrBlob::pop_back() const,如下所示。

void StrBlob::pop_back() const
{
check(0, "pop_back on empty wy_StrBlob");
data->pop_back();
}

编译器对该常量成员没有任何抱怨。想知道我做得对吗?有没有可能调用这个const成员?添加这个常量成员有意义吗?为什么?

如果您愿意,当然可以这样做,但似乎没有任何逻辑原因。编译器没有抱怨,因为这不会修改data(这是一个指针),而是修改data所指向的东西,这与const指针完全合法。