How We Coding

출처 : http://kks227.blog.me/60204955407



(1) namespace, using, ::


- C++ 에서 새로 도입된 개념인 이름공간(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
30
31
#include <cstdio>
 
namespace ns {
    int n = 5;
    double f = 3.3;
    char c = 'G';
}
 
int k = 10;
 
int main()
{
    // n = 3; // Error
    ns::n = 3;
    printf("%d\n", ns::n);          // 3
 
    int n = 5;
    printf("%d %d\n", n, ns::n);    // 5 3
 
    using ns::f;
    using ns::c;
    //using ns::n;
    printf("%lf %c\n", f, c);       // 3.300000 G
 
    using namespace ns;    // directive
    
    printf("%d %lf %c\n", n, f, c); // 5 3.300000 G
 
    int k = 3;
    printf("%d %d\n", k, ::k);      // 3 10
}
cs


>> 3 : ns 라는 이름공간 생성

>> 13 : n 은 메인함수에서 선언되지 않은 변수 이므로 에러

>> 18 : main() 의 n 과 ns 라는 이름공간의 n

>> 20, 21 : 이름 공간의 변수를 이름공간을 생략하고 사용할 수 있다. (using 키워드 사용)

>> 22 : 이미 같은 이름의 변수가 지역적으로 선언되어 있으면, 컴파일 에러 발생

error: target of using declaration conflicts with declaration already in scope


>> 25 : 이름공간 ns 에 있는 변수들을 ns:: 없이 사용 가능.

     다만 이미 선언되어 있는 변수의 경우 무시되는 듯 하다. 27에서 n 의 값은 main() 스코프의 n.

>> 30 : ::k 는 전역번수 k  



(2) 여러개의 네임스페이스


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
#include <cstdio>
 
namespace ns1 {
    int n = 11;    
}
 
namespace ns2 {
    int n = 22;
}
 
namespace ns3 {
    int n = 33;
    namespace ns4 {
        int n = 44;
    }
}
 
int main()
{
    printf("%d %d\n", ns1::n, ns2::n);  // 11 22
 
    /*
    using ns1::n;
    using ns2::n;
    printf("%d\n", n);    // error!!
    */
 
    {
        using namespace ns1;
        printf("%d\n", n);              // 11
    }
    
    {
        using namespace ns2;
        printf("%d\n", n);              // 22
    }
 
    printf("%d %d\n", ns3::n, ns3::ns4::n);     // 33 44
 
    return 0;
}








cs


>> 26 : n 이 어디소속인지 알 수 없으므로 에러.

>> 29 ~ 37 : 이런식으로 스코프를 중괄호를 만들어 주고, 그 안에서 독자적으로 특정 네임스페이스를 사용하는 방법도 있다고 한다.

>> 12 ~ 17, 39 : 네임스페이스 안에 네임스페이스



(3) 이름없는 네임스페이스, 네임스페이스 안의 함수


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
#include <cstdio>
 
namespace {
    int n=4;
}
 
// n = 8; error!!
 
int func() { return n; }
 
namespace ns {
    void func();
}
 
 
int main()
{
    printf("%d\n", n);          // 4
 
    n = 8;
    printf("%d\n", n);          // 8
 
    printf("%d\n", func());     // 8
 
    ns::func();        // called ns::func()
 
    using ns::func; // not using ns::func();
    func();
 
    return 0;
}
 
namespace ns {
    void func() {
        puts("called ns::func()");
    }
}
 
cs


>> 3 : 이름없는 네임스페이스 선언

>> 18 : ::와 같은 연산자 없이 바로 사용 가능.

>> 7 : 하지만 전역 지역에서는 사용 불가.

>> 9 : 이와 같이 어떤 지역 스코프 안에서 사용 가능.


>> 12, 25 : 변수를 선언하고 사용하는것과 비슷하다.

>> 27 : using 키워드를 사용할 때는 using 네임스페이스명::함수이름; 의 형태로 써야한다. 

>>        using ns::func(); 는 잘못된 형태이다.

>> 33 : 프로토타입만 선언 후 나중에 따로 정의를 해도 된다.






'Language > C++' 카테고리의 다른 글

<2> 레퍼런스 (reference)  (0) 2018.02.12
<1> C++ 에서 확장된 기능  (0) 2018.02.12

- C언어에서는 다른 함수에있는 변수에 접근하기 위해 포인터를 사용했다.

- C++ 에서는 레퍼런스 라는 것을 통해 가능하다.



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
#include <cstdio>
 
typedef struct arr100 {
    int arr[100];
} Arr100;
 
void c_Swap(int *a, int *b)
{
    int t = *a;
    *= *b;
    *= t;
}
 
void ref_Swap(int &a, int &b)
{
    int t = a;
    a = b;
    b = t;
}
 
int sum(Arr100 &t) // Decreasing memory overhead.
{
    int Sum=0;
    for(int i=0; i<100; i++)
        Sum += t.arr[i];
    return Sum;
}
 
int main()
{
    int x = 3;
    int y = 5;
 
    // int &ref; => impossible
    // &ref = x; => impossible
    int &ref = x; 
    printf("%d %d\n", x, ref);      // 3 3
    printf("%p %p\n"&x, &ref);    // 0x7ffee122ca68 0x7ffee122ca68
 
    c_Swap(&x, &y);
    printf("%d %d\n", x, y);        // 5 3
 
    ref_Swap(x, y);
    printf("%d %d\n", x, y);        // 3 5
 
        
    Arr100 A;
    for(int i=0; i<100; i++)
        A.arr[i] = 100-i;
 
    int Sum = sum(A); 
    printf("%d\n", Sum);        // 5050
 
    return 0;
}
 
cs


>> 34 : 선언과 동시에 초기화가 필요하다.

>> 35 : 한번 가리킨 대상을 바꿀 수 없다.

>> 36 : 레퍼런스의 선언. 변수이름 앞에 &를 붙인다. 

     자료형 &변수명 = 참조할 변수명; 의 형태를 가진다.

>> 37 : x와 x를 reference 로 하는 ref 는 같은 값을 갖는다.

>> 38 : 역시 같은 주소를 갖는다. 즉 어떤 변수에 새로운 이름을 부여한다고 생각하면 된ㄷ

>> 40 : c 언어에서의 swap 함수이다. 포인터를 사용

>> 43 : 레퍼런스를 이용한 swap 으로, 매개변수를 전달할 때 주소를 전달하지 않으며,

            14 라인에서 보듯이 매개변수를 참조형으로 선언해서 전달받는다.

>> 51, 21 :  이렇게 참조형으로 매개변수를 전달 받으면, 메모리 오버헤드를 줄일 수 있다. 

  매개변수도 일종의 지역변수 이므로 그만큼의 메모리를 차지하지만, 참조형으로 전달 

  받으면 그렇지 않다. 재귀함수에서 변하지 않는 객체를 넘길 경우에서 유용하다.



- 그 외 상수값으로 초기화 할 수 없다. 바인딩을 할 수 없다는 컴파일 에러 발생


1
int &refConstant = 10;
cs


error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'

    int &refConstant = 10;



- 그 외 레퍼런스로 이루어진 배열을 만들 수 없다고 한다.



- 기본적인 내용은 이정도 이며, 나중에 참조형이 참 재미있는(?) 기능임을 알게 될 것이다. 

  (함수의 리턴형이 참조형인 경우)



- 또한, 래퍼런스의 필요성은 [] 등 오퍼레이터 오버로딩에서 나타난다고 한다.

  *vec[10] = 3; 같은 이상한 표현을 쓰지 않아도 된다고 하는데, 

  이 글을 작성하고 있는 시점에서 아직 은 모르는 내용이다.....



- '레퍼런스로 이루어진 배열'(int &arr[10])은 만들 수 없지만, '배열의 레퍼런스'(int (&arr)[10])은 

   만들 수 있다고 한다.. 함수의 인자로 넘겨서 항상 특정 길이를 가진 배열만을 받게 할 수도 있지만, 

  그러느니 그냥 std::array나 std::vector 쓰는 게 낫다고 함.




출처 : http://kks227.blog.me/60204949464


'Language > C++' 카테고리의 다른 글

<3> namespace (네임스페이스)  (0) 2018.02.22
<1> C++ 에서 확장된 기능  (0) 2018.02.12

- 변수를 생성과 동시에 초기화 하는 방법 추가.


1
2
3
4
5
int a = 5;
int a(5);
 
int a=2, b=3;
int a(2), b(3);
cs


>> 모든 자료형에 적용 가능.

>> 배열은 초기화 방법이 다르므로 이런식으로는 불가능



- for 문의 초기식에서 변수 선언 가능


1
2
for(int i=0; i<n; i++)
    scanf("%d"&k);
cs


>> 여기서 i 의 스코프(scope)는 해당 for 문의 안쪽이 된다.



- bool 타입의 자료형 추가.


1
2
bool isTrue = true;
bool isFalse = false;
cs



- 형변환(type casting) 의 추가.


1
2
3
4
5
double d = 3.14;
int n = (int)d;
 
double f = 3.141592;
int k = static_cast<int>(f);
cs


>> static_cast<자료형>(값) 의 형태를 가지고 있다.


>> 용도는 추후 포스팅..



- c 언어의 헤더파일 사용방법


1
2
3
4
5
#include <stdio.h> // C 
#include <stdlib.h> // C
 
#include <cstdio> // C++
#include <cstdlib> // C++
cs


>> 뒤의 .h 를 없애고, 앞에 c를 붙인다.





출처 : http://kks227.blog.me/60204924344


'Language > C++' 카테고리의 다른 글

<3> namespace (네임스페이스)  (0) 2018.02.22
<2> 레퍼런스 (reference)  (0) 2018.02.12