1. 차이
(굳이 자료형이 int 일 필요는 없음.)
1. int arr[] = {1, 2, 3 };
2. int* arr = new int[3] {1, 2, 3};
- 위치
전자는 스택
후자는 힙.
- sizeof
전자는 동적할당이 아님. 그래서 sizeof() 로 크기도 구할 수 있음.
후자는 sizeof() 해도 포인터 크기만 나옴.
-구간지정 for 루프
전자는 for (auto& i : arr) 이게 가능함.
후자는 begin(), end() 메소드가 있어야함.
전자를 쓴적이 없어서 이제 알았음.
2. 유니폼초기화
struct 는 {} 쓰는데, 클래스는 생성자 쓴다고 () 로 하는게 불편해서 {} 이거로 통일해서 유니폼임
{0,} 이런걸로 모든 멤버를 0으로 초기화하거나, 하나하나 값을 입력하거나 두가지 방식이 있음.
전자는 Zero_Intialization, 후자는 Initalizer_list 를 쓴다고 함
원래는 struct, literal 자료형만 지원했는데 c++11 에서 확대함.
클래스 멤버변수를 정의한 순서에 따라서 {} 에 넣으면 알아서 초기화함.
암묵적 형변환 중에 데이터 손실나는 축소변환은 걸러줌.
마지막 줄은 다음거랑 연결됨
3. 클래스만의 초기화리스트
위에서 int 하듯이 할 수도 있는데, 클래스는 멤버변수를 초기화하기 위한 초기화리스트가 있음
이는
AAA aaa = {1, 2, 3, 4, 5};
AAA aaa{1, 2, 3, 4, 5};
를 가능하게 해줌.
stl 에서 지원하는 클래스는 지원하는 기능임.
4. 유니폼초기화 비슷해보였던 것
char* 의 경우엔 특별하게도 동적할당도 하지 않았는데
const char* _pointer = "hello world"; 가 가능함.
왜냐하면 "hello world" 라는게 문자열 상수 저장 영역에 생성된 배열이고, 이 배열의 첫 주소를 _pointer 에 대입하는 것이기 때문.
근데 왜 저 경우는 const 가 붙는가?
위를 읽으면 stack, heap, 외에 rodata, bss, data 영역이 더 있는데,
rodata 는 읽기만 가능한 구역임. 그래서 const 가 들어갈 수 밖에 없는 것.
char str[] = "fasf";
이런경우는 그냥 저기에 할당되고 논외.
댓글 없음:
댓글 쓰기