我有一个class String
,它提供了characters
的动态数组,初始化后无法更改。所以我需要初始化它,然后阻止对参数的进一步更改。
我该怎么做? :)
答案 0 :(得分:4)
您成为会员const
。然后在构造函数中进行初始化。
class String
{
const char* const _buff; //both the contents and the pointer are const
public:
String (const char* buff);
};
String::String(const char* buff) : _buff(buff)
{
}
编辑:正如@ildjarn指出的那样,在使用不可变对象时要格外小心。你必须确定这是你真正需要的。您将无法在标准容器中使用它们,也无法进行逻辑复制。
答案 1 :(得分:1)
将innerstring
数组设置为私有const,并仅公开get
方法。
答案 2 :(得分:0)
希望这会有所帮助:
#include <iostream>
#include <cstring>
#include <vector>
class String {
public:
// Default constructor and
// conversion constructor
String(const char *p = "") {
data_ = new char[strlen(p)+1];
strcpy(data_, p);
}
// copy constructor
String(const String& rhs) {
data_ = new char[strlen(rhs.data_)+1];
strcpy(data_, rhs.data_);
}
~String() {
delete[] data_;
}
String& operator=(const String&rhs) {
String temp(rhs);
std::swap(temp.data_, data_);
return *this;
}
// operator[] is the only data access, and it returns "const&"
const char&operator[](std::size_t i) { return data_[i]; }
private:
char *data_;
};
int main () {
String a("Hello");
String b("Goodbye");
std::vector<String> v;
v.push_back("a");
v.push_back("b");
v.push_back(&b[4]);
b = a;
std::cout << &b[0] << "\n";
std::cout << &v[2][0] << "\n";
}