有关在C ++中将默认构造函数分配给* this的问题?

时间:2011-04-26 09:48:02

标签: c++ constructor

我正在阅读一些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();也会调用默认构造函数? 感谢

4 个答案:

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