我的第一个构造函数编辑成员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;
}
答案 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
}