gpt4 book ai didi

c++ - 具有默认值的单参数构造函数是否与默认构造函数相同?

转载 作者:太空宇宙 更新时间:2023-11-04 15:29:11 25 4
gpt4 key购买 nike

特别是在自动调用基类构造函数的上下文中:具有默认值的基类的单参数构造函数是否以与默认构造函数相同的方式处理(例如,如果没有另外指定则自动调用)(没有参数)?

struct base {
base(int value = 42) {}
};
struct derived : public base {
derived() {} // automatic call to base::base(int) ?
};

编辑:以下内容与问题无关,这正是我想到的。以下代码甚至没有出现我所看到的崩溃。请参阅下面的实际示例。

考虑一下:

#include <sstream>
// C++98, std::ostringstream(ios_base::openmode mode = ios_base::out) available
struct OhNo : public std::ostringstream {
OhNo() {
}
void Crash() const {
this->str();
}
};
// later: OhNo f; f.Crash();

std::ostringstream(C++11 之前)didn't have a no-argument constructor .只有一个参数和一个默认值。 上面的 OhNo 没有调用它的基类的构造函数。(是的)AFAIK 基类构造函数被自动调用 如果有可用的无参数构造函数。

GCC 5.4.0 对此编译良好,但后来出现段错误(由于未初始化的基类 另一个问题)。Clang 7.0.0 也可以很好地编译它并且也可以毫无问题地运行代码。

谁是对的?这里需要手动调用基类构造函数吗? 回答:不!

受影响代码:UnitTest++ MemoryOutStream class

相关问题:https://github.com/unittest-cpp/unittest-cpp/issues/174


好吧,我不知道发生了什么。下面的反汇编显示调用了基本构造函数。所以答案很可能是"is"。对于任何感兴趣的人,这里是重现这种非常奇怪的行为的方法:

#include "UnitTest++.h"

volatile double A() { return 2; }

TEST(Crash) {
CHECK_CLOSE(1,A(),0.1);
}

int main()
{
int exit_code = 0;
exit_code = UnitTest::RunAllTests();
return exit_code;
}

使用 g++ 针对 libunittest++.a 及其 header 进行编译(例如来自 https://packages.ubuntu.com/xenial/amd64/libunittest++-dev/download )。

正常运行:

test.cc:5: error: Failure in Crash: Unhandled exception: Crash!
FAILURE: 1 out of 1 tests failed (1 failures).
Test time: 0.00 seconds.

在gdb中运行:

(gdb) catch throw
Catchpoint 1 (throw)
(gdb) run
Starting program: /home/musteresel/huh/libunittest++-dev_1.4.0-3_amd64/data/usr/lib/a.out

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f205a0 in std::string::assign(std::string const&) () from /nix/store/hlnxw4k6931bachvg5sv0cyaissimswb-gcc-7.4.0-lib/lib/libstdc++.so.6
(gdb) bt
#0 0x00007ffff7f205a0 in std::string::assign(std::string const&) () from /nix/store/hlnxw4k6931bachvg5sv0cyaissimswb-gcc-7.4.0-lib/lib/libstdc++.so.6
#1 0x0000000000403a7a in UnitTest::MemoryOutStream::GetText() const ()
#2 0x0000000000402871 in UnitTest::CheckClose<int, double, double> (results=..., expected=@0x7fffffffbabc: 1, actual=@0x7fffffffbac0: 2,
tolerance=@0x7fffffffbac8: 0.10000000000000001, details=...) at ../include/unittest++/Checks.h:53
#3 0x0000000000402483 in TestCrash::RunImpl (this=0x408060 <testCrashInstance>) at test.cc:6
#4 0x0000000000402bc2 in void UnitTest::ExecuteTest<UnitTest::Test>(UnitTest::Test&, UnitTest::TestDetails const&) ()
#5 0x0000000000403255 in UnitTest::TestRunner::RunTest(UnitTest::TestResults*, UnitTest::Test*, int) const ()
#6 0x0000000000403683 in UnitTest::RunAllTests() ()
#7 0x0000000000402514 in main () at test.cc:14
(gdb)

反汇编 - 清楚地显示正在调用构造函数:

# in UnitTest::CheckClose<int, double, double>
4027cb: e8 e2 fd ff ff callq 4025b2 <UnitTest::MemoryOutStream::MemoryOutStream()>

# in UnitTest::MemoryOutStream::MemoryOutStream()
4025eb: e8 60 fa ff ff callq 402050 <std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream(std::_Ios_Openmode)@plt>

最佳答案

来自 ISO/IEC 14882:1998(E) [class.ctor]/5

A default constructor for a class X is a constructor of class X that can be called without an argument.

默认构造函数可以有参数,只要它们都有默认参数,因此可以在没有参数的情况下调用构造函数。

如果您没有在构造函数的初始化列表中为基类显式指定 mem-initializer,则基类将通过其默认构造函数进行初始化。

std::basic_ostringstream 在 C++98 中已经有一个默认构造函数(一个带有一个参数的构造函数,它有一个默认参数)。如果您仔细观察,您会发现您链接的 cppreference 页面证实了这一点……

关于c++ - 具有默认值的单参数构造函数是否与默认构造函数相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59003865/

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