2010-12-08 3 views
1

자바에서는 '상수'를 선언하는 문자열을 final으로 지정할 수 있습니다. 예 :C++ 최종 상수 문자열

static final String myConst = "Hello"; 

이렇게하면 C++에서 올바르게 수행 할 수 있습니까?

const char * myConst = "Hello"; 

그러나, 실제로, 당신은 무엇을 그 포인터 포인트를 변경할 수 있습니다

const char * const myConst = "Hello"; 

난 항상 본 적이 사람들은이 작업을 수행. 그렇다면 사람들이 포인터를 일정하게 선언하지 않는 이유는 무엇입니까? 올바른 방법은 무엇입니까?

+1

아니요 포인터가 가리키는 내용을 변경할 수 없습니다. 포인터를 변경할 수 있습니다. –

+1

FYI, C++에서는이를 거꾸로 읽어야합니다. 'const char * myConst'가 읽혀집니다 : "myConst는 상수 인 문자에 대한 포인터입니다". 'const char * const myConst'는 "myConst는 상수 인 문자에 대한 상수 포인터"라고 읽혀집니다. –

+0

대부분의 경우 마지막 옵션을 볼 수 있습니다. 누구든지 선언문을 작성하면 더 잘 알 수 없습니다. – aschepler

답변

12
const std::string myConst("Hello"); 
+2

Java의 String 객체와보다 정확하게 병행하려면 +1하십시오. –

+0

정적 부분을 잊지 마십시오.Java를 미러링하려면 정적 멤버 변수가되어야합니다 (전역 변수는 괜찮습니다). 질문에 의해 명확히 밝혀지지 않은 액세스 제한이있을 수 있습니다. –

+1

@Martin : 정적 멤버 인 경우 선언에서 초기화 할 수 없습니다. –

5

예, const char* const은 바꿀 수없는 C 스타일 문자열을 선언하는 올바른 방법입니다.

또는 더 나은 :

#include <string> 
const std::string myConst = "Hello"; 
0

내가 정확히 질문을 이해하지 않습니다. 더 많거나 적은 final 자바 키워드를 모방하기 위해서는 어느 것이

const char * const myConst = "Hello"; 

(포인터를 변경하지 않을 경우), 및/또는 : 포인터가 이후에 변경 될 수 있습니다

const char * myConst = "Hello"; 

합니다. 마지막으로, 첫 번째 버전에서는 상수이기 때문에 실제로 포인터 자체를 변경할 수 없습니다.

0

디에고의 편집으로 예, 올바른 방법으로 작성하십시오. 사람들은 일반적으로 변수 const를 선언하지 않습니다. 왜냐하면 변수가 수정 될지, 아니면 수정되지 않을지 (왜냐하면 을 알고 있기 때문에 수정하지 않는다) 신뢰하지 않기 때문입니다.

문자열 리터럴에 실제로 const 문자가 포함되어 있으므로 pointed-to const를 선언하므로 실제로 const * 값이있는 변수에 할당해야합니다.

0

기술적으로,

char * const myConst = "Hello"; 

포인터를 재 할당하는 것은 아마도 복구 할 수없는 문자열로 당신을 떠날 것처럼, 가장 정답입니다.

구현에 당신이 "안녕하세요"(그것은 나쁜 생각하더라도)의 문자를 변경할 수 있으므로

char const * const myConst = "Hello"; 

의 첫 CONST 좋은 생각입니다. 개인적

char const * myConst = ...; 

과 같은 CONST 숯불 * 반 환 = ...;

은 동등하므로 const가 항상 수정하는 항목 다음에 오는 스타일 가이드 라인을 적용하는 경향이 있습니다. 때때로 장기적으로 오해를 줄입니다.

즉, 대부분의 사람들은 C++에서 const을 올바르게 사용하는 방법을 모르기 때문에 잘못 사용되었거나 전혀 사용되지 않았습니다. 이는 C++을 개선 된 C 컴파일러로 사용하기 때문입니다.

+1

char * const myConst = "Hello"; 이것은 상수 C 문자열을 정의하지 않습니다. 이것은 C++에서 C와의 호환성을 허용하는 해킹입니다. const가 아닌 문자열에 대한 포인터에 문자열 리터럴을 할당하고 있습니다. 물론 모든 컴파일러는 돌연변이 연산을 허용해야합니다. myConst [2] = 'a'; 이는 정의되지 않은 동작이기도합니다. –

+0

@Gene Bushuyev : 왜 'myConst [2] ='a ';가 정의되지 않은 행동입니까? ''a ''는 숫자 형 char (ASCII 환경에서'myConst [2] = 97;를 쓰는 또 다른 방법)에서 값을 설정하는 것의 축약 형일뿐입니다. 왜 배열에서 97을 설정하는 것이 정의되지 않은 동작입니까? – kriss

1
const char * myConst = "Hello"; 

이것은 가리키는 대상이 변경 될 수 없음을 의미합니다.

char * const myConst = "Hello"; 

즉 포인터로 가리키는 위치는 변경할 수 없지만 개체 값은 변경할 수 있습니다.

const char * const myConst = "Hello"; 

이것은 변경 될 수 없음을 의미합니다. 제 경험상 아무도이 사실을 기억하지 못하지만 항상 그물에 있습니다!

보통 세 명이 내 글을 쓸 때 대답합니다!

+0

그리고 두 번째 컴파일러 오류가 발생합니다 ... – kriss

+0

@ kriss C++과 C++와의 하위 호환성을 위해 문자열 리터럴에서 char * 로의 암시 적 변환이 있다고 생각했습니다. –

+0

@kriss : 두 번째 것은 컴파일러가 합리적인 경우 컴파일러 경고하지만 컴파일러가 호환되면 오류가 발생할 수 없습니다. –

0

그러나 실제로 포인터가 가리키는 포인터 을 변경할 수 있습니다. 그래서, 사람들이 포인터를 상수로 선언하지 않는 이유는 무엇입니까? 정확히 방법은 무엇입니까?

유용하지 않으므로 스택에있는 값 (포인터 포함)을 비 const로 설정하려는 경우가 많습니다. Get Sutter & Alexandrescu "코딩 표준"서적,이 점에 대해 설명합니다.

0

프로그래머는 문자 배열을 큰 따옴표로 묶는 데 최소한 const char *과 같은 포인터를 선언해야합니다. 아무 것도 포인터를 일정하게 만들기 위해 (컴파일러 경고 또는 오류 없음) 아무 것도하지 않습니다 ... 사람들이 게으르다는 이유로 자신 만의 결론을 도출 할 수 있습니다. 그들은 실제로 상수를 정의하려고 시도조차하지 않을 것입니다. 단지 컴파일러 오류를 막고 싶습니다 (이 경우 경고).

염두에 유지, 나는 어차피 다른 솔루션을 갈 것입니다 :

const char myConst[] = "Hello"; 

여기에서 차이점은 내가 포인터로 문자열로 사용되는 원래의 바이트 배열을 부패하지 않습니다 이런 식으로, I 원래 리터럴과 똑같이 사용할 수있는 바이트 배열을 갖습니다.

sizeof(myConst)과 같은 결과를 얻을 수 있으며 sizeof("Hello")과 같은 결과가 나옵니다. 문자열을 포인터로 변경하면 sizeof는 문자열의 크기가 아닌 포인터의 크기를 반환합니다 ...

... 분명히 이런 식으로 작업 할 때 포인터를 변경하면 아무런 의미가 없으므로 더 이상 바꿀 포인터.