C++ 从默认构造函数调用重载构造函数时维护对象状态信息

C++ 从默认构造函数调用重载构造函数时维护对象状态信息,c++,cohesion,constructor-overloading,C++,Cohesion,Constructor Overloading,那个问题的标题太过分了。 基本上,我正在创建一个哈希表结构,它在向量中使用双链接列表。当我使用重载构造函数创建对象时,一切都正常,但是使用默认构造函数会导致对象在返回到main后状态变差 我的构造器: HashTable::HashTable() { HashTable(53); } HashTable::HashTable(int tableSize) { currentSize = tableSize;

那个问题的标题太过分了。 基本上,我正在创建一个哈希表结构,它在向量中使用双链接列表。当我使用重载构造函数创建对象时,一切都正常,但是使用默认构造函数会导致对象在返回到main后状态变差

我的构造器:

    HashTable::HashTable()
    {
            HashTable(53);
    }

    HashTable::HashTable(int tableSize)
    {
            currentSize = tableSize;
            table.resize(tableSize);
    }
创建对象后设置断点

    HashTable ht(size); //this works
    HashTable ht;       //this does not work
在代码中,我看到它很好地调用了重载构造函数,但是在返回main并尝试使用表(仅使用默认构造函数时)之后,向量的大小和变量currentSize出现了错误

创建对象后,在返回到main之前:

currentSize = 53
table [size] = 53, [capacity] = 53, empty linked lists fill the vector
在main中调用
ht.hash(value)
时,对象现在具有:

currentSize = -858993460
table [size] = 0, [capacity] = 0, linked lists obviously gone.

是什么原因导致向量自身重置为0,而我的私有int currentSize变为funky,特别是因为代码路径都通过HashTable(int tableSize)工作?

@dyp为我指明了正确的方向

哈希表(53)正在创建一个临时本地对象-未将main中的对象设置为我所需的大小53


要在main中对我的对象调用重载构造函数,而不是创建临时对象,
this->HashTable::HashTable(53)工作(在VisualStudio中)强制对调用对象调用重载构造函数

编辑:gcc编译器禁止这样做,不管编译器是否允许,这通常被认为是不好的做法


初始值设定项列表为
HashTable::HashTable():HashTable(53){}
被认为是完成我试图做的事情的正确方法。

HashTable(53)这不会委托给另一个构造函数。IIRC它创建一个临时的。在C++11中,您可以通过
HashTable::HashTable():HashTable(53){}
(搜索委托构造函数和/或成员初始值设定项列表)委托给另一个构造函数。@dyp-谢谢<代码>此->哈希表::哈希表(53)或初始值设定项列表非常有效。
this->HashTable::HashTable(53)
o.o构造函数不是可以直接调用的普通函数。@dyp,我只是从默认构造函数调用重载构造函数。您可能不需要默认构造函数,只需给
tableSize
一个默认值-
HashTable::HashTable(int tableSize=53)
。除非有其他具体的原因,你这样做了……”而且有点干净。“不仅仅是一点。”。我很想知道你是如何编译你的编译器的,因为C++禁止你直接调用构造函数。版本
HashTable::HashTable():HashTable(53){}
是有效的C++11,该特性称为deleging constructor.Hmm。我读到C++禁止用户调用构造函数:<代码> Fo.f;f、 Foo()-也许我需要在声明方法时回顾一下标准,因为我没有看到任何明确的说明,不能在类声明中让构造函数调用重载构造函数。VS对我的构造函数声明没有问题,所以我确信它的组装方式与您的gcc示例不同。再说一次,我不是在叫
foof;f、 Foo()
,我只需要在
Foo f;及富富(国际),