2016-10-29 2 views
0

int a = 5int a(5)은 모두 표준 출력에 표시 될 때 동일한 출력을 생성합니다. 또한 int* b = new intint* b(new int)은 같은 것으로 보입니다. 그것들은 변수를 초기화하고 포인터를 선언하는 두 가지 다른 방법입니까, 아니면 더 큰 그림이 있습니까? 솔직히 할당 연산자가없는 원시 데이터 형식을 초기화 할 수 있는지 전혀 몰랐습니다.C++에서 int a = 5와 int a (5)는 동일합니까?

+5

예 동일합니다. 'int a = 5;'에는 대입 연산자가 없습니다. '= '기호는 초기화 구문의 일부입니다. –

+1

in C++ 11'int a {5};'도 작동합니다. – Asu

+0

내 답변이 커뮤니티에서 받아 들여지지 않았으므로 삭제했지만 누군가가 프리미티브와 클래스 간의 차이점과 구별이 중요 할 때 종합적인 답변을 게시해야한다고 생각합니다. – kabanus

답변

2

예, 동일합니다.

반면에 클래스 유형의 경우에는 약간 다릅니다.

struct S { 
    S(int); 
    S(const S&); 
}; 

S s(5); // 1 
S ss = 5; // 2 

라인 1은 s를 구성 S(int)를 사용하여 표시했다. 2로 표시된 줄은 조금 더 복잡합니다. 형식적으로 S(int)을 사용하여 S 유형의 임시 개체를 만든 다음 S(const S&)을 사용하여 임시로 ss에 복사합니다.

그러나 컴파일러는 S(int)으로 직접 ss을 구성 할 수 있으며 실제로 모든 컴파일러가이를 수행합니다. 그러나 복사 생성자는 여전히 존재해야하며 액세스 할 수 있어야합니다. 만 사용이 생략됩니다. 따라서 S(const S&)이 비공개로 표시된 경우 2라고 표시된 줄이 잘못 형성됩니다. 호출 할 때 알려주는 내용을 std::cout에 쓰는 복사 생성자를 작성하여이 문제를 해결할 수 있습니다. 컴파일러는 눈에 보이는 부작용이 있더라도 해당 호출을 건너 뛸 수 있습니다.

관련 문제