【问题标题】:C++, constructor restrictionsC++,构造函数限制
【发布时间】:2014-01-23 16:34:26
【问题描述】:

我在学C++,看不懂下面黑体字的意思:

来自IBM manual

以下限制适用于构造函数和析构函数:

  • 构造函数和析构函数没有返回类型,也不能返回值。
  • 不能在构造函数和析构函数上使用引用和指针,因为它们的地址不能被获取。
  • 不能使用关键字 virtual 声明构造函数。
  • 构造函数和析构函数不能声明为 static、const 或 volatile。
  • 联合不能包含具有构造函数或析构函数的类对象。

你能举个例子吗? 谢谢!

【问题讨论】:

    标签: c++ constructor


    【解决方案1】:

    这句话的意思是你不能把指针指向构造函数或析构函数。这是一个例子:

    class Sample{
        private: int x;
        public: Sample() { x = 100; };
        public: void* member() { x = 200; };
    };
    
    template <class X>
    void call_me(Sample s, X function){
        (s.*function)();
    };
    
    call_me(s, &Sample::member);   //valid
    call_me(s, &Sample::Sample);   //invalid
    call_me(s, &Sample::~Sample);  //invalid
    

    原理是这样的:

    1. 构造函数不返回任何东西(尽管它可能被认为是一个返回初始化对象的函数)。它作为成员函数的返回类型是什么?
    2. 构造函数并不是真正的成员函数,因为它不能在对象上调用(如s.member())。
    3. 可能为每个构造函数和析构函数创建了多个实际函数。一个构造函数可能会分配内存,而另一个可能不会(但仍以相同的方式初始化类成员)。一个析构函数可能会破坏基础子对象,而另一个可能不会。在源代码中的每个 ctor/dtor 调用中,编译器选择要调用的实际“低级”ctor/dtor;这个选择是在编译时做出的。如果通过指针调用它是无法完成的。
      大概这个就是“他们的地址不能被取走”的意思。

    【讨论】:

      【解决方案2】:

      您不能创建指向构造函数的函数指针(或引用)。

      【讨论】:

        【解决方案3】:

        第一个猜测是您不能创建引用或指向构造函数/析构函数的指针。当然,在这种情况下(如果可能的话)“引用或指针”将具有引用成员或成员指针类型,因为这些成员函数不是静态的。然而,这种解释是有问题的,原因之一是:在 C++ 中,没有引用成员这样的东西。

        基本上,在这个解释中提到“引用”没有任何意义:你不能引用一个类的 any 非静态成员函数,无论它是否是构造函数/析构函数与否。 C++ 中根本没有这样的东西。

        如果上述解释是正确的(正如其他答案也建议的那样),更有意义(但仍不完美)的措辞将是

        • 指针不能用于构造函数和析构函数,因为它们的地址不能被获取。

        在这种情况下提及“引用”毫无意义。

        【讨论】:

          【解决方案4】:

          它们不能是静态的或虚拟的

          【讨论】:

          • 您可能需要详细说明您的答案,因为它现在所说的内容对任何初学者都没有太大帮助。
          猜你喜欢
          • 2013-03-04
          • 1970-01-01
          • 1970-01-01
          • 2020-05-14
          • 2013-12-19
          • 1970-01-01
          • 1970-01-01
          • 2015-02-07
          • 2013-04-29
          相关资源
          最近更新 更多