본문 바로가기
C++ 200제/코딩 IT 정보

[MFC 기초 강좌] C++ 프로그래머 11개 코딩 프로그래밍 팁

by vicddory 2017. 2. 15.

[MFC 기초 강좌] C++ 프로그래머 11개 코딩 프로그래밍 팁 


1. Parameter Default


1
2
3
4
int parameterDef(int nNum = 5)
{
    return nNum;
}
cs


위와 같은 함수가 있을 때, parameterDef()와 parameterDef(5)는 같은 의미.


2. 메모리 공간 영역


  • 코드 영역 - 사용자가 코딩한 내용이 저장
  • 데이터 영역 - 프로그램 종료 이전까지 지워지지 않을 데이터가 저장
  • 스택 영역 - 매개변수, 지역변수 등 유동적인 변화가 발생한 것들을 다루는 영역
  • 힙 영역 - 원하는 시점에 메모리를 할당/해제할 수 있는 영역



3. Const


함수에서도 const를 사용해서 참조자를 보다 완벽하게 사용할 수 있습니다.


1
2
3
4
5
int RefFunc(const int &ref)
{
    ref++// 에러
    return ref; 
}
cs


그리고 객체를 const화 할 수 있습니다.


.....

const Simple obj(7);

.....


4. 인라인 함수의 정의 위치


인라인 함수는 반드시 헤더 파일에 정의되어 있어야 합니다.


"컴파일 과정에서 함수의 호출문이 있는 곳에 함수의 몸체 부분이 삽입되어야 하므로!"



코딩 개발 팁 MFC C++[C++ 프로그래머 코딩 팁]



5. 접근 제한


"제한된 방법으로의 접근만 허용해서 잘못된 값이 저장되지 않도록 도와야 하고, 또, 실수했을 때, 실수가 쉽게 발견되도록 해야 한다"


"멤버 변수를 private로 선언하고, 해당 변수에 접근하는 함수를 별도로 정의해서, 안전한 형태로 멤버 변수의 접근을 유도하는 것이 바로 '정보은닉'이며, 이는 좋은 클래스가 되기 위한 기본조건이 된다!"


public - 어디서나 접근

private - 클래스 내부에서만 접근

protected - 유도 클래스에서만 접근(상속)


"기초 클래스와 이를 상속하는 유도 클래스 사이에서도 정보 은닉은 지켜주는 것이 좋다"


6. Static 멤버 함수


"static 멤버 함수 내에서는 static 멤버 변수와 static 멤버 함수만 호출이 가능하다"


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
class SoSimple
{
private:
    int num1;
    static int num2;
 
public:
    SoSimple(int n) : num1(n) { }
 
    static void Adder(int n)
    {
        //num1 += n; 에러
        num2 += n;
    }
};
 
int main(void)
{
    //int SoSimple::num2 = 0; 에러
 
    return 0;
}
 
cs

7. 연산자 오버로딩 주의 사항


본래의 의도를 벗어난 형태의 연산자 오버로딩은 좋지 않다. 예를 들어, Point 객체 po1과 po2가 있을 경우 po1 + po2는 옳지 않다. 연산자의 우선순위와 결합성은 바뀌지 않는다. 매개변수의 디폴트 값 설정이 불가능하다(디폴트는 디폴드, 설정은 안 된다).


『연산자의 순수 기능까지 빼앗을 수는 없다. 예를 들어, 아래의 함수는 정의가 불가능하다.


1
2
3
4
int operator+(const int num1, const int num2)
{
    return num1 * num2; 
}
cs


MFC C++ 프로그래머 코딩[C++ 프로그래머에게 필요한 코딩 개발 팁]


8. 함수 템플릿과 템플릿 함수


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//함수 템플릿(Function Template)
template <typename T>
 
T Add(T num1, T num2)
{
    return num1 + num2;
}
 
//템플릿 함수(Template Function)
int Add<int>(int num1, int num2)
{
    return num1 + num2;
}
 
double Add<double>(double num1, double num2)
{
    return num1 + num2; 
}
cs


다른 말로, 템플릿 함수는 생성된 함수(Generated Function)라고도 불립니다.


9. 템플릿 static 멤버 변수 초기화


1
2
3
4
5
template <typename T>
T SimpleStaticMem<T>::mem = 0;
 
template <>
long SimpleStaticMem<long>::mem = 5;
cs


위의 소스는 멤버 변수를 초기화해주는 특수화를 나타냅니다.


10. 예외의 전달 방식에 따른 주의 사항


catch 블록이 두 개 이상일 경우 아래의 예를 따릅니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
using namespace std;
 
class AAA
{
public:
    void ShowYou() { cout<<"AAA exception!"<<endl; }
};
 
class BBB : public AAA
{
public:
    void ShowYou() { cout<<"BBB exception!"<<endl; }
};
 
class CCC : public BBB
{
public:
    void ShowYou() { cout<<"CCC exception!"<<endl; }
};
 
void ExceptionGenerator(int expn)
{
    if(expn == 1)
        throw AAA();
    else if(expn == 2)
        throw BBB();
    else
        throw CCC();;
}
 
int main(void)
{
    try
    {
        ExceptionGenerator(3);
        ExceptionGenerator(2);
        ExceptionGenerator(1);
    }
    catch(CCC& expn)
    {
        cout<<"catch(CCC& expn)"<<endl;
        expn.ShowYou();
    }
    catch(BBB& expn)
    {
        cout<<"catch(BBB& expn)"<<endl;
        expn.ShowYou();
    }
    catch(AAA& expn)
    {
        cout<<"catch(AAA& expn)"<<endl;
        expn.ShowYou();
    }
 
    return 0;
}
cs


상속을 통한 catch문 출력이라, 결과적으론 CCC 클래스의 ShowYou() 함수가 호출됩니다.


11. include 할 때, DOC와 VIEW의 위치


1
2
#include "TestDoc.h"
#include "TestView.h"
cs


출처 1 - 윤성우의 열혈강의 C++ 프로그래밍

출처 2 - [MFC] 간단하지만 중요한 사실 10가지 ( 팁 필수 자료) [클릭]

[MFC 기초 강좌] C++ 프로그래머 11개 코딩 프로그래밍 팁

댓글