为什么需要C ++中的显式?

时间:2009-12-31 23:15:57

标签: c++

在C ++中,你必须明确许多事情,比如使用delete。这为程序员提供了更多选择,但对我来说并不总是有意义。例如:初始化构造函数中的字符数组。为什么这样的简单任务不能以这种方式处理:

class x{
enum {Lim =20};
char a[Lim];

x(const char* s){
strncpy(a, s, Lim - 1);
a[Lim - 1] = '\0';
}
}

在C#中,你所要做的就是:

class loai { 
public char[] a;
public loai(char[] a) {
    this.a = a;
}
}
P.S:昨天很抱歉。我累了,不能很好地表达我的想法。感谢

4 个答案:

答案 0 :(得分:5)

您可以初始化一个字符数组....

char a[] = "hello";

答案 1 :(得分:2)

总的来说, 可以使简单的任务变得不那么繁琐。例如,使用诸如auto_ptr,boost :: shared_ptr或scoped_ptr之类的智能指针,您不必自己调用delete。使用诸如std :: fill之类的函数,为数组指定初始化程序,或使用不同的类型(下面的警告和示例,以及C ++ 0x中提供的更多功能)。

struct A {
  char s[20];
  A() : s() { assert(s[0] == '\0'); /*always true*/ }
  // you can only use the "default ctor", in this case char(), which is equal
  // to '\0'
};
// of course, if the item type of the array has a non-trivial ctor, it will
// always be called for each item even if you leave the array member out of
// the ctor init list
struct B {
  char s[20];
  B() { std::fill(s, s + boost::size(s), 'a'); s[boost::size(s)-1] = '\0'; }
  // and if this is common, write your own function
  // even make it a private static function if it's only used within this class
  // (e.g. each ctor calls it, or several methods do)
private:
  template <int N>
  static void fill_null_term(char (&a)[N], char value) {
    // fill and null terminate
    fill(a, a + N - 1, value);
    a[N-1] = '\0';
  }
  // notice two things:
  // 1) certainly possible to pull this out of the class as required
  // 2) don't hardcode constants, use the type system to your advantage
  //    (passing the array length) when possible
};
struct C {
  std::string s;
  C() : s(19, 'a') {}
  // mentioned last, but this would really be the first solution you use;
  // refactoring to something else, such as A and B, as requirements change
  // or are more clearly defined
};

答案 2 :(得分:0)

由于您已将问题标记为C ++,请考虑以下事项:

class x
{
public:
    explicit x(const std::string &str)
        : str_(str)
    {}

    explicit x(const char *str)
        : str_(str ? str : "")
    {}

    ~x() {}

private:
    std::string str_;
};

不要看到C ++会如何让我以任何方式过于明确。是的,std::string并不是一个字符数组,但是,问问自己,真的需要它吗?在99%的可能用例中,我不希望std::string执行比char数组差得多。所以,不要让你的生活变得复杂,使用C ++为你提供的好东西,而不是C兼容性的东西,除非你绝对需要知道你在做什么。

编辑:啊,我知道,explicit关键字为C ++添加了“显性”:)在第一轮打字时忘记它。

答案 3 :(得分:0)

这是一个更简单的C ++版本,看起来几乎与您的C#示例完全相同:

class loai { 
public:
  std::vector<char> a;
  loai(const std::vector<char>& a) : a(a) {}
};

当然,无论使用何种语言,您都可以使用错误的数据类型使一切变得非常复杂。在C ++中,普通数组是非常简单的类型,因此在很多情况下,像std::vector这样的东西使用起来会更方便。