2011-08-09 4 views
0

(라인 (44) 광고 라인 (45) 모두 잘 작동)기본 복사 constructer 및 기본 대입 연산자 내가 <a href="http://ideone.com/bEYxo" rel="nofollow">here</a>을 사용하고 같은 코드에 사용되는 이들 중 하나의 차이가 무엇인지

발췌 :

Date temp = *this; //ASSIGNMENT OPERATOR CALL(PROVIDED BY COMPILER) 
//Date temp(*this); //COPY CONSTRUCTOR CALL(PROVIDED BY COMPILER) 

내 의견 : 할당 중에 object1 = object2와 (과) 같은가요? object2의 내용이 삭제되어 object1에 배치되는 반면, 같은 작업이 copy2를 통해 발생하는 경우 object2의 내용이 그대로 유지됩니다 (단어가 "복사"를 의미하는 것처럼).

참고 : 그런데 내 코드 2008의 Microsoft Visual C++에서 잘 컴파일하지만 그에 대한 ideone.com.Any 이유에 경고

prog.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Date&)’: 
    prog.cpp:103: warning: deprecated conversion from string constant to 

했다.

+0

경고가 자명하다 -'char *'를'char *'에 저장하려고 시도하고있다. (문자열 배열이 const라는 것을 이해해야한다.) – Nim

+0

감사합니다. 하지만 MV C++는 아무런 경고도하지 않고 있습니다. 컴파일러가 도와줌으로써 – munish

+1

연산자 = 귀하의 발췌 부분에서 결코 호출되지 않습니다. – pmr

답변

4
Date temp = *this; 
Date temp(*this); 

모두 콜 복사 생성자,
첫째는 복사 초기화 & 두 번째는 직접 초기화로 불리는이라고합니다.

기억할 간단한 규칙 :
개체가 생성되고 동일한 문에서 초기화되는 경우 복사 생성자를 호출합니다.

개체가 방금 할당되고 동일한 문에서 작성되지 않으면 할당 (복사 할당) 연산자를 호출합니다.

리터럴 일반 문자열 "n 개의 CONST의 문자의 배열"을 입력 가지고 있기 때문에


컴파일러는 불평한다. 그리고 문자열 리터럴 (4.2)에 대한 const에서 non-const 한정어로의 암시 적 변환은 더 이상 사용되지 않습니다.

참조 :
C++ 기본 섹션 [2.13.4/2]
아래 정의 N 문자열의 크기이다 array of n const char을 입력했다 리터럴 평범한 문자열; 정적 저장 기간 (3.7)을 가지며 주어진 문자로 초기화됩니다.

Annexure의 D 부 [D.4/1]
const에서 string literals (4.2)에 대한 자격 non-const에 암시 적 변환이 중단된다.

그래서 당신은 사용해야 경고를 피하기 위해 :

static const char *monthName[13] 
     ^^^^^^^ 
+0

L "hello"는 MS 확장이 아니라 C++ 표준입니까? –

+0

+1 :'Data x = y;'와'Data x (y);'(실제로는 생성자를 호출하고 할당 연산자는 아님) 사이의 약간의 알려진 차이점 : 후자는 생성자가'explicit ', 전자는 그렇지 않습니다. –

+0

@Ali Veli : L "Hello"는 유니 코드 문자열의 Windows 버전입니다. OP는 ** String Literals **에 대해 이야기하고 있습니다. Google에서 굵은 글씨로 단어를 찾아보십시오. 이해가되지 않을 경우 여기에서 질문하십시오. –

1
static char *monthName[13] 

는/경고를 피하기 위해

static const char *monthName[13] 

해야 할 수 있습니다.

1

기본 복사 생성자와 기본 할당 연산자의 차이점은 할당 연산자가 호출 될 때받는 객체의 멤버가 이미 값으로 초기화되어 있으며 그 값을 두 번째 대상. 복사 생성자를 사용하면 두 번째 객체에있는 멤버의 복사본으로 멤버가 초기화됩니다. 두 번째 객체는 두 작업에 완전히 영향을받지 않아야합니다.

그러나 코드에서 할당 연산자를 사용하지 않고 복사 생성자를 사용하고 있습니다. 이 작업을 수행 한 경우 :

Date temp; 
temp = *this; 

그러면 할당 연산자를 사용하게됩니다.

+0

감사합니다. @ 벤자민 – munish