如何在意外构造时出现编译错误?

San*_*ich 7 c++ constructor explicit

给出2个班级:

...
class Grades{
public:
     Grades(int numExams) : _numExams(numExams){
        _grdArr = new double[numExams];
     }
     double GetAverage() const;
     ...
private: // The only data members of the class
     int _numExams;
     double *_grdArr;
};

class Student{
public:
     Student(Grades g) : _g(g){
     }
...
private: // The only data members of the class
     Grades _g;
};
...
Run Code Online (Sandbox Code Playgroud)

而且,一个简短的主程序:

int main(){
     int n = 5; // number of students
     Grades g(3); // Initial grade for all students
     // ... Initialization of g – assume that it's correct
     Student **s = new Student*[n]; // Assume allocation succeeded
     for (int it = 0 ; it < n ; ++it){
          Grades tempG = g;
          // ... Some modification of tempG – assume that it's correct
          s[it] = new Student(tempG);
     }
// ...
return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.但通过拼写错误的线:

Grades tempG = g;
Run Code Online (Sandbox Code Playgroud)

已改为:

Grades tempG = n;
Run Code Online (Sandbox Code Playgroud)

并且它仍然通过编译.我可以在代码(main()代码)中做什么简单的更改来获取错误的编译错误?

Chu*_*dad 22

这是因为Grades有一个参数构造函数,它充当转换构造函数.这样的构造函数接受一个int参数并创建一个Grades类型的对象.

因此编译成功.

使'成绩'的指导者明确

explicit Grades(int numExams);
Run Code Online (Sandbox Code Playgroud)

这将是不允许的

Grades g = 2;
Run Code Online (Sandbox Code Playgroud)

但允许以下所有内容

Grades g = Grades(2)  // direct initialization

Grades g = (Grades)2; // cast

Grades g = static_cast<Grades>(2);

Grades g(2);          // direct initialization.
Run Code Online (Sandbox Code Playgroud)

  • 真的很遗憾"显式"不是默认值 - 您可能希望养成将其应用于每个参数ctor的习惯,并且只在有自动转换的意义上删除它们. (4认同)