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)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |