일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- diamond inheritance
- placement new
- C++
- std::endl
- member function pointer
- virtual function table
- new&delete
- std::vector
- virtual function
- virtual inheritance
- conversion constructor
- return by reference
- base from member
- std::ostream
- discord bot
- pointer to member data
- vector size
- increment operator
- std::cout
- delete function
- 더 지니어스 양면포커
- vector capacity
- c++ basic practice
- this call
- constructor
- virtual destructor
- suffix return type
- dynamic_cast
- operator overloading
- c++ multi chatting room
- Today
- Total
I'm FanJae.
[C++] C++ 에서 새롭게 추가된 Type & Variable 본문
※ 본 포스트는 코드누리 C++ Basic 강의 내용을 보고 정리한 포스트입니다.
C 언어와 다르게 C++ 언어에서는 여러 가지 데이터 타입과 변수가 추가되었다.
1) auto, decltype
1-1) auto
int main()
{
int x[5] = {1,2,3,4,5};
auto n = x[0]; // n은 int type이 된다.
auto a = x; // 배열의 이름은 해당 배열의 첫번째 원소의 주소로 암시적 형변환이 된다.
따라서 a는 (int *) 가 된다.
}
auto ( C++ 11 )
- 변수 선언시, 우변의 표현식을 조사하여 컴파일러가 타입을 결정한다.
- 컴파일 할 때 타입을 결정하여, 실행 시 오버헤드는 없다.
- 위 예제의 경우는 x[0]이 int type이므로, n은 int type이 된다.
1-2) decltype
int main()
{
int x[5] = {1,2,3,4,5};
int data = 10;
decltype(data) d1; // int d1;
decltype(x) d2; // int d2[5];
}
decltype ( C++ 11 )
- 괄호 ( ) 안의 표현식으로 타입을 결정한다.
- 함수(클래스) 템플릿 등을 만들때 주로 사용한다.decltype의 사용 예시를 다룬 포스트 : Suffix return type
※ 위와 같이 표현식을 보고 컴파일러가 타입을 결정하는 것을 C++에서는 type deduction이라고 한다.
2) using
// typedef int DWORD;
// typedef void(*PF)(int);
using DWORD = int;
using PF = void(*PF)(int);
int main()
{
DWORD n; // int n
PF p; // void(*p)(int)
}
C 언어에서는 typedef를 이용해서 별칭을 만들어 사용할 수 있었다.
C++ 언어에서는 using을 사용한다.
2-1) typedef와 using의 차이점
typedef는 type에 대한 별칭만 제공하지만, using은 type에 대한 별칭 및 template에 대한 별칭에도 사용 가능하다.
3) 일관된 초기화(Uniform initialization)
struct Point
{
int x;
int y;
};
int main()
{
// 기존 초기화 방식
int n1 = 0;
Point p1 = {0, 0};
int x1[3] = {1,2,3};
// 직접 초기화
int n2 = {0};
Point p2 = {0, 0};
int x2[3] = {1,2,3};
// 복사 초기화
int n3{0};
Point p3{0,0};
int x3[3]{1,2,3};
}
- C++ 11 이전 (C++98) 까지는 일반 변수, 구조체, 배열, 클래스 등에 따라 초기화 방법이 모두 다르다.
- Uniform Initialization 은 모든 종류의 변수를 한가지 방법으로 초기화 할 수 있게 하는 것이다.
- 중괄호 초기화(brace-init)라고도 한다.
이 초기화 기법에는 Direct Initialization과 Copy Initialization 2가지가 존재한다.
Direct Initialization은 = 없이 초기화를 하고, Copy Initialization은 = 를 사용해서 초기화한다.
이 차이점은 추후 explicit에서 다룬다.
3-1) Prevent Narrowing
- C++ 에서는 일관된 초기화를 할때, 데이터 손실이 일어나는 상황에서 Compile Error가 발생한다.
int x{3.14}; // 컴파일 오류 발생. Narrowing Conversion을 방지한다.
4) C언어와 다른 Struct
4-1) C언어의 Struct와 C++ Struct의 차이점.
struct Point
{
int x = 1;
int y{2};
};
int main()
{
struct Point pt1;
Point pt2 = {3,4}; // 문제 없음.
}
1. 구조체 멤버에 디폴트 초기값을 지정 가능하다. (C++11)
2. 구조체 변수 선언시 struct 키워드를 표기하지 않아도 된다. (C++98)
4-2) Struct Binding (C++17)
int main()
{
struct Point pt1;
Point pt2 = {3,4};
auto [x, y] = pt2; // Strucutre Binding (C++17)
}
- 구조체 또는 배열의 모든 요소의 값을 추출할 수 있다.
- 타입은 반드시 auto를 사용한다.
- 요소의 개수와 선언된 변수의 개수는 반드시 동일해야 한다.
5) String
5-1) C 언어의 문자열 처리
#include <cstring>
int main()
{
char s1[] = "abcd";
char s2[5];
s2 = s1;
if (s2 == s1)
{
std::cout << "same" << std::endl;
}
else
{
std::cout << "not same" << std::endl;
}
}
- 위 예제는 잘못된 예제이다.
- C언어에서는 문자열을 다루는 데이터 타입이 없어서, 문자와 배열을 혼합하여 사용한다.
- =, == 등의 연산자를 사용하면 안되고 문자열 전용 함수(strcpy,strcmp 등)을 사용해야 한다.
5-2) C++ 에서의 문자열 처리
#include <iostream>
#include <string>
int main(void)
{
std::string s1 = "abcd";
std::string s2;
s2 = s1;
if ( s2 == s1 )
std::cout << "same" << std::endl;
else
std::cout << "not same" << std::endl;
std::string s3 = s1 + s2;
std::cout << s3 << std::endl;
}
std::string
- C++ 표준 라이브러리인 STL 이 제공하는 문자열 타입이다.
- class 문법으로 만들어진 사용자 정의 타입이다.
- 문자열 변수를 정수형 변수와 유사하게 사용 가능하다. 즉, +,==,= 등의 연산자 사용이 가능하다.
※ std::string은 <string> 헤더파일에 있다. <cstring> 이라는 <string.h>의 C++ 버전과 혼동하지 않게 유의해야 한다.
'C++ > Basic' 카테고리의 다른 글
[C++] Function II (0) | 2024.08.08 |
---|---|
[C++] Function I (0) | 2024.08.07 |
[C++] 표준 입출력 정리 (0) | 2024.08.06 |
[C++] namespace 정리 (0) | 2024.08.05 |
[C++] Visual Studio C++ 언어 표준 설정. (0) | 2024.08.05 |