2020년 7월 1일 수요일

C 스타일 배열, 동적 배열, 초기화리스트

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 에서 확대함.

클래스 멤버변수를 정의한 순서에 따라서 {} 에 넣으면 알아서 초기화함.

암묵적 형변환 중에 데이터 손실나는 축소변환은 걸러줌.

마지막 줄은 다음거랑 연결됨

1

2

3

4

5

AAA aaa({ 1, 2 });

AAA bbb = { 1, 'd' };

// ConstExpr uniform3 = { 1.2, 2.3 }; //축소변환 안댐

int* uniform3 = new int[4]{ 1, 2, 3, 4 };

std::vector<std::string> strings = { "아", "잠와", "이거 다 읽고 자야하는데" };

3. 클래스만의 초기화리스트

위에서 int 하듯이 할 수도 있는데, 클래스는 멤버변수를 초기화하기 위한 초기화리스트가 있음

이는

AAA aaa = {1, 2, 3, 4, 5};

AAA aaa{1, 2, 3, 4, 5};

를 가능하게 해줌.

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

class AAA

{

public:

// 초기화 리스트는 intializer_list 하나만 있거나, 기본적으로 설정되어 있는 인자만 있어야함

AAA(std::initializer_list<int> args, int defaultArg1 = 10,int defaultArg2 = 20)

{

for (auto iter = args.begin(); iter != args.end(); iter++)

{

lists.emplace_back(*iter);

}

lists.emplace_back(defaultArg1);

lists.emplace_back(defaultArg2);

}

void Print()

{

for(const auto & var : lists)

std::cout << var << std::endl;

}

private:

std::vector<int> lists;

};

void main()

{

AAA aaa1 = { 1, 2, 3, 4, 5, 6 };

aaa1.Print();

}

stl 에서 지원하는 클래스는 지원하는 기능임.

4. 유니폼초기화 비슷해보였던 것

char* 의 경우엔 특별하게도 동적할당도 하지 않았는데

const char* _pointer = "hello world"; 가 가능함.

왜냐하면 "hello world" 라는게 문자열 상수 저장 영역에 생성된 배열이고, 이 배열의 첫 주소를 _pointer 에 대입하는 것이기 때문.

근데 왜 저 경우는 const 가 붙는가?

위를 읽으면 stack, heap, 외에 rodata, bss, data 영역이 더 있는데,

rodata 는 읽기만 가능한 구역임. 그래서 const 가 들어갈 수 밖에 없는 것.

char str[] = "fasf";

이런경우는 그냥 저기에 할당되고 논외.

댓글 없음:

댓글 쓰기

List