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 - 멤버함수
}
'프로그래밍 > 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 |