'프로그래밍/C++11'에 해당되는 글 2건

  1. 2015.03.06 auto
  2. 2015.03.06 nullptr
posted by WizardMania 2015. 3. 6. 11:20

자바스크립트의 var와같은 자료형을 정하지않고 쓸수있다.

단 C++에서는 한번정해진 자료형은 변경은 불가능하다.

따라서 선언과 동시에 초기화가 되어야된다.

또한 자료형은 컴파일 타임에 정해지게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    // 상수대입가능, 해당 상수의 자료형으로 정해진다.
    auto a = 1;
    
    // 변수대입가능, 해당 변수의 자료형으로 정해진다.
    int i = 5;
    auto b = i;
 
    // 주소값 대입가능, 해당 변수의 포인터자료형으로 정해진다.
    auto c = &i;
 
    int* p = &i;
    auto d= p;
 
    // 레퍼런스 대입가능, 레퍼런스는 auto뒤에 &를 붙여야 한다.
    auto& e = i;
 
    return 0;
}
cs


위처럼 단순대입으로 사용할 일은 거의 없을것이다.

아마도 유용하게 사용될때가 STL을 사용할 때 일것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <vector>
 
int main()
{
    std::vector<int> vecTmp;
    vecTmp.push_back(1);
    vecTmp.push_back(2);
    vecTmp.push_back(3);
    vecTmp.push_back(4);
    vecTmp.push_back(5);
 
    // 반복자를 사용 모든요소 출력
    for (std::vector<int>::iterator iter = vecTmp.begin(); iter != vecTmp.end(); ++iter)
    {
        printf("%d \n"*iter);
    }
}
cs


위의 코드에서처럼 반복자(iterator)를 하나 쓸려면 적어야 할게 많다.

그래서 일반적으로 typedef를 많이 사용 했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <vector>
 
typedef std::vector<int> VEC_INT;
typedef VEC_INT::iterator VEC_INT_ITER;
 
int main()
{
    VEC_INT vecTmp;
    vecTmp.push_back(1);
    vecTmp.push_back(2);
    vecTmp.push_back(3);
    vecTmp.push_back(4);
    vecTmp.push_back(5);
 
    // 반복자를 사용 모든요소 출력
    for (VEC_INT_ITER iter = vecTmp.begin(); iter != vecTmp.end(); ++iter)
    {
        printf("%d \n"*iter);
    }
}
cs


아까보단 일이 줄어들었지만 typedef를 작성하는것도 불편한점은 존재한다.

auto를 이용한다면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <vector>
 
int main()
{
    std::vector<int> vecTmp;
    vecTmp.push_back(1);
    vecTmp.push_back(2);
    vecTmp.push_back(3);
    vecTmp.push_back(4);
    vecTmp.push_back(5);
 
    // 반복자를 사용 모든요소 출력, auto 사용    
    for (auto iter = vecTmp.begin(); iter != vecTmp.end(); ++iter)
    {
        printf("%d \n"*iter);
    }
}
cs

std::vector<int>::iterator 대신에 auto를 쓰는것만으로 해결이 된다.


STL을 자주사용하는 사람들에겐 아주 유용하게 쓰일것으로 보인다.

auto를 쓰면 자료형을 알기가 어렵지 않냐고 할수 있지만 visual studio에서 해당변수의 실제 자료형을 친절히 알려주기 때문에 큰문제는 없다.


MSDN

https://msdn.microsoft.com/ko-kr/library/6k3ybftz.aspx

'프로그래밍 > C++11' 카테고리의 다른 글

nullptr  (0) 2015.03.06
posted by WizardMania 2015. 3. 6. 10:10

기존 널포인터는 NULL을 사용했는데 일반적으로는 큰문제점이 없지만 실제적으로 #define NULL 0 으로 정의되어있었기 때문에 사실상 0이라는 정수형 이었다.


따라서 함수의 매겨변수로 NULL값자체를 넘긴다면 실제자료형은 int형으로 판단이 된다.

이런문제점들을 해결하기 위해 나온것이 nullptr 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void function(int a)
{
    printf("int \n");
}
 
void function(int* a)
{
    printf("int* \n");
}
 
int main()
{
    function(NULL);
    function(nullptr);
 
    return 0;
}
 
 
cs

결과값

int

int*


널포인터 형식을 좀더 명확하게 해주므로 NULL 대신에 nullptr 사용하는것이 좋을것 같음.


MSDN

https://msdn.microsoft.com/ko-kr/library/4ex65770.aspx




'프로그래밍 > C++11' 카테고리의 다른 글

auto  (0) 2015.03.06