your programing

생성자가 값을 반환하지 않는 이유는 무엇입니까?

lovepro 2020. 10. 12. 07:58
반응형

생성자가 값을 반환하지 않는 이유는 무엇입니까?


생성자가 값을 반환하지 않는 이유를 알려주십시오. 생성자에 반환 유형이없는 이유를 학생들에게 설명 할 완벽한 기술적 이유를 원합니다.


생성자에서 실제로 발생하는 일은 런타임이 컴파일러에서 생성 한 유형 데이터를 사용하여 스택 또는 힙에있는 메모리에 개체 인스턴스를 저장하는 데 필요한 공간을 결정한다는 것입니다.

이 공간에는 모든 멤버 변수와 vtbl이 포함됩니다. 이 공간이 할당 된 후 생성자는 인스턴스화 및 초기화 프로세스의 내부 부분으로 호출되어 필드의 내용을 초기화합니다.

그런 다음 생성자가 종료되면 런타임은 새로 생성 된 인스턴스를 반환합니다. 따라서 생성자가 값을 반환하지 않는 이유는 코드에서 직접 호출하지 않고 런타임에서 메모리 할당 및 객체 초기화 코드에 의해 호출되기 때문입니다.

반환 값 (기계 코드로 컴파일 할 때 실제로 값이있는 경우)은 사용자에게 불투명하므로 지정할 수 없습니다.


음, 어떤 방식으로 방금 생성 된 인스턴스를 반환합니다.

예를 들어 Java와 같이 호출합니다.

 Object o = new Something();

반환 값이있는 "일반"메서드를 호출하는 것과 같습니다.

 Object o = someMethod();

(저는 C ++에 편향되어 있으므로 다른 언어와 관련하여 이것을 염두에 두십시오.)

짧은 대답 : 코드의 모든 단일 객체 생성에 대해 명시 적으로 성공 여부를 확인할 필요는 없습니다.

다소 더 긴 답변 : C ++에서 생성자는 동적으로뿐만 아니라 전역 적으로 자동으로 할당 된 객체에 대해 호출됩니다. 이 코드에서

void f()
{
  std::string s;
}

s( std::string::string()) 의 생성자가 값을 반환 할 방법이 없습니다 . 성공하거나-객체를 사용할 수 있거나 예외가 발생하면-사용할 기회가 없습니다.

IMO, 그래야만합니다.


생성자는 반환 값을 어떻게 반환해야합니까? new운영자는 새로 생성 된 인스턴스를 반환합니다. 당신은 배우라고 부르지 않습니다 new.

MyClass instance = new MyClass();

ctor가 다음과 같이 값을 반환하는 경우 :

public int MyClass()
{
    return 42;
}

정수는 어디에서받을 수 있습니까?


생성자를 호출 할 때 반환 값은 새 객체입니다.

Point pt = new Point(1,2);

그러나 생성자 자체 내에서는 실제로 객체를 생성하고 반환하는 것이 아닙니다. 코드가 시작되기 전에 생성되었으며 초기 값을 설정하는 것입니다.

Point::Point(int x, int y) {
  this->x = x;
  this->y = y;
}

반환 유형이 없다는 것은 생성자가 다른 함수와 다르게 사용된다는 사실을 반영합니다. 의 반환 유형은 null기술적으로 정확하지만 코드가 객체를 반환하는 것처럼 사용 된다는 사실을 잘 반영하지 않습니다 . 그러나 다른 반환 유형은 코드가 return끝 부분에 있어야 함을 나타내며 이는 또한 올바르지 않습니다.


생성자는 객체의 새 인스턴스를 초기화 할 때 자동으로 호출되는 일부 메서드입니다.

이 메서드는 개체를 지정된 상태로 초기화하고 몇 가지 기본 메서드를 실행해야하는 경우에 있습니다.

실제로 생성자가 항상 좋은 이미지가 될 생성 된 객체의 인스턴스를 반환한다고 상상할 수 있습니다.


모든 답변은 C ++ / Java로 편향되어 있습니다. 생성자가 언어 디자인 이외의 값을 반환하지 않을 이유가 없습니다.

더 넓은 의미에서 생성자를 보라 : 그것은 새로운 객체를 생성하는 함수이다. 완벽하게 유효한 생성자를 C로 작성할 수 있습니다.

typedef struct object object;
int object_create( object **this );

이것은 C에서 완벽한 OOP이며 생성자는 값을 반환합니다 (팩토리라고도 할 수 있지만 이름은 의도에 따라 다릅니다).

그러나 객체를 자동으로 생성하려면 (예 : 일부 유형 캐스트 ​​또는 변환을 충족하기 위해) 몇 가지 규칙을 정의해야합니다. C ++에는 인수가없는 생성자가 있으며 정의되지 않은 경우 컴파일러에서 유추합니다.


토론은 우리가 생각하는 것보다 더 광범위합니다. 객체 지향 프로그래밍은 프로그래밍에 대한 사고 방식 을 설명하는 이름입니다 . 거의 모든 언어로 OO를 가질 수 있습니다. 구조와 함수 만 있으면됩니다. C ++ 및 Java와 같은 주류 언어는 너무 일반적이어서 "방법"을 정의한다고 생각합니다. 이제 Ada의 OO 모델을 살펴보십시오. C ++ 모델과는 거리가 멀지 만 여전히 OO입니다. Lisp와 같은 언어에는 OO를 수행하는 다른 방법이 있습니다.


아직 논의되지 않은 한 가지 요점은 "foo"클래스의 생성자는 foo의 인스턴스를 만들 때뿐만 아니라 foo에서 파생 된 클래스의 인스턴스를 만들 때도 사용할 수 있어야한다는 것입니다. 제네릭 (Java, C ++ 또는 .net이 설계되었을 때 사용할 수 없었던)이 없으면 foo의 생성자가 파생 클래스의 객체를 반환 할 방법이 없습니다. 따라서 필요한 것은 파생 클래스 객체가 다른 수단을 통해 생성 된 다음 foo의 생성자 (초기화를 수행 할 때 해당 객체를 foo로 사용할 수 있음)에서 사용할 수 있도록하는 것입니다.


생성자의 VM 구현이 값을 반환하지 않더라도 실제로는 새로운 객체의 참조를 반환합니다. 그런 다음 하나의 명령문에 새 객체의 참조와 추가 반환 값 중 하나 또는 둘 다를 저장할 수 있다는 것은 구문 적으로 이상하거나 혼란 스러울 것입니다.


생성자는 사용자 코드에 의해 직접 호출되지 않습니다. 런타임에 메모리 할당 및 개체 초기화 코드에 의해 호출됩니다. 그 값은 사용자에게 표시되지 않습니다.


C #의 경우 객체 선언 구문은 다음과 같습니다.

classname objectname= new constructor();

이 줄에 따르면 할당 연산자 (=)를 사용하면 어떤 값을 반환해야합니다. 그러나 생성자의 주요 목적은 변수에 값을 할당하는 것이므로 새 키워드를 사용하면 해당 클래스의 인스턴스가 생성되고 생성자는 해당 객체의 특정 인스턴스에 대한 변수에 값을 할당하므로 생성자는 해당 객체의 할당 된 값을 반환합니다. 예.


생성자를 독립적으로 호출 할 수 없습니다. 대신 객체가 생성 될 때마다 자동으로 호출됩니다. 전의:

MyDate md = new Mydate(22,12,2012);

위의 예 new에서 md가 보유 할 메모리 위치를 반환하고 프로그래밍 방식으로 단일 문에서 여러 값을 반환 할 수 없습니다. 따라서 생성자는 아무것도 반환 할 수 없습니다.


OO 디자인 방법론에 대해 알고있는 것에서 다음과 같이 말할 것입니다.

1) 생성자가 값을 반환하도록 허용함으로써 프레임 워크 개발자는 반환 된 값이 처리되지 않는 순간에 프로그램이 충돌하도록 허용합니다. 프로그램 워크 플로의 무결성을 유지하려면 개체 초기화의 반환 값을 허용하지 않는 것이 올바른 결정입니다. 대신 언어 디자이너는 코더가 getter / setter 액세스 방법을 사용하도록 제안 / 강제합니다.

2) 초기화시 개체가 값을 반환하도록 허용하면 정보 유출 가능성도 열립니다. 특히 변수 / 방법에 적용되는 다중 레이어 또는 액세스 수정이있는 경우.


객체가 생성 될 때 생성자가 자동으로 호출된다는 것을 알고 있듯이 이제 생성자가 int 값을 반환한다고 상상해보십시오. 그래서 코드는 이렇게되어야합니다 ...

Class ABC
{
     int i;
public:
     int ABC()
     {
        i=0;
        return i;
     }
     .......
};
int main()
{
    int k= ABC abc; //constructor is called so we have to store the value return by it
    ....
}

But as you aware that stament like int k= ABC abc; is not possible in any programming language. Hope you can understand.


i found it helpful

This confusion arises from the assumption that constructors are just like any other functions/methods defined by the class. NO, they are not.

Constructors are just part of the process of object creation. They are not called like other member functions.


I would be using Java as my language in the answer.

class SayHelloOnCreation {
     public SayHelloOnCreation() {
         System.out.println("Hello, Thanks For Creating me!");
     }
}

class Test {
     public static void main(String[]args) { 
         SayHelloOnCreation thing = new SayHelloOnCreation(); //This line here, produces an output - Hello, Thanks For Creating me!
     }
}

Now let us see what is happening here. in java, we use the new keyword to create an instance of a class. And as you can see in the code, in the line, SayHelloOnCreation thing = new SayHelloOnCreation();, the expression after the assignment operator runs before assignment is done. So using the keyword new, we call the constructor of that class (SayHelloOnCreation()) and this constructor creates an object on the Java Heap. After the object is created, a reference to that object is assigned to the thing reference of type SayHelloOnCreation.

The point that I am trying to keep here is that if constructors were allowed to have a return type, Firstly the strongly typed nature of the language would be compromised (Remember I am speaking about Java here).

Secondly, an object of class SayHelloOnCreation is created here so by default I guess the constructor returns a reference of the same type, to avoid ClassCastException.


So the reason the constructor doesn't return a value is because it's not called directly by your code, it's called by the memory allocation and object initialization code in the runtime. Its return value (if it actually has one when compiled down to machine code) is opaque to the user - therefore, you can't specify it.


Constructor doesn’t return anything not even Void. Though some of the answers have mentioned that Constructor do return reference to the newly created object , which is not true. It’s the new operator that returns the object.

So Why constructor doesn’t return any value

Because its not supposed to return anything. The whole purpose of constructor is to initialize the current state of the object by setting the initial values.

So Why doesn’t it even return Void

This is actually a Design constraint which has been placed to distinguish it from methods. public void className() is perfectly legal in java but it denotes a method and not a constructor. To make the compiler understand that it’s a constructor , it requires a way to distinguish it.

참고URL : https://stackoverflow.com/questions/1788312/why-do-constructors-not-return-values

반응형