이 함수는 주어진 밀번호 password 가 충분히 길 경우에 해당 비밀번호를 암호화하여 반환하는 함수이다.
비밀번호가 너무 짧으면 logic_ error 타입의 예외를 던지도록 만들어졌다.
std : :string encryptPassword(const std : :string& password)
{
using namespace std;
string encrypted ;
if (password.length() < MinimumPasswordLength) {
throw logic_ error( "Password is too short " ) ;
}
... //주어진 비밀번호를 암호화하여 encrypted
//변수에 넣는 데 필요한 일들을 여기서 합니다.
return encrypted;
}
위와 같이 string 객체를 예외문보다 앞에서 생성해버리면 예외가 발생하는 경우 이 변수는 쓰이지도 않으면서 생성하는 것이 된다.
아무 쓸모도 없이 생성과 소멸비용을 내야하는 것이다. --> 변수가 꼭 필요할 때까지 정의를 미뤄야 한다.
std : :string encryptPassword(const std : :string& password)
{
using namespace std;
if (password.length() < MinimumPasswordLength) {
throw logic_ error( "Password is too short " ) ;
}
string encrypted ;
... //주어진 비밀번호를 암호화하여 encrypted
//변수에 넣는 데 필요한 일들을 여기서 합니다.
return encrypted;
}
이와 같이 표현했을 때, 항상 필요할때 생성이 된다. 하지만, 초기화의 관점에선 어떨까.
변수를 사용할때 분명이 대입연산이 일어날텐데, 그럼 현재 기본생성자가 필요도 없이 실행되고, 그다음에 대입 연산이 일어나게 되므로 비효율이 발생한다. --> 정의시에 필요한 값으로 바로 초기화해버린다.
std : :string encryptPassword(const std : :string& password)
{
using namespace std;
if (password.length() < MinimumPasswordLength) {
throw logic_ error( "Password is too short " ) ;
}
string encrypted(password);
... //주어진 비밀번호를 암호화하여 encrypted
//변수에 넣는 데 필요한 일들을 여기서 합니다.
return encrypted;
}
루프문에서는 어떨까?
두가지가 있다.
- A 방법 생성자 1번 + 소멸자 1번 + 대입 n번
Widget w ;
for (int i = 0 ; i < n ; ++i) {
w = ...
}
for (int i = 0 ; i < n ; ++i) {
Widget w(...);
}
A가 당연히 훨씬 빠를것 같은데..
그렇지도 않은지 A가 빠른경우가 아니면 B를 써서 scope를 while문 안으로 해서 Widget의 의미가 명확해지게 하라고 한다..