如何在OOP中查看构造函数

时间:2013-05-14 22:03:51

标签: oop class constructor

在大多数OOP书籍和文章中,我们读到了类似构造函数的内容:

  

构造函数是类中的专用方法,其名称相同   到类名,它没有返回类型。

所以我们的构造函数是这样的形式:

class MyClass {
    public: /* no return type */ MyClass();
}

好吧,这个定义与OOP原则有一些冲突:方法必须有一个返回类型(即使void),而在一个对象中,我们不能有2个具有相同名称的成员,所以一个方法不能有与班级名称相同的名称。

我认为我们可以将定义更改为类似这样的内容:

  

构造函数是类中的专用方法,它没有名称 - 一个   匿名或无名方法 - 其返回类型是   (类型)。

所以我们会:

class MyClass {
    public: MyClass /* no method name */ ();
}

在第二个定义中:我们允许在大多数OOP语言中使用匿名方法,并且我们的方法具有真正的返回类型。

var obj = new MyClass(); 

调用构造函数,objMyClass的实例,因此构造函数具有返回值。另一方面,new MyClass()是用于在名为MyClass的对象的蓝图上调用可访问的匿名方法的契约。

你怎么看?我错了还是我们可以使用这个定义或者从这个角度来看构造函数?

更新 为什么我要下来并结束投票?请解释一下。

2 个答案:

答案 0 :(得分:4)

运营商new做了两件事:

  1. 为新对象分配内存(在您的示例中,指向该内存的指针分配给obj)。
  2. 调用使用默认值初始化对象的构造函数。
  3. 因此,从这个意义上讲,构造函数不会返回任何内容。它是返回对象的new运算符。构造函数作为装饰器工作:它接收一块内存并使用默认值初始化该内存中的各种字节。

    它也回答了你的第一点,构造函数必须有一个返回类型。由于构造函数只初始化由new运算符分配的一些数据,因此它不能返回任何内容,因为如果它确实要返回某些内容,那么表达式new MyClass()实际上必须返回两种类型同一时间!!一种类型是由运算符new分配的对象,第二种类型是由构造函数装饰的相同对象。

    如果您想对定义如此挑剔,我宁愿建议将描述中的名称method更改为其他内容(也许是装饰者,就像在设计模式中一样?)。

    谁说方法必须返回一个类型?抽象方法呢,它们会返回什么吗?

    编辑回答一些问题:

    是的,抽象方法有一个返回类型但它们实际上并不返回任何东西,只有实现它们定义的接口的方法。我的观点是要表明并非所有定义为方法的东西都必须返回一个类型。无论你怎么称呼它们,一些方法(或某些语言结构)都会返回一些东西而一些方法却不会返回。

    我想在构造函数的情况下,根据不返回任何内容的方法更容易定义它们,因为它们与任何其他常规方法非常相似,除了它们实际上没有返回任何东西的事实而不是试图为类似方法的构造构成另一个定义,而不是返回任何东西。

    运营商new未说创建对象。它只是一个操作符,一个语言结构。当代码被编译时new实际上不再存在,它被一些汇编代码替换,以分配和初始化一段代表该对象的内存。

    让我们反汇编逐一执行new MyClass()时所采取的步骤:

    1. 运算符new分配一块内存,其大小需要存储类MyClass的所有变量和元数据及其所有父类和子类。
    2. 运算符现在执行类MyClass的所有父类的构造函数(如果有的话)。
    3. 运算符执行类MyClass的所有子类的构造函数(存储在MyClass中的成员变量本身不是内置类)。
    4. 运算符最终执行类MyClass的构造函数。
    5. 运算符new返回创建的对象(或指向已分配内存的指针)。
    6. 很少有一个构造函数可以执行。如果类具有父类并且在其中包含任何自定义类,则new运算符必须在能够返回对象之前执行一些(如果不是数十个)构造函数。如果每个构造函数都必须返回一些东西,那么所有返回类型都会去哪里?如果我们不能对构造函数返回什么做什么,那么这样做的重点是什么?

      什么动物是操作员?

      我认为这里令人困惑的是运营商的定义。运算符不是调用的方法。认为new说创建对象的说法与+说要添加两个对象或=说比较对象一样错误。运算符可以被重载但原则是运算符是语言结构,它定义语言(编译的汇编代码)执行的操作,例如,为变量分配两个对象的总和,创建一个对象等。参见operators on wikipedia

答案 1 :(得分:0)

谁在乎书中使用了哪些构造函数的描述?为什么要理解语义?

构造函数的唯一目的是构造和实例化一个对象,没有一个对象就没有OOP。 构造函数做了一些事情并且没有回溯一个值,这就是为什么它们被许多书籍标记为“专门的方法”,并且使用专门这个词正是因为它们的签名中不需要void关键字。

很明显构造函数是做什么以及它们是如何做的所以你的问题归结为构造函数是否在文献中正确描述,而我碰巧认为它们是,正是因为使用了“专门”这个词,在这种解剖水平上浪费时间的重点是什么?

如果直接转到源代码(MSDN),您可以在C#编程指南中的构造函数中找到它:

  

每当创建类或结构时,都会调用其构造函数。一个   class或struct可能有多个不同的构造函数   参数。构造函数使程序员能够设置默认值,   限制实例化,并编写灵活且易于阅读的代码。

正如您所看到的,MSDN没有将构造函数标记为“专用方法”(或其他任何东西),它只是清楚而简洁地描述构造函数是什么以及它的目的是什么。这只是他们设计框架的一部分,所以一些作者用来描述构造函数的隐喻是完全无关的......

最后,引用“框架设计指南”:

  

没有完美的设计。设计就是这样   做出权衡,并做出正确的决定,你需要   了解选项,它们的好处和缺点。如果你   发现自己认为你有一个没有权衡的设计,你是   可能会遗漏一些大而不是找到银弹。

使构造者按照他们的方式很容易被视为这种引用中描述的权衡。

相关问题