gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:48:59 25 4
gpt4 key购买 nike

我的第一个构造函数编辑一个成员 std::map 然后调用另一个构造函数。在第一个构造函数的末尾, 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;
}

最佳答案

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

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


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

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

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

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

关于C++ 类构造函数清除映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com