2

我有一个类,我正在使用参数化构造函数创建它的一个对象。在此期间,已调用参数化构造函数和默认构造函数。

这是我的片段:

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 年龄:30

所以,我想明白,如果我在调用参数化构造函数,为什么在参数化构造函数之后调用了默认构造函数?

4

2 回答 2

6

因为如果指定的键不存在,std::map::operator[]将首先插入一个默认构造的。然后从临时的like中分配student插入的内容。studentstudentstudent("bob", 25)

返回对映射到与 key 等效的键的值的引用,如果这样的键不存在,则执行插入。

你可以insert改用。

students.insert({0, student("bob", 25)});
students.insert({1, student("raven", 30)});
于 2020-06-20T10:00:08.973 回答
4

students[0]正在使用它的默认构造函数自动构造对象。students[0] =使用复制赋值运算符,并student("bob", 25)调用parameterized constructor.

您可以使用:

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

或者:

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

避免使用默认构造函数。

从标准

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;

返回: 对对应于 x in* *this 的 mapped_type 的引用。

抛出:如果不存在此类元素,则为 out_of_range 类型的异常对象。

复杂性:对数。

于 2020-06-20T10:02:45.597 回答