일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- #define
- algorithm
- 나동빈님
- CLion
- 프로그래밍
- 코드블럭 오류
- standford University
- sizeof()
- #endif
- classification problem
- 형변환
- 기계학습
- 코딩테스트
- 연산자
- 단항연산자
- Andrew Ng
- Runtime constants
- Greedy
- Machine Learning
- coursera
- 홍정모님
- 학습 알고리즘
- regression problem
- 본즈앤올
- const
- 이코테
- decimal
- 기계학습 기초
- compile time constants
- C++
- Today
- Total
wellcome_공부일기
01.11. C++ | 변수 초기화 3가지 방법과 차이 본문
<목차>
1. Copy Initialization
2. Direct Initialization
3. Uniform Initialization ≒ Brace Initialization
4. 초기화 3가지 방법의 차이
Copy Initialization
복사 할당과 마찬가지로, 이것은 오른쪽에 있는 값을 왼쪽에 생성되는 변수와 복사한다.
int width = 5; // copy initialization of value 5 into variable width
Direct Initialization
단순한 데이터 유형(정수와 같은)의 경우 복사 및 직접 초기화는 본질적으로 동일하다. 그러나 일부 고급 유형의 경우 복사 초기화(Copy Initialization)보다 직접 초기화가 더 잘 수행될 수 있다. C++11 이전에는 성능 향상 때문에 대부분의 경우 복사 초기화보다 직접 초기화가 권장되었다. 객체지향에서 직접 만든 데이터 타입을 초기화할때 많이 사용한다.
int width( 5 ); // direct initialization of value 5 into variable width
Uniform Initialization
불행히도 괄호 기반 직접 초기화(Direct Initialization)는 모든 초기화 유형(예: 데이터 목록으로 개체를 초기화하는 것)에 사용할 수 없다.
보다 일관된 초기화 메커니즘을 제공하기 위한 시도로 C++11은 곱슬거림' { } '을 사용하는 Brace Initialization(일부 균일 초기화라고도 함)라는 새로운 구문을 추가했다.
브레이스 초기화는 두 가지 형태로 제공된다.
int width{ 5 }; // direct brace initialization of value 5 into variable width (preferred)
int height = { 6 }; // copy brace initialization of value 6 into variable height
이 두 가지 형태는 거의 동일하게 기능하지만, 일반적으로 직접적인 형태가 선호된다.
빈 교정기를 사용하여 변수를 초기화하면 초기화가 0을 나타낸다. Zero initialization(0 초기화)는 일반적으로 변수를 0으로 초기화한다(또는 지정된 유형에 더 적합한 경우 비어 있음).
int width{}; // zero initialization to value 0
Q: 어떤 방법으로 초기화시켜야 할까 { 0 } vs {}?
만약 실제로 그 값(value)를 사용하고 있다면 explicit initialization value를 사용하면 된다.
int x { 0 }; // explicit initialization to value 0
std::cout << x; // we're using that zero value
만약 그 값(value)가 일시적이거나 곧 대체될 예정이라면 zero initialization을 사용하면 된다.
int x{}; // zero initialization
std::cin >> x; // we're immediately replacing that value
초기화 3가지 방법의 차이
C++에서 3가지 초기화 방법 중 컴파일러가 가장 엄격하게 다루는 것이 Uniform Initialization이다.
Uniform Initialization은 객체지향 시 중요하게 작용하기 때문이다.
예를 들어, integer 데이터 타입에 초기화 값이 소수점인 상황이 있을 때 Copy Initialization와 Direct Initialization은 경고(warnings)가, Uniform Initialization은 오류(errors)가 뜨는 것을 확인할 수 있다. integer에 저장할 때, 소수점이 잘려나가서 컴파일러가 동작하면서 경고를 주지만 Uniform Initialization에서는 오류를 준다.
int a = 4.5; //warnings
int b( 4.5 ); //warnings
int c{ 4.5 }; //errors
하지만, 그 외의 초기화 방법인 Copy Initialization와 Direct Initialization에서 소수점이 있는 숫자를 정수로 바꿔서 즉, integer로 바꿔서 저장하고 싶으면 type casting(형변환) 앞에 int를 붙이면 된다.
(Uniform Initialization은 문법을 지켜야 한다!)
#include <iostream>
int main()
{
using namespace std;
int a = 123; //copy initialization
int b(123); //direct initialization
int c{ 123 }; //uniform initialization
int d = (int)1.23; //copy initialization & casting
int e((int)1.23); //direct initialization & casting
cout << a << endl; //output : 123
cout << b << endl; //output : 123
cout << c << endl; //output : 123
cout << d << endl; //output : 1
cout << e << endl; //output : 1
return 0;
}
* 해당 글은 홍정모님의 따라 배우는 C++을 공부한 바탕으로 작성되었습니다.
* 이론적인 내용들은 www.learncpp.com에서 참고하였습니다.
'프로그래밍 > C++' 카테고리의 다른 글
02.02. C++ | 정수형(Integer Data Types) (0) | 2020.05.03 |
---|---|
02.01. C++ | 기본 자료형(Primitive Built-in Types)과 + α (0) | 2020.05.02 |
01.10. C++| 전처리기(Preprocessor)란? (1) | 2020.04.29 |
01.09. C++ | std :: 명칭공간(Name Space)이란? (0) | 2020.04.28 |
01.08. C++ | 프로그래밍에서 지켜야 할 기본적 서식(Formatting) (0) | 2020.04.25 |