在没有for或while的构造函数中无限循环

我在这里做了一个testing,但输出是一个没有结束的循环,我不知道为什么。

其实我正在做另一个testing,但是当我写这个时,我不明白这个循环是怎么发生的。 重复输出“ABC”。

#include <map> #include <string> #include <iostream> class test { public: std::map <int, int> _b; test(); test (std::map<int, int> & im); ~test(); }; test::test() { std::cout<<"abc"; _b.clear(); _b[1]=1; test(_b); } test::test(std::map <int, int>& im) { std::cout<<im[1]; } test::~test() {}; int main () { test a; } 

这里的问题是编译器解释

 test(_b); 

不是作为创buildtypestest的临时对象的参数_b传递的代码,而是作为名为_btypes为test的variables的variables声明,使用默认构造函数。 因此,看起来像使用第二个构造函数创build一个临时test对象的一段代码是recursion创build一个types为test的新对象,并再次调用该构造函数。

要解决这个问题,你可以给variables一个明确的名字,比如

 test t(_b); 

这只能被解释为一个名为t的typestestvariables,使用第二个构造函数进行初始化。

从来没有见过这个,我已经用C ++进行了多年编程。 感谢您向我展示另一个语言的angular落案例!

对于官方的解释:根据C ++ 03 ISO规范,§6.8:

在涉及expression式语句和声明的语法中存在一个不明确的地方:具有作为其最左边子expression式的函数式显式types转换(5.2.3)的expression式语句可以与第一个声明符以(。)开头的声明区分开来。 在这些情况下,声明是一个声明。

(我的重点)。 换句话说,任何时候C ++都可以将语句解释为expression式(临时对象强制转换)或者声明(variables),它将select声明。 C ++规范明确给出

T(一);

作为一个声明的例子,而不是一个typesT东西。

这是C ++的最烦人的parsing – 看起来像一个expression,而不是被解释为一个声明。 我以前见过MVP,但在这方面我从来没有见过。

希望这可以帮助!

问题是从构造函数你再次调用构造函数testing(_b)

testing::testing(){的std :: COUT << “ABC”; _ b.clear(); _ B [1] = 1;试验(_b);}

这是发生了什么事

每次你调用test(_b)时,它首先调用默认的构造函数test :: test,然后依次调用test(_b),循环继续,直到堆栈溢出。

从默认构造函数中删除testing(_b)

我敢肯定,你实际上不是“调用构造函数”,因为它们不是直接可调用的IIRC。 法律语言不得不与构造函数没有被命名的function – 我没有一个标准的方便副本,或者我可以引用它。 我相信你正在做的test(_b)正在创造 一个无名的 一个临时调用默认的构造函数。

我不熟悉标准的特殊性,但可能是在构造函数中调用构造函数是未定义的。 因此,它可能是编译器依赖的。 在这种特殊情况下,它会导致无限recursion你的默认构造函数,而无需使用map参数调用你的构造函数。

C ++ FAQ 10.3有一个带有两个参数的构造函数的例子。 如果你添加一个int参数给你的第二个构造函数,比如test(map, int) ,它会performance出一些正常的行为。

对于好的forms,我只需test::testInit(std::map <int, int>& im)test(_b) test::testInit(std::map <int, int>& im) testInit(_b)