728x90

새로운 자료형 bool


c++에서 true와 false는 참,거짓 의미하는 1바이트 data

#include <iostream>
using namespace std;

int main(void)
{
	int num = 10;
	int i = 0;

	cout << "true: " << true << endl;	// true는 참을 의미하는 1바이트 data지만 정수로 변환되어 1 출력
	cout << "false: " << false << endl;	// 정수로 변환되어 0 출력

	while (true)
	{
		cout << i++ << ' ';
		if (i>num)
			break;
	}
	cout << endl;

	cout << "sizeof 1: " << sizeof(1) << endl;			// 정수 1, 0과는 다름 개념임을 보여줌
	cout << "sizeof 0: " << sizeof(0) << endl;
	cout << "sizeof true: " << sizeof(true) << endl;	// true와 false는 참,거짓 의미하는 1바이트 data
	cout << "sizeof false: " << sizeof(false) << endl;
	return 0;
}


Output:

1
2
3
4
5
6
7
true: true
false: false
0 1 2 3 4 5 6 7 8 9 10 
sizeof 1: 4
sizeof 0: 4
sizeof true: 1
sizeof false: 1



true와 false는 bool type data

bool type 변수는 true와 false정보를 저장 가능



#include <iostream>
using namespace std;

int main()
{
	int num;
	bool height;

	cout << "당신의 키 입력(cm) : ";
	cin >> num;

	if (num > 180) height = true;
	else height = false;

	cout << boolalpha;	// bool 변수의 값을 1과 0 대신에 true와 false로 출력하도록 함
	cout << "키가 180이 넘는가? " << height << endl;

	return 0;
}


Output :

당신의 키 입력(cm) : 175

키가 180이 넘는가? false



Reference (참조자)

변수는 할당된 메모리 공간에 붙여진 이름이며, 그 이름을 통해 해당 메모리 공간에 접근이 가능


int num1=2010;


위의 변수 선언으로 2010으로 초기화된 메모리 공간에 num1이라는 이름이 붙게 됨


int &num2=num1;


위에서 num2앞에 붙은 &연산자는 참조자의 선언을 뜻하며, 변수 num1에 대한 참조자 num2를 선언해라는 의미.


이 결과, num1이라는 이름이 붙은 메모리 공간에 num2이라는 이름이 더 하나 붙게 됨


num2=3047;


위 문장으로 인해 num1, num2라는 이름이 붙은 메모리 공간에 3047이 저장됨


- 관련 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

int main()
{
	int num = 10;
	int &ref = num;

	ref = 20;
	cout << "val : " << num << endl;
	cout << "ref : " << ref << endl;

	cout << "val : " << &num << endl;
	cout << "ref: " << &ref << endl;

	return 0;
}


Output:

1
2
3
4
val : 20
ref : 20
val : 0xfff84d48
ref: 0xfff84d48


변수 num과 참조자 ref가 동일한 메모리 공간을 참조하게 되며 주소값도 같음을 알 수 있다.


참조자의 수에는 제한이 없으며, 참조자를 대상으로 참조자를 선언하는 것도 가능



참조자의 선언 가능 범위


참조자는 변수에 대해서만 선언 가능. (배열이 아닌 배열요소도 변수로 간주)

선언과 동시에 누군가를 참조해야 함.


int &ref=20;    (x)

상수를 대상으로 참조자 선언 불가


int &ref;    (x)

미리 참조자를 선언후, 후에 누군가를 참조하는 것도 불가


int &ref=NULL;    (x)

NULL 초기화 불가



배열 요소(배열이 아님)를 대상으로 참조자 선언 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main()
{
	int arr[3] = { 1,2,3 };
	int &ref1 = arr[0];
	int &ref2 = arr[1];
	int &ref3 = arr[2];

	cout << ref1 << endl;
	cout << ref2 << endl;
	cout << ref3 << endl;

	return 0;
}


Output:

1
2
3
1
2
3


다음과 같이 포인터 변수를 대상으로 참조자 선언 가능

#include <iostream>
using namespace std;

int main()
{
	int num = 12;
	int * ptr = &num;
	int ** dptr = &ptr;

	int &ref = num;
	int * (&pref) = ptr;
	int ** (&dpref) = dptr;

	cout << ref << endl;
	cout << * pref << endl;
	cout << ** dpref << endl;

	return 0;
}


Output:

1
2
3
12
12
12



다음의 함수 정의는 Call-by-value도 될수 있고 Call-by-reference도 될 수 있다.

int * SimpleFunc(int * ptr)

{

. . . .

}


다음과 같이 정의되면 Call-by-value

int * SimpleFunc(int * ptr)

{

return ptr+1;

}


주소 값이 전달되었냐가 아닌, 주소값이 참조의 도구로 사용되었냐가 구분의 기준이 됨


c++에서는 주소값을 이용한 Call-by-reference외에도 (혹자는 이를 Call-by-address라 부르기도 한다)

참조자를 이용한 Call-by-reference도 존재한다.



참조자를 이용한 Call-by-reference


#include <iostream>
using namespace std;

void SwapByRef2(int &ref1, int &ref2)
{
	int temp = ref1;
	ref1 = ref2;
	ref2 = temp;
}

int main()
{
	int val1 = 10;
	int val2 = 20;

	SwapByRef2(val1, val2);
	cout << "val 1 : " << val1 << endl;
	cout << "val 2 : " << val2 << endl;

	return 0;
}


Output:

1
2
val 1 : 20
val 2 : 10


참조자를 이용해 값을 증가시키는 함수, 부호를 바꾸는 함수 정의하고

각 함수의 호출결과 확인

#include <iostream>
using namespace std;

void Func(int &ref)
{
	ref++;
}

void Func2(int &ref)
{
	ref = ref*(-1);
}

int main()
{
	int val1 = 10;
	Func(val1);		
	cout << "val 1 : " << val1 << endl;

	Func2(val1);
	cout << "val 1 : " << val1 << endl;
	
	return 0;
}


Output:

1
2
val 1 : 11
val 1 : -11



포인터 변수 ptr1, ptr2가 가리키는 대상이 바뀌도록 하는 SwapPointer 함수 정의하고 결과를 출력해 확인

#include <iostream>
using namespace std;

void SwapPointer(int * (&ptr1), int *(&ptr2))
{
	int * temp = ptr1;
	ptr1 = ptr2;
	ptr2 = temp;
}

int main()
{
	int val1 = 10;
	int val2 = 20;

	int * ptr1 = &val1;
	int * ptr2 = &val2;

	SwapPointer(ptr1, ptr2);
	
	cout << "ptr 1 -> " << *ptr1 << endl;		
	cout << "ptr 2 -> " << *ptr2 << endl;
	
	return 0;
}


Output:

1
2
ptr 1 -> 20
ptr 2 -> 10



참조자 기반 함수 정의의 단점


int num=24;

HappyFunc(num);

cout<<num<<endl;


C언어 관점에서 본다면 100% 24가 출력될거 같지만, C++에서는 얼마가 출력될지 알 수 없다.


void HappyFunc(int prm) { . . . .}      // 위와 같이 함수가 정의되어 있다면 24가 출력되겠지만

void HappyFunc(int &ref) { . . . . }    //  참조자가 매개변수에 있다면 num에 저장된 값을 변경할 수도 있다.


그렇기 때문에 참조자를 사용하는 경우 함수 원형을 확인해야하고, 참조자가 매개변수 선언에 있을 때

값의 변화가 일어나는지 함수의 몸체(body)까지 살펴볼 필요성이 생긴다.


이는 함수의 호출문장을 보고 함수 특성을 판단할 때 단점이 된다.

따라서 참조자의 활용이 쉬움에도 명확한 코드를 위해 포인터를 사용하는 경우도 있다.


다음과 같이 참조자 ref에 const 키워드를 이용하면 함수의 몸체까지 들여다볼 필요없이, 함수의 원형을 확인하는 정도로 그칠 수 있다.


void HappyFunc(const int &ref) { . . . . }    // 함수 HappyFunc내에서 참조자 ref를 이용한 값의 변경은 하지 않겠다는 const 선언



Return Type이 Reference Type인 경우


#include <iostream>
using namespace std;

int & RefRetFuncOne(int &ref)
{
	ref++;
	return ref;
}

int main()
{
	int num1 = 1;	
	int &num2 = RefRetFuncOne(num1);	// 함수호출 후 참조자를 반환하며, 이를 참조자 &num2에 저장
	
	num1++;		// 변수 num1과 참조자 num2의 값을 1씩 증가, 각각 3이 됨
	num2++;		// 마찬가지로 1씩 증가해 각각 4가 됨
	cout << "num1 : " << num1 << endl;
	cout << "num2 : " << num2 << endl;
		
	return 0;
}

Output:
1
2
num1 : 4
num2 : 4



바로 위 예제와 달리 일반 변수에 참조자 반환값 저장

#include <iostream>
using namespace std;

int & RefRetFuncOne(int &ref)
{
	ref++;
	return ref;
}

int main()
{
	int num1 = 1;	
	int num2 = RefRetFuncOne(num1);	// 함수호출 후 참조자를 반환하지만 참조자가 아닌 일반변수를 선언하고 반환값을 저장
	
	num1+=1;	
	num2+=100;	
	cout << "num1 : " << num1 << endl;
	cout << "num2 : " << num2 << endl;
		
	return 0;
}


Output:

1
2
num1 : 3
num2 : 102


반환형이 참조형인 경우

: 위의 두 예제와 같이 반환대는 대상을 참조자로 받거나 변수로 받을 수 있다.



반환형이 참조자가 아닌 경우

: ref를 반환하든, 변수에 저장된 값을 반환하든 차이는 없다.


int RefRetFuncTwo(int &ref) // 반환형이 참조형( int & )은 아님

{

ref++;

return ref;

}


반환형이 값의 형태라면 참조자로 그 값을 받을 수 없다.

(상수를 참조하게 되므로)


int num2=RefRetFuncTwo(num1); (o)

int &num2=RefRetFuncTwo(num1); (x)




아래와 같이 지역변수를 참조의 형태로 반환하는 것은 문제가 된다.


int & RetuRefFunc(int n)

{

int num=20;

num+=n;

return num; // 지역변수의 반환

}


int &ref = RetuRefFunc(10); // ?? ref가 참조하는 대상이 소멸



const 참조자의 잘못된 사용


const int num=20;

int &ref=num;

ref+=10;

cout<<num<<endl;


위에서 num을 const선언해놓고 참조자를 통해 값을 변경하는 것은 const 선언의 이유를 잃게 하므로 에러



따라서 const 참조자는 프로그램의 안정성을 위해 다음과 같이 쓰는것이 좋다.


const int num=20;

const int &ref=num; // ref로 참조는 하되 값을 변경하지 않겠단 의미

const int &ref=50; // const참조자를 통해 상수 참조 가능



const참조자가 상수를 참조가능한 이유

: 리터럴 상수는 참조자로는 참조할 수 없게 되어 있다. 

하지만 const참조자로 참조할 경우에는 허용하며, 상수를 메모리 공간에 임시적으로 저장한다.


이러한 것이 가능하도록 한 이유는 아래와 같이 매개변수 형이 참조자인 경우에 상수를 전달할 수 있도록 하기 위함이다.


int Adder(const int &num1, const int &num2)

{

return num1 + num2;

}



malloc과 free함수를 대신하는 new와 delete


c언어에서의 malloc과 free 함수 

https://rutel.tistory.com/76


크기를 바이트 단위로 계산하지않고 type에 맞게 할당


int * ptr=new int;

double *arr=new arr[7];


이렇듯 new연산자로 할당된 메모리 공간은,

아래와 같이 delete함수 호출을 통해 소멸한다.


delete ptr; // 앞서 할당된 int형 변수 소멸

delete []arr; // 앞서 할당된 double형 배열 소멸



c에서 heap영역으로의 접근은 pointer를 통해서만 이루어졌지만 c++에서는 reference를 통한 접근도 가능.


참조자를 통해 heap에 접근하기


int * ptr = new int;

int & ref = *ptr; // heap영역에 할당된 변수에 대한 참조자 선언

ref=20;

cout<< * ptr << endl;





C++에서 C언어 표준함수 호출하기


c언어에 대응하는 c++ 헤더파일의 이름 규칙

: c를 더하고 .h를 빼면 된다.


C언어 헤더 C++ 헤더

#include <stdio.h> #include <cstdio>

#include <stdlib.h> #include <cstdlib>



c++의 표준함수는 std라는 namespace안에 선언되어 있음

또한 표준 C에 대응하는 표준 C++함수는 C++문법을 기반으로 변경 및 확장되었다 (함수 오버로딩을 통해 개선하는 등)


따라서, 가급적 C++에 표준함수를 호출하는 것이 좋다.


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

생성자와 소멸자, 클래스  (0) 2016.09.26
class  (0) 2016.09.25
CPP-Object Oriented Programming (객체지향 프로그래밍)  (0) 2016.09.23
c++ Class  (0) 2016.09.22
c++ 기초  (0) 2016.09.19
728x90

CPP 예제들


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 5개 정수 입력받아 합을 출력하는 프로그램
*/
#include <iostream>
 
int main()
{
    int num = 0;
    int sum = 0;
    for(int i=0; i<5; i++)
    { 
        std::cout << i + 1 << "번째 정수 입력: " ;
        std::cin >> num;
        sum = sum + num;
    }
    std::cout << "합계 :" << sum << std::endl;
    return 0;
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 이름과 전화번호를 문자열 형태로 입력받아 출력하는 프로그램
*/
#include <iostream>
 
int main()
{
    char name[100];
    char phoneNum[200];
 
    std::cout << "이름 : ";
    std::cin >> name;
 
    std::cout << "전화번호 : ";
    std::cin >> phoneNum;
 
    std::cout << "이름은 " << name << "이고 " <<
        "전화번호는 " << phoneNum << "이다 "<<std::endl;
    return 0;
}
 
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 숫자를 입력받아 그 숫자에 해당하는 단을 출력하는 구구단 프로그램
    (5 입력시 구구단 5단 출력)
*/
#include <iostream>
 
int main()
{
    int dan;
    std::cout << "구구단 출력할 단 입력 : ";
    std::cin >> dan;
    
    for (int i = 1; i < 10; i++)
        std::cout << dan << " X " << i << " = " << dan*<< std::endl;
 
    return 0;
}
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
25
26
/* 급여 계산 프로그램
    기본 급여는 50만원, 물품 판매 가격의 12
    예) 판매금액이 100만원일 때, 50+100x0.12 = 62 (만원)
    
    판매금액 입력받아 급여를 출력 (-1이 될때까지 입력이 계속되야 함)
*/
#include <iostream>
 
int main()
{
    int pay;
    
    while(1)
    {
    std::cout << "판매 금액 입력 (만원단위, -1 입력시 종료) : ";
    std::cin >> pay;
 
    if (pay == -1)        
        break;    
 
    std::cout << "이번 달 급여: " << 50 + pay*0.12 << " 만원\n";
    }
    std::cout << "프로그램 종료" << std::endl;
        
    return 0;
}
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* main함수에서 필요로 하는 swap 함수를 오버로딩으로 구현
*/
 
#include <iostream>
 
void swap(int *ptr1, int *ptr2)
{
    int temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}
 
void swap(char *ptr1, char *ptr2)
{
    char temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}
 
void swap(double *ptr1, double *ptr2)
{
    double temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}
 
int main()
{
    int num1 = 20, num2 = 30;
    swap(&num1, &num2);
    std::cout << num1 << " " << num2 << std::endl;
 
    char ch1 = 'A', ch2 = 'Z';
    swap(&ch1, &ch2);
    std::cout << ch1 << " " << ch2 << std::endl;
 
    double dbl1 = 1.111, dbl2 = 5.555;
    swap(&dbl1, &dbl2);
    std::cout << dbl1 << " " << dbl2 << std::endl;
    
    return 0;
}
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
25
26
27
28
29
30
/* 매개 변수의 디폴트 값 지정 형태를
함수 오버로딩의 형태로 재구현 (main함수 변경없이 동일한 실행결과가 나오도록)
*/
 
#include <iostream>
 
int BoxVolume(int length, int width, int height)
{
    return length*width*height;
}
 
int BoxVolume(int length, int width)
{
    return length*width*1;
}
 
int BoxVolume(int length)
{
    return length * 1 * 1;
}
 
 
int main()
{
    std::cout << "[3, 3, 3] : " << BoxVolume(333<< std::endl;
    std::cout << "[5, 5, D] : " << BoxVolume(55<< std::endl;
    std::cout << "[7, D, D] : " << BoxVolume(7<< std::endl;
    //    std::cout<<"[D, D, D] : "<<BoxVolume()<<std::endl;  lengh에는 default값이 지정되지 않았으므로 컴파일 에러
    return 0;
}
cs


inline 함수

매크로 함수는 함수가 인라인화 되어 성능향상이 있다는 장점이 있지만,
복잡한 함수의 정의는 어렵다는 단점이 있다. 

이를 위해 c++에서는 인라인 함수라는 것을 제공한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
inline int SQUARE(int x)
{
    return x*x;
}
 
int main()
{
    std::cout << SQUARE(5<< std::endl;
    std::cout << SQUARE(12<< std::endl;
    return 0;
}
cs

키워드 inline을 이용한 함수의 인라인화는 컴파일러에 의해 처리가 된다.
매크로 함수에 비해 디버깅이 용이하며, 컴파일러가 판단할 때 함수의 인라인화가 오히려 성능에 해가 된다면 inline 키워드를 무시하기도 한다.

다만 위의 inline 함수는 자료형에 의존적이게 되며 데이터 손실이 생길 수 있다.

inline int SQUARE(int x) { return x*x; }
int 형 기반으로 정의된 위의 inline 함수는 함수 호출 문장에서 데이터 손실이 발생하게 된다.

std::cout<< SQUARE(3.15);    // 0.15가 손실되어서 3 x 3의 결과인 9가 출력

함수의 오버로딩을 이용해 문제를 해결하고자 하면 이는 한번만 정의하면 되는 매크로 함수의 장점과는 멀어지므로 사용하지 않는다.
그래서 이러한 문제를 해결하기 위해서 template이라는 것을 이용해 (매크로 함수와 마찬가지로) 자료형에 의존적이지 않는 함수로 완성시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

template <typename T>
inline T SQUARE(T x)
{
	return x*x;
}

int main()
{
	std::cout << SQUARE(5.5) << std::endl;
	std::cout << SQUARE(12) << std::endl;
	return 0;
}

Output:
1
2
30.25
144


namespace (네임 스페이스)
: 이름을 붙여놓은 공간

이름 공간을 나눠 그 안에 함수를 정의하거나 변수를 선언한다면, 같은 이름으로 인해 충돌되는 문제가 발생하지 않는다.

#include <iostream>

namespace BestComImpl
{
	void SimpleFunc(void)
	{
		std::cout<<"BestCom이 정의한 함수"<<std::endl;
	}
}

namespace ProgComImpl
{
	void SimpleFunc(void)
	{
		std::cout<<"ProgCom이 정의한 함수"<<std::endl;
	}
}

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}

Output:
1
2
BestCom이 정의한 함수
ProgCom이 정의한 함수

위의 예제에서 보듯이 namespace를 나누면 매개변수 형이 동일한 함수가 있어도 충돌문제가 발생하지 않는다.

이름 공간을 지정할 때는 범위지정 연산자(scope resolution operator)인 :: 을 사용한다.


이름 공간 기반에서 함수 선언과 정의의 분리 
#include <iostream>

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();
	ProgComImpl::SimpleFunc();
	return 0;
}

void BestComImpl::SimpleFunc(void)
{
	std::cout<<"BestCom이 정의한 함수"<<std::endl;
}	

void ProgComImpl::SimpleFunc(void)
{
	std::cout<<"ProgCom이 정의한 함수"<<std::endl;
}

Output:
1
2
BestCom이 정의한 함수
ProgCom이 정의한 함수


다음 예제에서와 같이 namespace를 둘 이상의 영역으로 나눌 수도 있으며, 동일한 namespace에 정의된 함수는 직접 호출이 가능하다

#include <iostream>

namespace BestComImpl
{
	void SimpleFunc(void);
}

namespace BestComImpl		// 3,8행과 같이 namespace를 둘 이상의 영역으로 나뉘어 선도 가능
{
	void PrettyFunc(void);
}

namespace ProgComImpl
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImpl::SimpleFunc();	
	return 0;
}


void BestComImpl::SimpleFunc(void)
{
	std::cout << "BestCom이 정의한 함수" << std::endl;
	PrettyFunc();					// 동일 이름공간
	ProgComImpl::SimpleFunc();		// 다른 이름공간
}

void BestComImpl::PrettyFunc(void)
{
	std::cout << "So Pretty!!" << std::endl;
}

void ProgComImpl::SimpleFunc(void)
{
	std::cout << "ProgCom이 정의한 함수" << std::endl;
}


Output:

1
2
3
BestCom이 정의한 함수
So Pretty!!
ProgCom이 정의한 함수



다음과 같이 namespace를 중첩시키는 것도 가능하다.


#include <iostream>

namespace Parent
{
	int num = 2;

	namespace SubOne
	{
		int num = 3;
	}

	namespace SubTwo
	{
		int num = 4;
	}
}

int main(void)
{
	std::cout << Parent::num << std::endl;
	std::cout << Parent::SubOne::num << std::endl;
	std::cout << Parent::SubTwo::num << std::endl;
	return 0;
}


Output:

1
2
3
2
3
4



/* 하나의 소스파일을 다음과 같이 3개의 파일로 분할 컴파일 하기

헤더파일  : main 함수를 제외한 나머지 두 함수의 선언 삽입

소스파일1 : main 함수를 제외한 나머지 두 함수의 정의 삽입

소스파일2 : main 함수만 삽입

*/


온라인에서 컴파일 및 실행해보기

-> https://goo.gl/eHaIhO



namespace에 대해 공부했기 때문에 std::cout은 namespace std에 선언된 cout이라는 의미임을 알 수 있다.




using을 이용한 namespace 명시


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

namespace Hybrid
{
	void HybFunc()
	{
		std::cout << "So Simple function!" << std::endl;
		std::cout << "In namespace Hybrid!" << std::endl;
	}
}

int main()
{
	using Hybrid::HybFunc;	
	// namespace Hybrid에 정의된 HybFunc를 namespace지정없이 호출하겠단 선언
	HybFunc(); // 14행의 using선언을 통해 namespace 지정없이 HybFunc 함수 호출
	return 0;
}

Output:
1
2
So Simple function!
In namespace Hybrid!


위의 예제는 using선언이 main함수내에 존재하는데, 이러한 경우 지역변수의 성격과 동일하다.

따라서 프로그램 전체 영역에 효력을 미치게 하려면 전역변수와 같이 함수밖에 선언을 한다.


함수밖에 using선언

1
2
3
4
5
6
7
8
9
#include <iostream>
using std::cout;
using std::endl;

int main()
{
	cout << "Hello, World!" << endl;
	return 0;
}


Output:

1
Hello, World!



다음과 같이 namespace std에 선언된 모든 것에 접근할 때에 namespace 지정을 생략하도록 선언할 수도 있다.

하지만 이와 같은 선언은 이름충돌이 발생할 확률이 상대적으로 높아지기에 적절한 판단하에 쓰는 것이 중요하다.

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;

int main()
{
	cout << "Hello, World!" << endl;
	return 0;
}


Output:

1
Hello, World!




namespace 중첩시 별칭을 주기위한 선언


#include <iostream>
using namespace std;

namespace AAA
{
	namespace BBB
	{
		namespace CCC
		{
			int num1;
			int num2;
		}
	}
}

int main()
{	
	namespace ABC = AAA::BBB::CCC;		// AAA::BBB::CCC를 namespace ABC로 별칭함
	AAA::BBB::CCC::num1 = 20;	// 별칭없이 중첩된 namespace에 차례로 접근
	ABC::num2 = 30;				// 별칭을 이용해 namespace에 접근

	cout << AAA::BBB::CCC::num1 << endl;	// 별칭없이 접근
	cout << ABC::num2 << endl;				// 별칭 ABC를 통해 접근

	return 0;
}


Output:

1
2
20
30



지역변수 이름이 전역변수와 이름이 같은 경우, 전역변수는 지역변수에 의해 가려진다.

SimpleFunc 함수내에서 전역변수 val에 접근할 때에는 범위지정 연산자 :: 를 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int val = 100;		// 전역변수 선언

int main()
{	
	int val = 20;	// 지역변수
	val += 3;		// 지역변수 val의 값 3 증가
	::val += 7;		// 전역변수 val의 값 7 증가
	return 0;
}


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

생성자와 소멸자, 클래스  (0) 2016.09.26
class  (0) 2016.09.25
CPP-Object Oriented Programming (객체지향 프로그래밍)  (0) 2016.09.23
c++ Class  (0) 2016.09.22
c++ 기초3  (0) 2016.09.21

+ Recent posts