none
构造函数调用的问题,急!!! RRS feed

  • 问题

  • 构造函数可以被调用吗?
    问题如下:

    class clock
    {
         clock(int a){...;}
    .....
    }

    int main()
    {
       clock c;
       c.clock(1);
    ....
    }



    这样子编译不通过,请问错在哪里??谢谢!!!
    2010年1月7日 10:25

答案

  • class clock
    {
         clock(int a){...;}
    .....
    }
    
    int main()
    {
       clock c(1);
    ....
    }

    构造函数是在对象创建时自动被调用的。因此,需要在创建对象时时给带参数的构造函数传入值。
    • 已标记为答案 adam90 2010年1月9日 1:37
    2010年1月7日 10:54
    版主

全部回复

  • class clock
    {
         clock(int a){...;}
    .....
    }
    
    int main()
    {
       clock c(1);
    ....
    }

    构造函数是在对象创建时自动被调用的。因此,需要在创建对象时时给带参数的构造函数传入值。
    • 已标记为答案 adam90 2010年1月9日 1:37
    2010年1月7日 10:54
    版主
  • 主函数里为什么不能写c.clock?
    2010年1月7日 12:16
  • 这个不是能不能的问题。 是因为 clock c 这行代码声明了一个clock 类的实例c,或者说是声明了一个clock 类型的变量,变量名是c。 此时c对象要被自动进行初始化,而初始化就要调用clock的构造函数,也就是clock(int a)。 而你实例化c时没有给出clock(int a) 所需要的参数,所以编译器报错。

    这个是面向对象的基础,C#、C++、Java 的构造函数都是一样的。
    2010年1月7日 12:37
    版主
  • We can find some descriptions about Constructor in http://www.cplusplus.com/doc/tutorial/classes/
    A class can include a special function called <tt>constructor</tt>, which is automatically called whenever a new object of this class is created. This constructor function must have the same name as the class, and cannot have any return type; not even <tt>void</tt>.
    Constructors cannot be called explicitly as if they were regular member functions. They are only executed when a new object of that class is created.

    因为类是对于数据及其相关操作的封装。所以从一个类实例化成一个对象的时候,需要将成员数据初始化。所以类需要构造函数。但是对于已经实例化的对象来说,调用构造函数是没有任何意义的。但是这只是编译器通过语义进行控制。在C++对象模型中,一个构造函数和一个普通成员函数没有任何区别。
    例如
    clock::clock(1);是可以调用成功的。

    麻烦把正确答案设为解答。
    2010年1月8日 5:00
    版主
  • 谢谢,再问个问题,为什么子类不能从父类那里继承构造和析构函数呢?拷贝构造可以被继承吗?
    2010年1月9日 1:38