티스토리 뷰

프로그래밍/관리C++

클래스

에어버스 2018. 5. 1. 11:38

double pi = 3.14; // pi는 Stack에 저장

int^ lucky = gcnew int(7); // lucky는 핸들이며 7은 Heap에 저장된다.

double^ two = 2.0; // two는 핸들이며 2.0은 Heap에 저장된다. 0x588538c
double^ d = gcnew double(3.0); // 3.0 은 Heap 에 저장된다. 0x588539c
two 와 d 는 같은 주소공간에 있으므로 two 가 Heap 에 할당됨을 알 수 있다.

클래스 Class

- friend 지원 안함.
- 네이티브C++ 배열 또는 네이티브C++ 클래스 형식의 멤버 변수를 가질 수 없다.
- 값 클래스 또는 참조 클래스는 비트 멤버 변수를 가질 수 없다.
- 멤버 한수들은 const 로 선언될 수 없다.
- 값 클래스 형식 T에 대한 비정적 함수 멤버 안에 있는 this 포인터는 interior_ptr<T> 형식의 인테리어 포인터
- 참조 클래스 형식 T 안에 잇는 this 포인터는 T^ 형식의 핸들이다. 

1. 값 클래스

value class / valur struct

- Stack에 할당
- gcnew 연산자로를 사용하여 값 클래스를 Heap 에 만들 수 있다.
- Heap에 할당된 값 클래스 형식을 참조할때는 추적 핸들을 사용한다.

리터럴 필드 : 변수를 initonly 로 선언하여 상수로 만든다.

2. 참조 클래스

ref class / ref struct

- 네이티브C++ 기능과 유사
- 기본 복사 생성자 또는 기본 할당 연산자가 없어, 필요하면 추가해야 한다.

 3. 클래스 속성 (property)

- 속성은 멤버 변수처럼 접근할 수 있는 값 클래스 또는 참조 클래스의 멤버이지만 필드는 아니다.
하나의 속성은 get()/set() 접근자 함수를 가지고 각각의 값을 검색하거나 설정한다.
속성값을 구하기 위해 속성 이름을 사용할때, 그 속성의 get()함수를 호출하고, 할당문의 왼쪽 속성의 이름을 사용할때는 set() 함수를 호출하게 된다.

- 스칼라 속성

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
value class Length
{
    private:
        int feet;
        int inches;
    public:
        property int meters // 속성
        {
            int get()
            {
                return feet;
            }
            void set(int a)
            {
                feet = a;
            }
        }
...
};
 
int main(array<System::String ^> ^args)
{
    Length len = Length(69);
    Console::WriteLine("{0}", len.meters); // get() 호출
    len.meters = 3// set() 호출
    Console::WriteLine("{0}", len.meters); // get() 호출
...
}
cs

 

- 인덱싱 속성 (배열)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
value class Length
{
    private:
        array<int>^ feet;
    public:
        Length(...array<int>^ a) : feet(a) {}
        property int default[int]
        {
            int get(int index)
            {
                if(index >= feet->Length)
                    throw gcnew Exception(L"Index out of range");
                return feet[index];                
            }
        }
...
};
 
int main(array<System::String ^> ^args)
{
    Length^ len = gcnew Length(1020304050);
    Console::WriteLine(L"{0}, {1}", len[1], len[2]);
...
}
cs

실행결과>

만약, 위 인덱싱 속성 소스의 7행의 default 을 아래 1행 처럼 바꾸면 배열 접근 22행을 아래 3행처럼 해야 한다.

1
2
3
    property int meters[int]
 
    Console::WriteLine(L"{0}, {1}", len->meters[1], len->meters[2]);
cs
2. 연산자 오버로딩

실행 결과는 위와 같다.

 

10행의 initolny 는 상수로 만든다. 네이티브의 const 와 같음

override 는 함수명 뒤에 온다.

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
#include "stdafx.h"
using namespace System;
 
value class Length
{
    private:
        int feet;
        int inches;
    public:
        static initonly int inchesPerFoot = 12// 상수화 (리터럴 필드)
        Length(int ft, int ins) : feet(ft), inches(ins) {}
        
        virtual String^ ToString() override // 재정의
        {    return feet + L" feet " + inches + L"inches";     }
 
        Length operator+(Length len)
        {
            int inchTotal = inches + len.inches + inchesPerFoot * (feet * len.feet);
            return Length(inchTotal / inchesPerFoot, inchTotal % inchesPerFoot);
        }
};
 
int main(array<System::String ^> ^args)
{
    Length len1 = Length(69);
    Length len2 = Length(78);
    Length len3 = len1 + len2;
 
    Console::WriteLine(L"{0}", len1.ToString());
    Console::WriteLine(L"{0}", len2.ToString());
    Console::WriteLine(L"{0}", len3.ToString());
    Console::ReadKey();
    return 0;
}
cs

실행결과>

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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