2014-02-28 47 views

回答

3

1)在outer的构造函数初始化列表中初始化i

inner i; 

outer(): i(*this) {} 

2)(C++ 11只)用大括号初始化为i。在这种情况下,你的使用大括号,而不是括号。

inner i{*this}; 
0

成员i可以在类中声明,但如果您使用的是支持C++只有98编译器不能被初始化。您可以在outer的构造函数的实现中初始化它。

class outer { 
public: 
    class inner { 
    outer & o; 
    public: 
    inner(outer & o): o(o) {} 
    }; 

    outer() : i(*this) {} 
    inner i; 
}; 
1

你不能这样做。你可以做到这一点在外部类

outer() : i(*this) {} 

这是这样的构造是容易出错的,虽然,因为实例尚未建造和this是不完整的。一般不使用this在初始化列表(GCC会给你一个警告)

另一种方式是仅适用于C++ 11

inner i { *this }; 
+0

有两种方法之间没有实质性的区别。非静态成员按声明顺序初始化。如果有一个ctor-initializer,那么它就被使用了,否则如果有一个使用了brace-initializer的话,否则它会被默认初始化,并且它会进入下一个成员。 – Brian

+0

无论如何,'* this'是一个左值,并且如果存在左值到右值的转换,则只有一个问题。在这种情况下不会有,因为该参数是一个参考。 – Brian

相关问题