본문 바로가기

프로그래밍/C ++

[c++] C++ 변수의 특징

 


일반변수, 구조체, 배열, 클래스에 따라 초기화 방법이 다르다.

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