일반변수, 구조체, 배열, 클래스에 따라 초기화 방법이 다르다.
auto
→ 컴파일할 때 타입을 결정, 실행 시 오버헤드는 없다.
→ 단점: 가독성이 떨어진다.
int main(){
int x[5] = {1,2,3,4,5};
auto n = x[0]; // auto : 변수 선언시, 우변의 표현식 조사해서 컴파일러가 타입 결정
}
decltype
→ ()안의 표현식으로 타입을 결정
→ 함수(클래스) 템플릿 등을 만들 때 주로 사용
decltype(n) n1; //int n1;
배열과 auto
//int x[5] = {1,2,3,4,5}; 일 때
//auto a = x;
//int a[5] = x; //이렇게 결정되었다면 컴파일 에러
//int* a = x;
decltype(x) d;
decltype(x) d1 = x; //error
type deduction(inference, 추론, 연역)
→ 주어진 표현식을 보고 컴파일러가 타입을 결정하는 과정
→ 생각보다 복잡한 과정을 통해 타입이 결정된다.
Using Uniform Initialization
= 중괄호 초기화(brace-init)
→ 모든 종류의 변수를 한가지 방법으로 초기화할 수 있다.
- 직접 초기화(Direct Initialization) : = 없이 초기화 하는 것
- 복사 초기화(Copy Initialization): = 를 사용해서 초기화 하는 것
struct Point
{
int x;
int y;
};
int main()
{
//복사 초기화
int n1 = 0;
Point p1 = {0, 0}; // 중괄호 초기화(brace-init)
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};
}
- Prevent narrow
int main()
{
int n1 = 3.4; // ok (warning 발생)
int n2{3.4}; // error
int n3 = {3.4}; // error
char c{500}; // error char은 1 byte인데 500을 담을 수 없음(데이터 손실 발생)
}
//전통적 초기화보다는 중괄호 초기화를 사용하는게 좀 더 안전한다.
//중괄호 초기화를 좀 더 권장한다.
Struct(구조체)와 Structure binding
- C++11부터 구조체 멤버에 디폴트 초기값을 지정할 수 있다.
- 구조체 변수 선언시 struct 키워드 표기하지 않아도 된다 (C++98부터)
struct Point
{
int x = 1;
int y{2};
}; //내부적으로 복잡하다는 단점이 있다.
structure binding
- 구조체 또는 배열의 모든 요소의 값을 한줄에 꺼내는 문법
- 타입은 반드시 auto를 사용해야 한다.
- 요소의 개수와 선언된 변수의 개수가 동일해야 한다.
Point foo()
{
Point p = {1,2};
return p;
}
int main()
{
struct Point pt1; //c언어
Point pt2 = {3,4}; //C++
// int x = pt2.x;
// int y = pt2.y;
auto [x, y] = pt2;
// int [x, y] = pt2;
int arr[3] = {1,2,3}; //배열
auto [a, b, c] = arr;
// int a = arr[0]
// int b = arr[1]
// int c = arr[2]
auto ret = foo(); // Point ret = foo();
auto[x1, y1] = foo();
}
문자열
- char 배열 또는 const char* 사용
- =, == 등의 연산자를 사용하면 안되고 문자열 전용 함수를 사용해야 한다.
#include <iostream>
#include <cstring>
int main(){
char s1[] = "abcd";
char s2[5];
//s2 = s1; 베열은 왼쪽에 올 수 없어서 error 발생
strcpy(s2,s1);
//if (s2 == s1) //문자열이 아닌 배열의 주소를 비교해서 not same 발생
if ( strcmp(s2,s1) == 0) //0이나오면 결과가 같은 것.
std::cout << "same" << std::endl;
else
std::cout << "not same" << std::endl;
}
std::string
- c++ 표준 라이브러리인 STL이 제공하는 문자열 타입
- class 문법으로 만들어진 "사용자 정의 타입"
- 문자열 변수를 정수형 변수와 유사하게 사용 가능
- +, == , = 등의 연산자 사용 가능
- 헤더 파일 주의
- <cstring> : <string.h>의 c++ 버전
- <string> std::string을 사용하기 위한 헤더
타입
int main(){
bool b = true; //false, 0, 1 - C++98
long long n = 10; //C++11 64bit 정수
int n1 = 0b1000'0000; //2진수 표기법
int n2 = 1'000'000; //digit separator
int* p1 = 0;
int* p2 = nullptr; //C++11부터
}
- 문자열을 실수형으로 type을 바꾸기 위해서는 float라는 함수로 감싸준다.
a = input()
a = float(a)
print(a + 0.58)
반응형
'프로그래밍 > C ++' 카테고리의 다른 글
[C++] 함수 (0) | 2024.12.03 |
---|---|
[C++] 자료형 (묵시적형변환) (0) | 2024.12.03 |
[C++] iosteam 표준 입출력 (0) | 2024.07.08 |
[c++] std namespace / header file (0) | 2024.07.04 |
[C++] namespace (0) | 2024.06.24 |