"새 연산자"와 "새 연산자"의 차이점은 무엇입니까?
new연산자 를 사용하는 것 입니다. 이 연산자는 오버로드 될 수 있습니다. 기본 연산자와 오버로드 된 버전을 구분하기 위해 기본값은 "새 연산자"라고하고 오버로드 된 버전은 "새 연산자"라고합니다.
"새 연산자"와 "새 연산자"의 차이점은 무엇입니까?
new연산자 를 사용하는 것 입니다. 이 연산자는 오버로드 될 수 있습니다. 기본 연산자와 오버로드 된 버전을 구분하기 위해 기본값은 "새 연산자"라고하고 오버로드 된 버전은 "새 연산자"라고합니다.
답변:
나는 일반적으로 두 가지를 조금 더 잘 구별하기 위해 다른 표현을 시도하지만 어쨌든 좋은 질문입니다.
연산자 new는 원시 메모리를 할당하는 함수입니다. 최소한 개념적으로는 malloc(). 자신의 컨테이너와 같은 것을 작성하지 않는 한 매우 드문 일이지만 다음과 같이 operator new를 직접 호출 할 수 있습니다.
char *x = static_cast<char *>(operator new(100));
전역 적으로 또는 특정 클래스에 대해 new operator를 오버로드 할 수도 있습니다. IIRC, 서명은 다음과 같습니다.
void *operator new(size_t);
물론 new 연산자 (전역 또는 클래스)를 오버로드하는 경우 일치하는 연산자 delete도 오버로드해야합니다. 그만한 가치를 위해 배열에 메모리를 할당하는 데 사용되는 별도의 연산자 new []도 있습니다.하지만이 모든 것을 완전히 무시하는 것이 거의 확실합니다.
new 연산자는 일반적으로 무료 상점에서 객체를 만드는 데 사용하는 것입니다.
my_class *x = new my_class(0);
이 둘의 차이점은 new operator는 그저 원시 메모리 만 할당 한다는 것입니다. new 연산자는 new 연산자를 사용하여 메모리를 할당하는 것으로 시작하지만 올바른 유형의 객체에 대한 생성자를 호출하므로 결과는 해당 메모리에 생성 된 실제 라이브 객체가됩니다. 해당 객체에 다른 객체 (포함 또는 기본 클래스)가 포함되어 있으면 해당 생성자도 호출됩니다.
operator delete(x);.
"새로운 연산자"
class Foo
{
public:
void* operator new( size_t );
}
"새 연산자":
Foo* foo = new Foo();
이 예에서는 다음을 new Foo()호출합니다.Foo::operator new()
즉, "새 연산자" operator new()는 + 연산자 호출처럼 " "를 호출합니다.operator +()
newC ++의 연산자가 아닙니다. sizeof예를 들어, 운전자이지만, new및 delete아니다. new및 delete키워드 및 이러한 키워드가 형성하는 구문 구조를 new-expression 및 delete-expression이라고 합니다.
sizeof구문 구조이며, new그리고 delete모두 유효한, 법률, 과부하 수있는 운영자입니다. 모두에서 나는 본 것, new그리고 delete모두 운영자입니다. 참조 [cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
operator new기능" 과 같은 용어가 있습니다. 다시, sizeof동안 explicilty,에 "연산자"라고 new하고 delete있다 결코 사업자라고합니다.
다음은 Scott Meyers의 More Effective C ++ 책에서 인용 한 것입니다.
new 연산자는 함수를 호출하여 필수 메모리 할당을 수행하고 해당 함수를 다시 쓰거나 오버로드하여 동작을 변경할 수 있습니다. new 연산자가 메모리를 할당하기 위해 호출하는 함수의 이름은 operator new입니다.
"new operator"와 "operator new"사이에는 차이가 없습니다. 둘 다 동일한 것을 참조합니다. operator new일반적으로 new-expressions에 의해 생성 된 객체에 대해 원시 메모리 할당을 수행 하는 오버로드 가능 / 교체 가능 함수입니다 .
또한 두 용어 모두 언어 사양 (공식 용어의 정의 소스)에 없습니다.
당신이 사용하는 경우 new객체를 생성하는 프로그램에서, 그것은이라고합니다 새로운 표현 . New-expression 은 new문법에 정의 된 키워드 와 추가 구문 부분으로 구성됩니다. 이 표현식의 구문 중 어떤 부분도 "연산자"로 언급되지 않습니다.
원시 메모리 할당 기능 operator new은 공식적으로 " operator new기능"이라고합니다. 이 시퀀스 의 단어 operator와 new는 두 개의 개별 C ++ 언어 키워드 일뿐입니다. 그들은 영어 용어 "operator new"를 형성하지 않습니다. 언어 사양 어디에도 영어 용어로 "operator new"에 대한 언급이 없습니다. 매번 이것은 메모리 할당 함수에 대한 선언 구문을 생성하는 두 개의 독립적 인 키워드의 조합입니다.
다시 말하지만, 이력서에서는 공식적으로 C ++에는 "operator new"또는 "new operator"와 같은 영어 용어가 없습니다. 이전 시퀀스는 언어 사양에 영어 용어가 아닌 키워드 조합으로 만 존재합니다. 후자는 전혀 존재하지 않습니다.
OP의 질문이 제대로 표현되지 않았습니다. '새로운 연산자'와 '새로운 표현'의 차이? ' 'operator new'는 종종 'operator new function'을 의미하기도합니다.
그리고 주위에 많은 정답이 있습니다. 아래는 내 것입니다.
1> 'new expression'은 'operator new'를 호출하여 원시 메모리를 할당 한 다음 생성자를 호출합니다.
apple * p = new apple(); //new expression
2> 'operator new'는 malloc과 크게 다르지 않은 원시 메모리 만 할당합니다.
void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.
new 연산자 : C ++는 new 연산자를 사용하여 개체의 동적 할당을 지원합니다. new 연산자는 free store라는 풀에서 개체에 대한 메모리를 할당합니다. new 연산자는 특수 함수 연산자 new를 호출합니다.
operator new : 요청이 0 바이트의 저장 공간에 대한 것 인 경우, operator new는 고유 한 개체에 대한 포인터를 반환합니다 (즉, operator new에 대한 반복적 인 호출이 다른 포인터를 반환 함). 할당 요청을위한 메모리가 부족하면 new 연산자는 NULL을 반환하거나 예외를 throw합니다. new 연산자의 첫 번째 인수는 size_t 유형 (STDDEF.H에 정의 된 유형)이어야하며 반환 유형은 항상 void *입니다.
자세한 내용은 MSDN 링크입니다.
new 는 연산자이자 키워드입니다.
2.13 && 2.12에서 [1] 참조.
new 는 두 가지 일을합니다 : T * t = new T (arg);
1) 객체에 대한 메모리 할당 : void * ptr = operator new (sizeof (T));
// operator new 는 연산자 가 아닌 함수 (c의 malloc와 유사)입니다 (3.7.4에서 [1] 참조). 그러나 항목 7 [2]는 그것도 운영자라고 말했습니다. 제 생각에는 연산자와 함수의 차이가 작으며, 오버로딩 연산자가 함수에 의해 구현된다는 것을 기억하면 알 수 있습니다.
//이 연산자 / 함수 (operator new)를 여기에서 원하는대로 오버로드 할 수 있습니다.
2) 할당 된 메모리에서 개체 초기화 : ptr에서 T :: T (arg) 호출
// 컴파일러 만이 작업을 수행 할 수 있습니다. 나도 당신도 할 수 없습니다.
// 또한 컴파일러는 T에 멤버 객체의 생성자와 기본 클래스의 생성자를 호출합니다. 그리고이 호출은 재귀 적입니다. 컴파일러 만이 할 수 있습니다.
그래서, operator new는 new의 임무의 일부를 수행하고,이 부분에서만 우리는 무언가를 할 수 있습니다.
[1] : ISO / IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
[2] : 마이어스, 스콧. 효과적인 C ++, 세 번째.