본문 바로가기

공부/C++

C++ 키워드 ( 정리 중 )

 

alignas  char do goto operator static typeid
alignof  char16_t double if or static_assert typename
and char32_t dynamic_cast inline or_eq static_cast union
and_eq class else int private struct unsigned
asm compl enum long protected switch using
auto const explicit mutable public template virtual
bitand constexpr  export namespace register this void
bitor const_cast extern new reinterpret_cast thread_local volatile
bool continue false noexcept return throw wchar_t
break decltype float not shrot true while
case default for not_eq signed try xor
catch delete friend nullptr sizeof typedef xor_eq

 

 

 

0. l-value와 r-value
l-value와 r-value는 =를 기준으로 어느쪽에 위치하냐에 따라 붙여지는 이름
l-value( left hand side value / lhs )는 대입 연산자의 왼쪽 혹은 오른쪽에 올 수 있는 객체
r-value( right hand side value / rhs) 는 대입 연산자의 오른쪽에 오는 값.

l-value는 값이나 개체를 대입받기때문에 반드시 명시적인 메모리 공간을 가지고 있어야함.
r-value는 잠깐 사용하고 사라지는 임시적인 값.

// 1.
int a;	//이 상황에서 l-value와 r-value를 따지는 것은 무의미하다.

//2. 
int a = 10; 	//a는 멤버변수
l-value => a; 
r-value => 10; 

++i와 i++에 대해서는 l-value / r-value가 다르다. 먼저
전위 증감 연산자는 { target = target + 1; return target; } 이고
후위 증감 연산자는 { const int temp = target; target = target + 1; return temp; }
위에서 후위 증감 연산자는 target를 복사한 후 계산을 하기 때문에 성능적인 면에서 전위에 비해 떨어짐

( 컴파일러에서 최적화를 하면 차이가 없을수도 있음)
전위 증감 연산자는 피연산자(=target)에 대해 증감연산을 한 후 그 피연산자의 메모리를 참조하는 l-value를 리턴한다.
후위 증감 연산자는 피연산자(=target)에 대한 증감연산을 한 후 증감 연산을 진행하기 전의 값인 r-value를 리턴한다.

1. alignas (since C++11)
메모리의 정렬 단위를 지정하는 키워드.

2. alignof (since C++11)
alignof(  ) 으로 쓰이며, 타입의 맞춤 단위를 리턴.

3. and ( iso646.h에 존재함 )
&& (비트연산자 &가 아님)

4. and_eq
&=  ( 비트연산자 + 할당연산자 )

5. asm
어셈블리 쪽에서 사용되는 키워드로 자세한 조사 필요

4. auto 

값에 상응하는 타입을 추론시켜주는 키워드.

C++ 98 에서는 자동지역변수를 명시적으로 지정하는 역할
C++ 11 에서는 변수 타입을 컴파일러가 유추하여 지정해주는 역할 ( 타입 추론 )
따라서 C++98의 자동지역변수 기능은 사라짐

 

C++ 14 에서는 함수를 위한 타입추론도 가능해짐.



5. bitand
& ( 비트연산자 )

6. bitor
| ( 비트연산자 )

7. bool 
true( 1 )/ false ( 0 ) 의 값만 가질수 있는 변수.
cout << std::boolalpha 후 cout << bool 를 하게되면 0 1 이 아닌 true / false로 출력
cout << std::noboolalpha 를 하면 끌 수 있음.

8. break
for / range-for [ for ( auto a :  ) ] / while / do-while / switch 에서 쓰이는 loop 종료 키워드

9. case 

switch 문에서 사용하는 일종의 조건식
switch( Target ) 일때
case 1:{ ... }  은 if ( Target == 1){...} 혹은 else if( Target == 1 ){...}이고
default : 는 초기값이다
if문과 다른점은 각 case 레이블(=label)마다 break;를 써줘야 다음 case 레이블을 무시하고 종료된다.

int a = 0;
switch( a ) 							
{
case 0:						if( a == 0 )
	printf("0");
    break;
case 1:						else if( a == 1 )
	printf("1");
	break;
default:					else 
	printf("default");
	break;
}
// output = 0

// break가 없을 시
int a = 0;
switch( a ) 							
{
case 0:						
	printf("0 ");
    
case 1:					
	printf("1 ");

default:
	printf("default");
}
// output : "0 1 default"
//if ( a == 1) output : "1 default"



10. catch
예외처리용으로 쓰이는 try 와 한묶음으로 쓰이는 키워드. try{ ... } catch{ ... } 형식으로 쓰이며 try 에서 생긴 예외를 catch 부분에서 처리한다.

11. char 

1 btye 정수. 대신 char 값을 정수로 해석하는 대신 아스키 코드(ASCII CODE)로 해석한다.
char A = 65;를 하고 printf("%d", A)를 하면 65가 출력되고, "%c"로 출력하면 "A" 가 출력된다.
반대로 int 값을 "%c"로 출력해도 "A"가 출력된다.

char cAn = 65;
printf("%c",cAn); // ==>output : "A"
printf("%d",cAn); // ==>output : 65

char cAc = 'A';
printf("%c",cAc); // ==>output : "A"
printf("%d",cAc); // ==>output : 65

int nAn = 65;
printf("%c",nAn); // ==>output : "A"
printf("%d",nAn); // ==>output : 65

int nAc = 'A';
printf("%c",nAc); // ==>output : "A"
printf("%d",nAc); // ==>output : 65


12. char16_t (since C++11)
UTF-16으로 인코딩된 텍스트 문자열

13. char32_t (since C++11)
UTF-32로 인코딩된 텍스트 문자열

14. class
클래스 키워드.

15. compl ~
비트 보수 연산자이자 소멸자(이건 확인..) 
비트 보수연산자로 쓰일때 ~0 은 1, ~1은 0

int nA = 0;
cout << ~A <<endl; // output : -1

nA = -1;
cout << ~A << endl; // output : 0

nA = 65;
cout << ~A << endl; // output : -66


16. const
상수 값. 빌드 타임에 고정적으로 정해지고, 런타임중에는 수정이 불가능.

// 1.
void testFunc( const int a )
{
	a = 10; 					// ERROR
}

// 2.
int nA = 100;
const int& cnA = nA;
cout << A <<", "<<cnA <<endl;	// output : "100, 100"

nA = 10;
cout << A <<", "<<cnA <<endl;	// output : "10, 10"
cnA = 10; 						// ERROR

 

17.constexpr (since C++11)


18. const_cast


19. continue

while 혹은 for문 같은 반복문에서 사용되며, continue 이하의 코드는 실행되지 않고

다음 루프를 실행

즉, break가 삽입된 부분 이하의 코드를 실행시키지 않고 빠져나오는 것이라면, 

continue 는 break와 비슷하지만 해당 반복문에서 빠져나오지 않고 다음 조건을 실행시키는 것이다.

for( int i = 0; i < 100; i ++ )
{
	if( i % 2 == 0 ) continue;
    printf(" i = %d\n", i);
}
// output : 1, 3, 5 ... 99 / 즉 홀수만 출력됨

 

decltype (since C++11)

 

21. default

기본 생성자를 표현해주는 키워드.

// header file

class TestClass
{
public:
   TestClass(); 			// 이럴경우 cpp쪽에 TestClass()에 대한 정의가 필요
   TestClass() = default;  // 위와 같이 cpp에 정의를 할 필요가 없음.
}

switch case 에서도 쓰인다 >> case 로 이동

※ 클래스 default는 C++ 11 버전에 추가됬다.

 

22. delete 

동적으로 할당된 변수를 메모리 해제하는 경우 사용됨. 

TestClass* test = new TestClass;
// ...
delete test;

delete는 소멸자를 자동으로 호출한다.

동적 메모리 할당의 키워드인 new의 반대개념이다. >> new 로 이동

 

위의 default와 반대되는 개념으로 사용되기도 한다( C++ 11버전 이상)

이를 삭제된 함수라 표현하기도 하는데, 클래스의 복사 연산자 ( 생성 혹은 대입 연산)를 막는 용도로 사용된다.

 

C++ 11 이전

class TestClass
{
public:
	TestClass(){};
	~TestClass(){};

private:
	TestClass( const TestClass& );
	TestClass& operator = ( const TestClass& );
}

 

C++ 11 이후

class TestClass
{
public:
	TestClass(){};
	~TestClass(){};

private:
	TestClass( const TestClass& ) = delete;
	TestClass& operator = ( const TestClass& ) = delete;
}

단순히 클래스 복사 연산자를 막는 용도로만 사용되는 것이 아닌

비멤버 함수에서도 사용된다.

// int 타입에 대해선 받지 않겠음.
struct NoInt
{
    void f(double i);
    void f(int) = delete;
};
 
// f의 인자로 double 형을 제외하고는 완전히 금지하겠다.
// 즉, 컴파일러가 암시적으로 형 변환하는 것까지 완벽 차단.
struct OnlyDouble
{
    void f(double d);
    template<class T> void f(T) = delete;
};

 

위의 예제는 http://egloos.zum.com/sweeper/v/2995404 에서 퍼옴.

23. do

do키워드는 단독으로 쓰이지 않고, while 문 앞에 사용된다. >> while문으로 이동

(보통 do while 문이라고 불린다)

do 
{
   // 실행문
}
while( /* 조건문 */ );

while문과의 차이점은 do{ } 안의 실행문이 처음에 한 번은 무조건 실행이 되며, 뒤의 while 에서 조건문을 체크하여 true면 do{ }을 실행하고, false 일 경우 반복을 종료한다.

int a = 0;
do
{
	a++;
    printf(" a = %d\n", a);
}
while( a < 10 );
//output >> a = 1 ~ a = 10

 

24. double

부동 소수점.

cout으로 출력시 cout.precision( @ ) 을 통해 원하는 자리수 까지 출력이 가능하다.

numeric_limits< double > 를 이용하면 몇자리 수 까지 지원하는 지 알 수 있다.

double pi = 3.14159265358979;
std::cout.precision( 10 );
// std::cout.precision( std::numeric_limits< double > :: max_digits10 );
std::cout << std::fixed << pi << std::endl; // 3.1415926535

 

25. dynamic_cast

 

26. else

조건문인 if 문과 함께 쓰이며, 전처리기 연산자( #else )에 속하기도 한다.

1. 조건문

int a = 10;
if( a == 10 )
{
 // a가 10일 경우에 처리할 부분
}
else
{
 // a가 10이 아닐 경우에 처리되는 부분
}

2. 전처리기 연산자 #else )

#if 조건1
   코드 1
#elif 조건2
   코드 2
#else
   코드 3
#endif

27. enum

열거형.

자신만의 자료형 타입을 만들 수 있게 해주는 키워드.

 

28. explicit

클래스의 생성자 앞에 붙는 키워드로, 파라미터의 자동 형 변환을 방지한다.

class ATestClass
{
public:
	ATestClass( int a )
	{
	}
};

class BTestClass
{
public:
	explicit BTestClass( int a )
	{
	}
};

void main()
{
	int nInt = 10;
	ATestClass aTest = nInt;
    
	BTestClass bTest = nInt; // E0415 / C2440 발생

}

 

29. export

C++ 11에서 사라진 키워드.

 

30. extern

다른 파일에서 전역변수로 선언된 변수 앞에 사용되는 키워드.

Test.cpp

...
int nNum = 10; // 전역변수 선언
...
main.cpp

...
extern int nNum;
...

void main()
{
    printf( "%d\n", nNum ); // 10 출력됨
}

 

31. false

참과 거짓 두가지 값만 가지는 bool 자료형이 가질수 있는 키워드.  보통 false 는 0, true 는 1로 처리된다.

논리 부정 연산자 ( ! )를 통해 true 값에서 false 값으로 바꾸거나, false 에서 true 값으로 변경 가능하다.

 

32. float 

double 와 마찬가지로 부종소수점 자료형. 

 

33. for

if과 함께 가장 많이 사용된다.

for( 초기식; 조건식; 변화식 ) 
{ 
    ....; // 초기식부터 조건식에 해당될때까지 처리할 로직
}

for( ; ; ) // 무한 반복
{
    ....;
}


int A = 0;
int B = 0;
for( A = 0, B = 5; ( A < 10) && ( B > 0); A++, B--)
{
    // 이런식으로 두개의 요소를 지정할 수도 있다.
    // 단, 이 방식을 사용하려면 변수 A와 B가 미리 선언 되어 있어야 한다.
    printf( "%d\t%d\n", A, B);
}

 

34. friend

이 키워드를 사용시, 접근 지정자를 완벽하게 무시하게 된다.

3가지 방법으로 사용된다.

1. 클래스

2. 멤버 함수

3. 전역 함수

 

goto

if

inline

int

long

mutable

namespace

 

new

new 연산자는 생성자를 자동으로 호출한다.

 

noexcept (since C++11)

not

not_eq

nullptr (since C++11)

operator

or

or_eq

private

protected

public

register

reinterpret_cast

return

short

signed

sizeof

static

static_assert (since C++11)

static_cast

struct

switch

template

this

thread_local (since C++11)

throw

true

try

typedef

typeid

typename

 

union

union testUnion
{
   int u_int;
   float u_float;
   double u_double;
}

void main()
{
   testUnion test1;
   test.u_int = 10;
   printf(" %d, %d ", test.u_int, test.u_double ); // output << 10, 10
   printf(" %f ", test.u_float );                  // output << 쓰레기값
}

 

unsigned

using(1)

virtual

void

volatile


wchar_t

 

while

 


xor
xor_eq

이동시키고자 하는 곳으로 바로가기 클릭

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

C++ 자료형 Max 값  (0) 2019.09.16
[정리중] C++ 디자인 패턴 종류  (0) 2019.09.10
STL Container  (0) 2019.08.21