2010-06-25 42 views
7

我读有关构造函数,使用建设者 - 奇怀疑

当一个对象实例化的一类,c'tors(如果明确书面或默认的)是要执行的起点。我的疑惑是

  • 是c'tor更像main()C
  • 是的,我明白,你可以 使用 c'tor设置所有默认值的点。我还可以通过编写自定义方法来模拟 的行为。那为什么是c'tor?

例子:

//The code below is written in C#. 
public class Manipulate 
    { 
     public static int Main(string[] args) { 
      Provide provide = new Provide(); 
      provide.Number(8); 
      provide.Square(); 
      Console.ReadKey(); 
      return 0; 
     } 
    } 

public class Provide { 
     uint num; 
     public void Number(uint number) 
     { 
      num = number; 
     } 
     public void Square() 
     { 
      num *= num; 
      Console.WriteLine("{0}", num); 
     } 
    } 

正在学习独立地编制,所以我依赖于编程社区,你能不能也建议我一个很好的OOP的资源,以获得更好的理解。如果不在话题请原谅。

+1

这只是一个快捷方式,所以你不需要不必要地编写5行额外的代码,只不过是setter。 – 2010-06-25 04:09:00

回答

3

头先OOA & D将是一个好的开始。

你不觉得调用一个函数来设置你的类的每个成员变量是有点开销。

使用构造函数,您可以一次初始化所有成员变量。没有这个理由足够你有建设者。

+0

我的观点是除了初始化成员变量之外,还有其他什么用途。还是更像是,而不是有一个单独的方法声明来初始化你使用构造函数吗? – Chaitanya 2010-06-25 04:00:02

+0

这是什么是OOP! – ckv 2010-06-25 04:08:54

1

通常,您应该在构造函数中完成所有初始化。构造函数是创建类的实例时首先调用的,所以您应该在此处设置任何默认值。

2

可以使用常规方法模拟构造函数和析构函数。但是,这两种方法的独特之处在于语言以特殊的方式处理它们。

他们是自动当一个对象被创建或销毁时调用。这提供了一个统一的手段来处理必须发生在对象一生的两个关键时期的最微妙的操作。它避免了班级的最终用户忘记在适当的时间打电话给他们的可能性。

此外,继承等先进的面向对象特性需要均匀性才能工作。

2

首先,大多数答案将至少取决于您使用的语言。在一种语言中具有重要意义的理由不一定在其他语言中有直接的类比。举个例子,在C++中,有很多情况下会自动创建临时对象。 ctor作为该过程的一部分被调用,但对于大多数实际目的而言,不可能在过程中显式调用其他成员函数。但这并不一定适用于其他OO语言 - 有些不会隐式创建临时对象。

1

我认为一个好的学习方法是比较语言之间的OOP,就像从不同的角度看相同的图片。

Google上搜寻了一会儿:

为什么构造函数? 一个简单的函数(也可能有内部函数)和一个对象之间的主要区别在于,一个对象可以托管在一个“变量”中,它的所有功能都在里面,而且可以完全不同于其他“变量”与里面的同一种“对象”。让他们具有不同行为的相同结构的方式取决于您给班级的论点。 所以这里是一个懒惰的例子:

car()现在是一个类。

C1 =车()

C2 =车()

¿C1正是C2?是。

C1 =汽车(大众)

C2 =汽车(兰博基尼)

C1具有比C2相同的功能,但它们是完全地diferent种车的() 变量大众和兰博基尼被直接传递到构造函数。 为什么一个-constructor-?为什么没有其他功能?答案是:订单。

这是我最好的镜头,男人,在这个晚上。我希望我能以某种方式帮助你。

1

您不能在自定义方法中模拟构造函数,因为在创建对象时未调用自定义方法。只有构造函数被调用。那么,当然你可以在创建对象后调用你的自定义方法,但这不是惯例,而使用你的对象的其他人不会知道这么做。

构造函数只是一个约定,作为设置创建对象后的一种方式。

0

一个我们需要构造的原因是“封装”,代码做一些初始化必须在看不见的

0

你也不能强迫变量的传递,而无需使用构造函数。如果你只想实例化一个对象,如果你有一个int传给它,你可以设置默认的构造函数为private,并让你的构造函数为int。这样,就不可能创建该类的一个对象而不需要一个int。

0

子对象将在构造函数中初始化。在像C++这样的语言中,在包含对象中存在子对象(而不是作为通过指针或句柄连接的单独对象),构造函数是将参数传递给子对象构造函数的唯一机会。即使在Java和C#中,任何基类都是直接包含的,因此构造函数的参数必须由构造函数提供。

最后,任何常量(或在C#中,readonly)成员变量只能从构造函数中设置。即使从构造函数调用的辅助函数也无法更改它们。