2010-06-03 4 views
5

객체가 const를 객체 또는 일반 목적의 경우 알 수있는 방법은 예를 들어 사용자가 String에서 const를 개체를 만드는 경우 다음 더를이 다음 클래스CONST 객체와 const를 생성자

class String 
{ 
    String(const char* str); 
}; 

을 고려하지 있나요 전달 된 네이티브 문자열을 복사해야하는 이유와 그 문자열을 조작하지 않기 때문에 문자열 형식, 문자열 검색 및 문자열을 변경하지 않을 다른 함수를 얻을 수 있습니다.

+5

알 수있는 방법이 없습니다. 사실'const'는 객체가 초기화되면 (생성자가 완료되면) 적용되고 일단 소멸자가 입력되면 멈 춥니 다. – GManNickG

답변

8

복사할만한 이유가 있습니다. const char *의 수명이 String 객체의 수명과 동일하다는 것을 알 수 없습니다. 그리고 아니, 당신이 const 객체를 생성하고 있다는 것을 알 수있는 방법이 없습니다.

2

불행히도 C++은 시도하고있는 것을 수행하는 방법을 제공하지 않습니다. 단순히 const char *를 전달한다고해서 가리키고있는 메모리의 수명이 보장되는 것은 아닙니다. 고려 :

char * a = new char[10]; 
char const *b = a; 
String c (b); 
delete[] a; 
// c is now broken 
2

당신이 알 방법이 없습니다. String과 밀접하게 상호 작용하고 외부 버퍼를 가리키는 상수 문자열을 만들 수 있습니다 (해당 생성자를 비공개로 만들고 상호 작용하는 클래스를 중첩 클래스 또는 String의 친구로 만드는 방법).

잠재적 인 작은 상수 문자열에 대한 동적 메모리 관리가 걱정된다면 Small String Optimization (Small Object/Buffer Optimization)을 구현할 수 있습니다. 문자열 클래스에 내장 된 버퍼를 가지고 각 문자열을 미리 정의 된 크기로 버퍼에 복사하고 동적으로 할당 된 저장 공간보다 큰 각 문자열을 복사합니다 (동일한 기술은 작은 크기의 함수 객체를 저장하는 데 boost::function에서 사용됩니다) .

class String { 
    union { 
    char *dynamicptr; 
    char buffer[16]; 
    }; 
    bool isDynamic; 
}; 

버퍼 자체에 내장에도 문자열의 길이를 저장 (buffer[15] 유사한 trickeries로 길이를 저장)에 대한 재치 기술이있다.

0

당신이 찾고있는 것은 기본적으로 COW (copy on write) 문자열입니다. 이러한 일들은 전적으로 가능하지만 일을 시작하는 것은 입니다. 물론은 다소 사소한 일입니다. 멀티 스레드 환경에서 좋은 성능을 얻는 것은 중요하지 않은 범위를 넘어서서 어려운 범위로 갈 수 있습니다.

1

당신이 찾고있는 것을하기 위해 const_string을 사용할 수 있습니다. 그러나 const 문자열을 사용하더라도 문자열을 복사 할 필요가 없다는 것을 "알려줘야"합니다.

const char* foo = "c-string"; 
boost::const_string bar(foo); // will copy foo 
boost::const_string baz(boost::ref(foo)); // assumes foo will always be a valid pointer. 
1

문자열 그는 그것에 어떤 조작을하지 않기 때문에, 그가 할 수있는 유일한 것은 문자열 크기를 얻을 수 있음과 전달 된 기본 문자열을 복사 할 이유가 없다에서 사용자는 const를 객체를 생성하는 경우 , 문자열 검색 및 문자열을 변경하지 않을 다른 기능들.

오 예 있습니다. 그냥 const로 전달한다고해서 실제로 생성자 호출 외부에서 const가되는 것은 아니며 특히 문자열 객체가 존재하는 동안 파손되지 않는다는 것을 의미하지는 않습니다. 함수 인수에 대한 키워드 const은 함수가 해당 함수를 수정하거나 삭제하지 않는다는 것을 의미합니다 (const 인수를 수정하는 함수를 구현하면 컴파일러 오류가 발생 함). 그러나 함수가 외부에서 발생하는 것을 알 수있는 방법은 없습니다. .

관련 문제