我无法正确获取构造函数的参数。它一遍又一遍地弹出同样的错误。该类的参数无法更改,我只能更改构造函数。
错误C2789' Aluno :: numero':必须初始化const限定类型的对象
错误C2530' Aluno :: escola':引用必须初始化
class Aluno {
string nome;
string& escola;
const int numero;
public:
Aluno(string nome, string escola, int numero){
this->nome = nome;
this->escola = escola;
this->numero = numero;
}
};
int main()
{
Aluno * a = new Aluno("aaa", "bbb", 123);
return 0;
}
答案 0 :(得分:3)
const
或引用的类成员必须在构造函数的成员初始化列表中初始化,例如:
class Aluno
{
string nome;
string& escola;
const int numero;
public:
Aluno(string nome, string &escola, int numero)
: nome(nome), escola(escola), numero(numero)
{
}
};
int main()
{
string b = "bbb";
Aluno * a = new Aluno("aaa", b, 123);
delete a;
return 0;
}
但请注意,我必须更改escola
输入参数。您传递的参数按值,但正在尝试存储对它的引用。 escola
类成员将绑定到构造函数本地的string
对象,并在构造函数退出时超出范围,使引用悬空。你不想要那个。
因此,escola
输入参数也必须更改为引用,如上所示,否则escola
类成员不能再被声明为引用,例如:
class Aluno
{
string nome;
string escola;
const int numero;
public:
Aluno(string nome, string escola, int numero)
: nome(nome), escola(escola), numero(numero)
{
}
};
int main()
{
Aluno * a = new Aluno("aaa", "bbb", 123);
delete a;
return 0;
}
答案 1 :(得分:1)
对于const
成员,您需要使用初始化列表:
Aluno(string nome, string escola, int numero)
: numero(numero) {
// ...
}
您还需要以相同的方式初始化引用,但这需要将引用作为参数传递:
Aluno(string nome, string& escola, int numero)
: escola(escola), numero(numero) {
// ...
}
即使编译器不需要它,以相同的方式初始化nome
也会更有效。
Aluno(string nome, string& escola, int numero)
: nome(nome), escola(escola), numero(numero) {
}
答案 2 :(得分:1)
要初始化成员,您需要使用类内初始化或构造函数初始化列表。 不构造函数体。
在构造函数体中,您可以为成员重新赋值,但此时它们已经默认初始化(除非您在类中显式初始化它们或使用初始化列表)并且并非所有类型都可以默认初始化(如参考文献)。
答案 3 :(得分:-1)
escola
是一个引用,因此需要在字段初始化列表中初始化它,因为它正在被分配。对于const numero
:
Aluno(string nome, string escola, int numero) :
nome(nome), escola(escola), numero(numero) { }
但是,这会导致UB,因为您的成员escola
引用的参数escola
将超出范围。因此,参数也必须是参考:
Aluno(string nome, string &escola, int numero) :
nome(nome), escola(escola), numero(numero) { }