갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 2020년 게임 매출
  • 유니티 그래프 그리기
  • c# coroutine
  • C# 예외 처리
  • C++
  • 유니티 골드그래프
  • 게임 디자인 패턴
  • 자바
  • c# 코루틴
  • 전세계게임매출순위
  • 글로벌게임매출
  • 게임 매출 순위
  • 모바일 게임 순위
  • 알고리즘
  • Unity Graph
  • c# Thread
  • C# boxing
  • 게임매출순위
  • 유니티 그래프
  • C++ virtual
  • C++ 상속
  • c# unboxing
  • C++ 소멸자
  • pc게임 순위
  • 롤 골드그래프
  • pc 게임 순위
  • c# delegate
  • 강남 방탈출
  • c# collection
  • 전세계 게임 매출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] 변수(2)
프로그래밍/C++

[C++] 변수(2)

2019. 10. 5. 17:51
728x90
반응형

1. Constexpr

 - 컴파일 시간 상수를 만드는 새로운 키워드

  => 컴파일 시간에 결정되는 상수 값으로만 초기화 할 수 있다.

 - C++ 11에서 도입된 문법

int main() {
    const int t1 = 10; // 상수로 만듬
    t1 = 20;           // error
    
    constexpr int t2 = 10; // 상수로 만듬
    t2 = 20;               // error
}

1.1 C언어와 배열의 크기

 - C89 (1989년에 표준화된 문법)

    => 컴파일 시간에 크기를 알 수 있어야 한다.

- C99 (1999년에 표준화된 문법)

    => 배열의 크기로 변수도 가능

    => g++은 지원하지만 cl컴파일러는 지원하지 않음

void move(const int n) {
    int arr[s]; // error - move(10)으로도 호출 되지만 move(m)으로 변수로 호출이 되어서
}

int main() {
    int arr1[10]; // ok
    
    int l1=10;
    int arr2[l1]; // g++ : ok   cl : error
    
    const int s2 = 10;
    int arr3[s2];
    
    const int s3 = s1;
    int arr4[s3]; // 컴파일에 걸리는 시간을 알 수 없으므로 error
}

1.2 const vs constexpr

 - const

  => 컴파일 시간 상수와 실행시간 상수를 모두 만들 수 있다.

  => 변수 값으로 초기화 할 수 있다.

 - constexpr

  => 컴파일 시간 상수만 만들 수 있다.

  => 컴파일 시간에 계산될 수 있는 값으로만 초기화 가능하다.

  => 템플릿 인자로 사용될 수 있다.

int main() {
    int n = 10;
    
    const int c1 = 10; // 컴파일 시간 상수. 배열 크기로 설정 가능
    const int c2 = n;  //실행시간 상수. 배열 크기로 설정 불가
    
    constexpr int c3 = 10; // 컴파일 시간 상수. ok.
    constexpr int c4 = n;  // 실행시간 상수. error.
}

 - C#같은 경우 컴파일 상수와 시간 상수가 키워드가 명확히 구분되어 있음.

 - C++은 구분없이 const로 쓰다 혼란스러워 constexpr키워드가 탄생되었다.

 - constexpr을 쓰면 컴파일러가 컴파일 상수라고 확실히 인식하기에 최적화도 보장해준다.

 - const double pi = 3.14; 보다는 constexpr double pi = 3.14;가 더 좋다.

 


2. structured binding (C++ 17)

 - 구조체 또는 배열에서 각 멤버의 값을 꺼낼 때 사용

 - 타입은 반드시 auto를 사용해야 한다. (const를 붙이는 것은 가능) (참조도 가능 - &)

 - 같은 변수명 사용 불가.

#include <iostream>

struct Point {
    int x{10}; // 일관된 초기화
    int y{20}; // 구조체 멤버도 바로 초기화 가능
};

int main() {
    Point pt;
    
    //int x = pt.x;
    //int y = pt.y; // 보통의 초기화 방법
    
    //auto[x, y] = pt; // pt가 가진 멤버들 x, y순서대로 넣겠다.
                       // 위와 같은 기능
                     
    int arr[2] = {1, 2};
    auto[x, y] = arr; // 위와 같은 문법 - x, y순서대로 값이 들어감.
    
    int x = 10; // error 위에서 x를 사용했으므로
    
    std::cout << x << "," << y << std::endl;
}

 


3. String

3.1 C언어와 C++언어에서의 문자열 처리 방법

 - C언어에서의 문자열

    => char* 또는 char 배열 사용

    => 대입 또는 비교시 문자열 전용 함수를 사용해야 한다. - strcpy / strcmp

    => 문자열 연산이 직관적이지 않다. - 함수를 쓰기보다 str==str ?? 요런게 더 직관적

    => <string.h> 또는 <cstring> 헤더 파일이 필요 - cstring이 더 낫다.

 - C++언어에서의 문자열

    => std::string 타입 (STL의 string클래스)를 사용

    => <string> 헤더

    => 문자열관련 연산이 정수형 변수처럼 직관적으로 사용할 수 있다.

#include <stdio.h>
#include <string.h>

int main() {
    char s1[32] = "hello";
    const char* s2 = "world";
    
    //s1 = s2;      // 대입 - error
    strcpy(s1, s2); // 대입 - ok
    
    //if(s1==s2) {}          // 비교 - error
    if(strcmp(s1, s2)==0) {} // 비교 - ok
}
//--------C언어에서의 문자열 비교 코드-----------

#include <iostram>
#include <string>

int main() {
    std::string s1 = "hello";
    std::string s2 = "world";
    
    s1 = s2; // 대입
    
    if(s1==s2) {} // 비교
    
    std::string s3 = s1 + s2; // 덧셈연산 가능
}
//--------C++언어에서의 문자열 비교 코드-----------

3.2 std::string 과 C언어 호환

 - string 타입의 변수를 const char*로 변환 하려면 c_str() 멤버 함수를 사용

 - 멤버 함수의 개념은 객체지향으로 처음 등장한 부분

#include <iostram>
#include <string>

void move(const char* s) {
    printf("Go %s", s);
}

int main() {
    std::string s = "hello";
    
    move(s); // error
    move((const char*)s); // error
    
    move(s.c_str()); // ok - 멤버함수
}
728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] C언어와 다른 C++ 함수(2)  (0) 2019.10.11
[C++] C언어와 다른 C++ 함수(1)  (0) 2019.10.09
[C++] 변수(1)  (0) 2019.10.05
[C++] iomanipulator  (0) 2019.10.05
[C++] C++ 표준 입출력  (2) 2019.10.04
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] C언어와 다른 C++ 함수(2)
    • [C++] C언어와 다른 C++ 함수(1)
    • [C++] 변수(1)
    • [C++] iomanipulator
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바