在没有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
传递的代码,而是作为名为_b
types为test
的variables的variables声明,使用默认构造函数。 因此,看起来像使用第二个构造函数创build一个临时test
对象的一段代码是recursion创build一个types为test
的新对象,并再次调用该构造函数。
要解决这个问题,你可以给variables一个明确的名字,比如
test t(_b);
这只能被解释为一个名为t
的typestest
variables,使用第二个构造函数进行初始化。
我从来没有见过这个,我已经用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)
。