C ++类构造函数清除映射

时间:2016-09-26 10:31:21

标签: c++ constructor stdmap

我的第一个构造函数编辑成员std::map,然后调用另一个构造函数。在第一个构造函数的末尾,映射的大小为2,并且在第二个构造函数的开头,它是0.导致这个的原因是什么?

这是我的头文件:

// Test.h
#include <map>
#include <string>

class Test
{
public:
    Test(std::string name, int age);
private:
    Test();

    std::map<std::string, int> myMap_;
}

这是我的代码:

// Test.cpp
#include "test.h"

Test::Test()
{
    std::cout << myMap_.size() << std::endl; // Outputs 0
}

Test::Test(std::string name, int age)
{
    myMap_.insert(name, age);
    myMap_.insert("test", 6);

    std::cout << myMap_.size() << std::endl; // Outputs 2
    Test();
}

编辑: 这是我的主要功能:

#include "test.h"

int main()
{
    Test t("yo", 4);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

第二个构造函数插入2个元素。所以大小是2。

第一个构造函数不插入任何元素。所以大小为0。

我想你可能期望第二个构造函数中的Test();为同一个对象“调用另一个构造函数”。然而,这不会发生。构造函数与常规函数不同。

代码Test();实际上意味着创建一个Test类型的临时对象,该对象通过调用默认构造函数进行初始化。然后该对象立即被销毁,因为它是暂时的。

构造函数没有名称,就名称查找而言,不可能像常规函数一样调用它们。相反,当您提供创建对象的语法时,将调用它们。

如果你想拥有一些由多个构造函数共享的公共代码;您可以将该代码放在由多个构造函数调用的函数中,也可以使用delegating constructors功能。在后一种情况下,委托必须在构造函数体内的任何语句执行之前发生。

答案 1 :(得分:1)

您实际上并没有在同一个对象上调用构造函数,而是创建一个临时的新对象,然后没有名称。看到它与此相同:

Test::Test(std::string name, int age)
{
    myMap_.insert(name, age);
    myMap_.insert("test", 6);

    std::cout << myMap_.size() << std::endl; // Outputs 2
    Test other = Test(); //you create a new object here
}

在C ++ 11中,您可以执行类似于此操作的操作(这称为构造函数委派):

Test::Test(std::string name, int age)
:Test()
{
    myMap_.insert(name, age);
    myMap_.insert("test", 6);

    std::cout << myMap_.size() << std::endl;
}

这里的不同之处是Test()构造函数将在地图上的插入操作之前调用。

答案 2 :(得分:0)

您正在创建两个测试实例。

Test的第一个实例,使用名称和年龄构建,将元素插入其myMap_但第二个实例不插入。

当您在Test()构造函数中调用Test(name, age)时,它正在使用未插入地图的Test()构造函数创建第二个本地测试实例 。这个第二个实例几乎会立即被销毁(因为它没有分配给任何东西)。

我认为你试图在同一个对象上使用两个构造函数,但这仅适用于继承对象,其中每个派生需要调用自己的构造函数并调用它的基础。

您可以创建一个函数并调用它:

// Test.h
#include <map>
#include <string>

class Test
{
public:
    Test(std::string name, int age);
    void OutputSize();

private:
    Test();

    std::map<std::string, int> myMap_;
}

Test::Test(std::string name, int age)
{
    myMap_.insert(name, age);
    myMap_.insert("test", 6);

    OutputSize();
}

void Test::OutputName()
{
   std::cout << myMap_.size() << std::endl; // Outputs 2
}