1. 멤버 함수의 파라미터에 default value 를 이용하고자 한다면 형선언 부분에만 넣어주고 구현 부분에는 넣지 않는다.
(예)
class testClass
{
private:
void print(const char* message, ostream& outputStream = cerr) const;
};
void testClass::print(const char* message, ostream& outputStream) const
{
outputStream << message;
}
2. fprintf처럼 화면에 출력할 건지 파일로 출력할 건지를 선택하여 출력하는 인자가 c++에도 있다. 바로 ostream 이란 녀석인데 이 인자로 cout 이나 cerr 를 전달하면 화면에 출력할 것이고 ofstream 으로 규정한 인자를 넘긴다면 그에 해당하는 파일로 출력될 것이다. 아래의 예제는 이 속성을 이용한 한가지 예이다. 응용해서 써보도록 하자.
(예) 위의 1번 예제에서 구현한 testCase를 참조해 보자.
int main()
{
testClass test;
ofstream fpout;
fpout.open("output.txt");
test.print("Screen output"); // use default value. It will show message into screen
test.print("Screen output", cerr); // It will also show the message into screen
test.print("File output", fpout); // it will show the message into output.txt file
}
3. 생성자에 키워드 explicit 를 써준경우 =을 이용한 자동 생성자 호출을 방지하고(암시적 변환) 명시적으로 선언된 경우만 허용한다.
(예)
class test_one
{
public:
test_one(){};
test_one(double a){};
~test_one(){};
};
class test_two
{
public:
test_two(){};
explicit test_two(double a){};
~test_two(){};
};
void foo(test_one var)
{
cout << "foo is called" << endl;
}
void foo2(test_two var)
{
cout << "foo2 is called" << endl;
}
int main()
{
test_one t1_1;
test_one t1_2(300); // 명시적 생성자. 사용가능
test_one t1_3 = 200; // 암시적 생성자. 사용가능
t1_2 = 2.0; // 암시적 생성자. 사용가능
foo(3.0) // 암시적 생성자가 가능한 test_one 인자가 호출됨.
// 화면에는 "foo is called"라고 출력됨
test_two t2_1;
test_two t2_2(300); // 명시적 생성자. 사용가능
test_two t2_3 = 200; // 암시적 생성자. 사용불가. compile error발생.
test_two t2_2 = 2.0; // 암시적 생성자. 사용불가. compile error 발생.
}
(예)
class testClass
{
private:
void print(const char* message, ostream& outputStream = cerr) const;
};
void testClass::print(const char* message, ostream& outputStream) const
{
outputStream << message;
}
2. fprintf처럼 화면에 출력할 건지 파일로 출력할 건지를 선택하여 출력하는 인자가 c++에도 있다. 바로 ostream 이란 녀석인데 이 인자로 cout 이나 cerr 를 전달하면 화면에 출력할 것이고 ofstream 으로 규정한 인자를 넘긴다면 그에 해당하는 파일로 출력될 것이다. 아래의 예제는 이 속성을 이용한 한가지 예이다. 응용해서 써보도록 하자.
(예) 위의 1번 예제에서 구현한 testCase를 참조해 보자.
int main()
{
testClass test;
ofstream fpout;
fpout.open("output.txt");
test.print("Screen output"); // use default value. It will show message into screen
test.print("Screen output", cerr); // It will also show the message into screen
test.print("File output", fpout); // it will show the message into output.txt file
}
3. 생성자에 키워드 explicit 를 써준경우 =을 이용한 자동 생성자 호출을 방지하고(암시적 변환) 명시적으로 선언된 경우만 허용한다.
(예)
class test_one
{
public:
test_one(){};
test_one(double a){};
~test_one(){};
};
class test_two
{
public:
test_two(){};
explicit test_two(double a){};
~test_two(){};
};
void foo(test_one var)
{
cout << "foo is called" << endl;
}
void foo2(test_two var)
{
cout << "foo2 is called" << endl;
}
int main()
{
test_one t1_1;
test_one t1_2(300); // 명시적 생성자. 사용가능
test_one t1_3 = 200; // 암시적 생성자. 사용가능
t1_2 = 2.0; // 암시적 생성자. 사용가능
foo(3.0) // 암시적 생성자가 가능한 test_one 인자가 호출됨.
// 화면에는 "foo is called"라고 출력됨
test_two t2_1;
test_two t2_2(300); // 명시적 생성자. 사용가능
test_two t2_3 = 200; // 암시적 생성자. 사용불가. compile error발생.
test_two t2_2 = 2.0; // 암시적 생성자. 사용불가. compile error 발생.
}
'Programming > C & C++' 카테고리의 다른 글
#define 에 관한 작은 사실하나 (0) | 2009.01.09 |
---|---|
Memory Leak 체크하기 (Linux) (1) | 2008.11.20 |
C++ Casting 관련 (it needs code test) (2) | 2008.09.17 |
Implementation시 자주 하는 실수들 (0) | 2008.09.02 |
Class 내의 const static 멤버의 초기화 위치 - 출처 : 채현님 블로그 (4) | 2008.07.07 |
댓글