构造函数参数C ++ const和&

时间:2018-02-21 17:08:14

标签: c++ class constructor

我无法正确获取构造函数的参数。它一遍又一遍地弹出同样的错误。该类的参数无法更改,我只能更改构造函数。

错误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;
}

4 个答案:

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