2010-06-16 5 views
14
int value = 5; // this type of assignment is called an explicit assignment 
int value(5); // this type of assignment is called an implicit assignment 

명시 적 및 암시 적 할당이 다른 경우와 그 차이점은 무엇이며 어떻게 다릅니 까?C++의 명시 적 할당과 암시 적 할당의 차이점


http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx

편집 : 난 사실 그냥 모든 일을 많이 명확 ... 만드는이 문서를 발견하고는 마크 생성자하면 (일반적으로에서 )를 복용해야 또 다른 질문을 가져온다 numeric/bool/string - 원시 타입의 단일 매개 변수는 명시 적으로 나머지는 그대로 두십시오 (물론 생성자와 같은 생성자와 같은 시계는 계속 유지해야합니다) (int, SomeType = SomeType())?

+3

숙제와 같은 냄새가납니다. 그렇다면 태그를 붙이십시오. – greyfade

+0

숙제가 아니라, 내가 오래 전에 조사한 바가없는 메모. 어쨌든 숙제로 무언가를 태그하는 것은 무엇을합니까? –

+1

질문이 숙제 인 것이 분명합니다. 일반적으로 질문에 대답하는 사람들은 대답 전체에 힌트를주는 것을 선호합니다. – strager

답변

6

클래스에 ' 명시 적으로 '. 다음 중 하나는 작동하지.

그렇지 않으면 차이가 없습니다.

-1

오직 하나만 과제입니다. 둘 다 초기화됩니다.

편집 : 실제로는 틀렸어. 할당도 아니다.

+2

그 중 아무 것도 부양 대상이 아닙니다. 할당과 초기화는 상호 배타적 인 용어입니다. – fredoverflow

+0

heh ... 내가 편집하고있는 것처럼 : P –

21

이들 중 어느 것도 모든 종류의 지정이 아닙니다. 둘 다 초기화됩니다. 첫 번째는 사본 초기화 및 두 번째 직접 초기화를 사용합니다. (FWIW, 전 "명시 적 할당"또는 "암시 적 할당"이라는 용어를 처음 들어 본 적이 없다고 확신합니다).

편집 : (대부분 나단의 의견에 응답) :

여기

가 귀하의 코멘트에서 코드의 수정 된 버전입니다 :

#include <iostream> 

struct Foo { 
    Foo() { 
     std::cout << "Foo::ctor()" << std::endl; 
    } 
    Foo(Foo const& copy) { 
     std::cout << "Foo::cctor()" << std::endl; 
    } 
    Foo& operator=(Foo const& copy) { 
     std::cout << "foo::assign()" << std::endl; 
     return *this; 
    } 
}; 

int main(int, const char**) { 
    Foo f; 
    Foo b(f); 
    Foo x = b; 
    return 0; 
} 

이를 실행 한 결과는 다음과 같아야합니다

Foo::ctor() 
Foo::cctor() 
Foo::cctor() 

foo::assign()을 실행하고 컴파일러를 버리고 작동하는 컴파일러를 얻으면 (아, 컴파일러가 너무 심하게 망가졌습니다)!

+0

* 필연적 * 사실. POD 유형으로, 귀하의 진술은 정확합니다. 문제의 유형이 사용자 정의 된 경우 비슷한 복사 생성자가 없어도 변환을 수행하는 사용자 정의 할당 연산자가있을 가능성이 큽니다. 이상한, 네. 그러나 가능합니다. –

+0

또한 첫 번째는 할당입니다. 두 번째는 초기화입니다. 첫 번째 방법과 거의 동일한 방법으로 인라인 초기화를 수행해도 할당이 수행되는 것을 방해하지는 않습니다. 복사 초기화 및 복사 할당이 동일하다는 가정에는 결함이 있으며 보장되지 않습니다. –

+5

@Nathan :이 답변은 정확합니다. §8.5/12는 복사 초기화를'T x = a;'형태의 초기화로 정의하고 '직접 초기화'를'T x (a);'형식의 초기화로 정의한다. 둘 다 초기화입니다. – GManNickG

관련 문제