Почему конструктор по умолчанию вызывается, даже когда я вызываю параметризованный конструктор? - PullRequest
2 голосов
/ 20 июня 2020

У меня есть класс, и я создаю его объект с помощью параметризованного конструктора. В это время были вызваны как параметризованный, так и конструктор по умолчанию.

Вот мой фрагмент:

class student {
    string name;
    int age;
public:
    student() {
        cout << "Calling the default constructor\n";
    }
    student(string name1, int age1) {
        cout << "Calling the parameterized const\n";
        name = name1;
        age = age1;
    }
    void print() {
        cout << " name : " << name << " age : " << age << endl;
    }
};

int main()
{
    map<int, student> students;
    students[0] = student("bob", 25);
    students[1] = student("raven", 30);

    for (map<int, student>::iterator it = students.begin(); it != students.end(); it++) {
        cout << "The key is : " << it->first ;
        it->second.print();
    }
    return 0;
}

Когда я выполняю этот фрагмент, мой вывод будет следующим:

Вызов параметризованной const Вызов конструктора по умолчанию Вызов параметризованной const Вызов конструктора по умолчанию Ключ: 0 имя: bob возраст: 25 Ключ: 1 имя: raven age: 30

Итак, я хочу понять, если я вызываю параметризованный конструктор, почему конструктор по умолчанию был вызван после параметризованного конструктора?

Ответы [ 2 ]

5 голосов
/ 20 июня 2020

Потому что std::map::operator[] сначала вставит созданный по умолчанию student, если указанный ключ не существует. Затем вставленный student назначается из временного student, например student("bob", 25).

Возвращает ссылку на значение, которое сопоставлено с ключом, эквивалентным ключу, выполняя вставку, если такой ключ не существует.

Вместо него можно использовать insert.

students.insert({0, student("bob", 25)});
students.insert({1, student("raven", 30)});
3 голосов
/ 20 июня 2020

students[0] автоматически создает объект, используя конструктор по умолчанию. students[0] = используйте оператор присваивания копии, а student("bob", 25) вызывает parameterized constructor.

Вы можете использовать:

studets.insert(pair<int, student>(0, student("bob", 25)));

или:

studets.emplace(0, student("bob", 25));

To избегайте конструктора по умолчанию.

Из стандартного :

T& operator[](const key_type& x);

Эффекты : эквивалент: return try_emplace (x). first-> second;

T& operator[](key_type&& x);

Эффекты : эквивалент: return try_emplace (move (x)). first-> second;

T&       at(const key_type& x);
const T& at(const key_type& x) const;

Возвращает : ссылку на mapped_type, соответствующий x в * * this.

Выбрасывает : объект исключения типа out_of_range, если такой элемент не присутствует.

Сложность : Логарифм c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...