【发布时间】:2012-03-02 12:54:14
【问题描述】:
我有一个class String,它表示一个动态数组characters,初始化后无法更改。所以我需要对其进行初始化,然后防止对参数的进一步更改。
我该怎么做? :)
【问题讨论】:
-
智者称这些类“不可变”
-
这种不可改变的类叫做“不可变”
标签: c++ oop class object initialization
我有一个class String,它表示一个动态数组characters,初始化后无法更改。所以我需要对其进行初始化,然后防止对参数的进一步更改。
我该怎么做? :)
【问题讨论】:
标签: c++ oop class object initialization
你让你的会员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 所指出的,在使用不可变对象时要格外小心。你必须确定那是你真正需要的。您将无法在标准容器中使用它们,也无法进行逻辑复制。
【讨论】:
将innerstring 数组设置为私有常量,并且只公开get 方法。
【讨论】:
希望这会有所帮助:
#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";
}
【讨论】: