在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:昨天很抱歉。我累了,不能很好地表达我的想法。感谢
答案 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
这样的东西使用起来会更方便。