我正在阅读一些C ++文本。在一个例子中,写的文字是:
class Student {
int no;
char grade[M+1];
public:
Student();
Student(int, const char*);
const Student& set(int, const char*);
void display() const;
};
Student::Student() {
no = 0;
grade[0] = '\0';
}
Student::Student(int n, const char* g) {
*this = Student(); // initialize to empty
set(n, g); // validate, reset if ok
}
我不理解这一行:*this = Student();
为什么我们必须这样做,而只是调用Student();
也会调用默认构造函数?
感谢
答案 0 :(得分:7)
无法直接调用默认构造函数(C++ FAQ)。即
Student::Student(int n, const char* g){
Student();
set(n, g); // validate, reset if ok
}
不起作用。但是,我也不确定你的解决方案。
*this = Student()
将致电Student::operator=(const Student&)
。在这个特定的类中,它是可以的(该函数是默认的成员副本),但它可能不是一般的,因为在调用该方法时,Student对象只是“部分构造”。
最好拥有私有初始化函数
void Student::init() {
no = 0;
grade[0] = '\0';
}
并从两个构造函数中调用它。
答案 1 :(得分:3)
虽然,imho,最好使用常见的初始化函数,如下所示:
class Student {
(...)
private:
void initMe();
};
Student::Student() {
initMe();
}
Student::Student(int n, const char* g) {
initMe(); // initialize to empty
set(n, g); // validate, reset if ok
}
void Student::initMe() {
no = 0;
grade[0] = '\0';
}
这样可以避免不必要的对象创建。
答案 2 :(得分:1)
它构造一个临时的Student
对象,然后将其复制到*this
。我只是在第二个构造函数中初始化成员变量为空。这个想法是你不必编写相同的代码来将成员变量初始化为空两次,但这里的问题非常简单。
答案 3 :(得分:1)
*this = Student();
只是针对名为的默认构造函数初始化成员变量。应避免这种设计,因为它会创建临时内容并将其复制。
使用以下内容:
void reset() { // introduce this method inlined in the class
grade[no = 0] = '\0';
}
Student::Student() {
reset(); // call it when needed
}
Student::Student(int n, const char* g) {
reset(); // initialize to empty
set(n, g); // validate, reset if ok
}