C ++,构造函数限制

时间:2010-04-03 13:07:39

标签: c++ constructor

我正在研究C ++,我无法理解下面粗体句子的含义:

来自IBM manual

  

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

     
      
  • 构造函数和析构函数没有返回类型,也不能返回值。
  •   
  • 引用和指针不能用于构造函数和析构函数,因为它们的地址无法使用。
  •   
  • 无法使用关键字virtual声明构造函数。
  •   
  • 构造函数和析构函数不能声明为static,const或volatile。
  •   
  • 联合不能包含具有构造函数或析构函数的类对象。
  •   
你能告诉我一个例子吗? 谢谢!

4 个答案:

答案 0 :(得分:24)

句子意味着您不能将指针指向构造函数或析构函数。这是一个例子:

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来调用;这个选择是在编译时做出的。如果通过指针调用它,则无法完成 可能这个意味着“他们的地址无法被采纳”。

答案 1 :(得分:11)

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

答案 2 :(得分:1)

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

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

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

  • 指针不能用于构造函数和析构函数,因为它们的地址无法使用。

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

答案 3 :(得分:-1)

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