如何初始化类然后冻结其参数值

时间:2012-02-10 00:52:25

标签: c++ oop class object initialization

我有一个class String,它提供了characters的动态数组,初始化后无法更改。所以我需要初始化它,然后阻止对参数的进一步更改。

我该怎么做? :)

3 个答案:

答案 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";
}