티스토리 뷰

*extern

1
2
3
4
5
6
7
source.cpp
int source_val;
void  source_func();
 
main.cpp
extern int source_val;
extern void source_func();
cs

-static : 불가능

-c언어로 작성한 함수 : extern "C"

1
2
3
4
5
source.c
void function();

main.cpp 
extern "C" void function();


cs


*블록 내의 변수

1
2
3
4
5
6
7
int main()
{
    {
        int n = 100;
    }
    cout << n;
}
cs

n은 블록 내에서만 존재하기 때문에, 블록 외에서의 cout << n;는 오류가 발생시킵니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//전역변수
int x = 1;
int main()
{
    cout << x << endl;
    //지역변수
    int x = 2;
    cout << x << endl;
    {
        cout << x<<endl;
        //블록 내 변수
        int x = 3;
        cout << x<<endl;
    }
    cout << x << endl;
}
cs

1 2 2 3 2 라는 결과값을 출력합니다.


*static 

-지역 변수 : 프로그램이 종료될 때 까지 살아있습니다.

-전역 변수 : extern으로 접근할 수 없습니다.

*register

-메모리가 아닌 레지스터에 위치합니다.


*피연산자가 두개인 연산자

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
class Complex
{
private : 
    int real;
    int imag;
 
public:
    Complex(int real, int imag) {
        this->real = real;
        this->imag = imag;
    }
    Complex operator+(const Complex &com) {
        int r = this->real + com.real;
        int i = this->imag + com.imag;
 
        return Complex(r, i);
    }
};
 
int main()
{
    Complex c1(11);
    Complex c2(22);
    Complex c3 = c1 + c2;
    c3 = c1.operator+(c2);
}
cs

전치연산자, 후치연산자

1
2
3
4
5
6
7
8
9
10
11
12
    //전치
    Complex operator++() {
        this->real++;
        return *this;
    }
 
    //후치
    Complex operator++(int) {
        Complex prev(this->real, this->imag);
        this->real++;
        return prev;
    }
cs

멤버함수가 아닌 일반 함수의 연산자 오버로딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Complex operator+(Complex &left, Complex &right) {
    int r = left.real + right.real;
    int i = left.imag + right.imag;
 
    return Complex(r, i);
}
 
int main()
{
    Complex c1(11);
    Complex c2(22);
    Complex c3(00);
 
    c3 = c1 + c2;
    c3 = operator+(c1, c2);
}
cs

한쪽 피연산자만 클래스타입이면 일반함수를 사용!

showpos, noshowpos가 무엇일까

1
2
3
4
5
ostream & operator << (ostream &o, Complex &right) {
    o << right.real << showpos << right.imag << 'i' << noshowpos;
    return o;
cs


1
2
3
4
5
6
7
8
9
10
11
12
struct Func {
    void operator () () {
        cout << "객체 func 호출" << endl;
    }
};
 
int main()
{
    Func func;
    func();
    func.operator()();
}
cs

*const_cast, reinterpret_cast, static_cast

cosnt_cast : 포인터 형 혹은 레퍼런스 형에서 사용하며, const와 volatile 속성을 제거합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
constvolatile 속성의 제거
 const char *c_arr = "hello";
char *ptr = c_arr; 에러    
    char * ptr = const_cast<char *>(c_arr);
 
위험한 형변환
    int i = 65;
    int *int_ptr = &i;
    char *c_ptr = reinterpret_cast<char *>(int_ptr);
a에는 b의 주소값이 10진수로 변환되어 들어감
    int a = 1, b = 2;
    a = reinterpret_cast<int>(&b);
 
묵시적 형변환과 유사
    double d = 66;
    char c = static_cast<char>(d);
cs

static_cast는 void 포인터를 형변환시켜줄 수는 있지만, 다른 타입에 대해서는 형변환 시켜주지 않습니다.

1
2
3
4
    void *void_ptr = &d;
    double *d_ptr = &d;
    char *= static_cast<char *>(void_ptr);
    char *= static_cast<char *>(d_ptr); 에러
cs


*dynamic_cast

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
class GrandParent
{
public :
    virtual void Func() {};
};
 
class Parent : public GrandParent
{
};
 
class Child : public Parent
{
};
 
int main()
{
    GrandParent *gp1 = new Child;
    GrandParent *gp2 = new GrandParent;
 
    Child *cp1 = dynamic_cast<Child *>(gp1); 성공
    Child *cp2 = dynamic_cast<Child *>(gp2); 실패 NULL 반환
 
    
    try {
        Child &cref = dynamic_cast<Child &>(*gp2);
bad_cast 발생
    }
    catch (bad_cast &e) {
        cout << e.what()<<endl;
    }
}
cs


*Class->int, int->Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class GrandParent
{
private :
    int val1;
    int val2;
public :
    GrandParent(int v) { val1 = v; }
    virtual void Func() {};
    operator int()
    {
        return this->val1;
    }
 
    GrandParent(int i) : val1(i), val2(0) {};
};
 
int main()
{
    GrandParent G(10);
    int i = G;
    int n = 10;
    G = 10// G(10,0);
}
cs


*namespace

여러 파일에 하나의 namespace가 올 수 있습니다.

namespace의 이름이 없으면 다른 파일에서 사용할 수 없습니다.

namespace 내에 또다른 namespace를 만들 수 있습니다.

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
using namespace Animal::Cat;
namespace Animal {
    namespace Dog
    {
        struct Info {
            char *name;
            int age;
        };
 
        Info dogs[20];
        int count;
        void CreateAll() {};
    }
 
    namespace Cat
    {
        class Info
        {
        public:
            void Meow();
        protected:
            char name[20];
        };
        Info cats[20];    // 야옹이 리스트
        int count;    // 전체 야옹이 들의 수
        void CreateAll() {};    // 모든 야옹이 생성 함수
    }
}
namespace A = Animal;
cs


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