우리가 비밀번호를 입력받고 입력받은 비밀번호가 너무 짧으면 logic_error예외를 던지도록 하고 그렇지 않으면 비밀번호를 암호화하는함수를 다음과 같이 만들었다고 하자
#include<iostream>
#include<string>
using namespace std;
enum{MinimumPasswordLength = 8};
string encryptPassword(const string& password)
{
string encrypted; //<--이거
if (password.length() < MinimumPasswordLength)
throw logic_error("password is too short");
//주어진 비밀번호를 암호화하여 encrypted
//변수에 넣는 데 필요한 일들을 여기서 한다..
return encrypted;
}
이렇게 되면 예외가 던저지게 된다면 encrypted변수가 사용되지 않음에도 위에 선언되어있다 그렇게 되면 string의 생성자, 소멸자가 낭비된것이다. 그렇기 떄문에 다음과 같이 바꾸면된다.
#include<iostream>
#include<string>
using namespace std;
enum { MinimumPasswordLength = 8 };
string encryptPassword(const string& password)
{
if (password.length() < MinimumPasswordLength)
throw logic_error("password is too short");
//주어진 비밀번호를 암호화하여 encrypted
//변수에 넣는 데 필요한 일들을 여기서 한다..
string encrypted;
return encrypted;
}
그런데 이렇게 한다고 해도 뭔가 헐렁헐렁하다 라고 생각한 이유는 생성자를 이용하지않아서이다
#include<iostream>
#include<string>
using namespace std;
enum { MinimumPasswordLength = 8 };
void encrypt(string& password) {}//string객체를 여기서 그냥 암호화
string encryptPassword(const string& password)
{
if (password.length() < MinimumPasswordLength)
throw logic_error("password is too short");
string encrypted(password);
encrypt(encrypted);
return encrypted;
}
이렇게 하면은 된다. 아에 처음부터 복사생성자를 호출하여 값을 복사한 후 연산 후 리턴하는것이다.
이번에는 루프를봐보자 A라는 방법과 B라는 방법이 있는데 A->B순으로 보겠다.
int _tmain() //A방법
{
Widget w;
for (int i = 0; i < n; i++)
w = i;
}
int _tmain() //B방법
{
for(int i=0;i<n;i++)
Widget w(i);
}
A방법은 생성자n번 + 소멸자n번
B방법은 생성자 1번 + 소멸자 1번 + 대입 n번
위의 방법 중 대입이 생성자, 소멸자 쌍보다 비용이 덜들고 전체코드에서 수행성능에 민감한 부분을 건드는 중이라면 A를 선택하고 그걱이 아니라면 B를 선택하면된다.
이것만은 잊지 말자!
1. 변수 정의는 늦출 수 있을 때까지 늦추자. 프로그램이 더 깔끔해지며 효율도 좋아진다.