关于C#:在构造函数初始化器中使用成员的成员函数 | 珊瑚贝

Using member functions of members in the constructor initializer


我在初始化列表中遇到过几次以下问题,但我一直无法很好地解释它。任何人都可以解释为什么以下失败(我没有编译器来捕捉拼写错误,所以请耐心等待):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Foo
{
 public:
  Foo( int i ) : m_i( i ) {}  //works with no problem

  int getInt() {return m_i;}

  ~Foo() {}
 private:
  int m_i;
};

class Bar
{
 public:
  Bar() :
   m_foo( 5 ),           //this is ok
   m_myInt( m_foo.getInt() ) //runtime error, seg 11
  {}

  ~Bar() {}
 private:
        Foo m_foo;
  int m_myInt;

};

当试图调用在初始化器列表中较高级初始化的成员的成员函数时,我会遇到段错误。我似乎记得这是一个已知问题(或者可能是设计使然),但我从未见过它被很好地描述过。附加的示例是用普通的旧数据类型设计的,但是将 Bar::m_myInt 替换为另一个缺少默认(空)构造函数的对象,问题更加真实。谁能赐教?

  • 错字: ~Foo {} 代表 ~Foo() {} ?
  • 这使用 GCC 3.4.3 编译和运行,在 Cygwin 中没有错误。你用的是什么编译器?


初始化顺序与初始化列表中元素的顺序无关。实际顺序是类定义中成员的顺序。也就是说,在您的示例中, m_foo 将在 m_myInt 之前初始化,这不是因为初始化列表,而是因为该成员首先出现在类中。

您发布的具体示例应该可以毫无问题地编译和运行。

  • 在 gcc 的情况下,你可以传递它 -Wreorder 并且如果你搞砸了它会发出警告
  • 是的,这就是在咬我!我在脑海中切换了它。我认为初始化顺序是基于初始化列表顺序而不是类定义顺序。感谢您清除它!


数据成员按照类声明中列出的顺序进行初始化(在您的示例中为 private: 下的顺序)。初始化列表中给出的顺序对构造顺序没有限制。

因此,在您的示例中,像这样重新排序数据成员可能会导致未定义的行为:

1
2
3
private:
    int m_myInt;
    Foo m_foo;

数据成员的顺序是否可能与您显示的实际不同?

  • 是的,我的示例应该翻转 Bar 的私有成员以充分说明问题。感谢您的帮助!


来源:https://www.codenong.com/2768723/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9705.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?