변수의 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자.
비밀번호가 충분히 길 경우에 해당 비밀번호를
암호화하여 반환하는 함수가 있다.
![]()
string encryptPassword ( const string& password){
string encrypted; // 1번
if(password.length() < MinimumPasswordLength) {
throw logic_error ("Password is .... ");
}
//2번 string encryped
... // 암호화 진행부분
return encrypted;
}
1번의 경우 encryped 객체는 길이 점검에서 예외가 던져지게 되면
안 쓰여질 확율이 있다. 따라서 불필요한 생성자 소멸자
비용을 지불하게 된다. 2번의 경우는 위와 같은 불필요한
비용을 지불하진 않지만 기본생성자가 호출된 후에
또 다시 대입을 해야하는 구조이기 때문에 여전히
비용에 대해 자유로울 수 없다.
![]()
void encrypt(string &s);
위 함수에서 암호화를 진행한다고 할 때
string encryptPassword ( const string& password){
if(password.length() < MinimumPasswordLength) {
throw logic_error ("Password is .... ");
}
string encrypted(password);
encrypt(encrypted);
return encrypted;
}
![]()
encrypted가 생성될 때 매개변수로 들어온
password로 초기화가 되고 있다.
변수의 정의를 늦줘서 기본생성자 호출
그리고 대입에 대한 불필요한 비용을
최소화 하고 있다.
루프에 대해선 어떻게 해야 할까?
1번.
widget w;
for( ... ){
w = i;
}
2번.
for( ... ){
widget w(i);
}
1번의 경우 생성자와 소별자가 1번씩 호출되며
대입이 여러번 일어나고 있다. 2번의 경우에는
생성자와 소멸자의 호출이 여러번 일어나고 있다.
![]()
대입에 들어가는 비용이 생성자 소멸자 쌍보다
적게나오는 경우 1번 방법이 좋다. 하지만 A는
w의 유효범위가 넓어지기 때문에 프로그램의
이해도와 유지보수성이 역으로 안좋아질 수 있다.
![]()
POINT!!
변수 정의는 늦출 수 있을 때까지 늦추자.
'C++ 심화' 카테고리의 다른 글
| [C++] 인터페이스 상속과 구현 상속의 차이(1) (0) | 2017.02.20 |
|---|---|
| [C++] 객체에 대한 핸들 반환 (0) | 2017.01.06 |
| [C++] 멤버 함수 보다는 비멤버 비프렌드 함수 (0) | 2017.01.02 |
| [C++] 데이터 멤버의 선언 (0) | 2016.12.29 |
| [C++] 함수에서의 객체 참조자 반환 (0) | 2016.12.28 |