class Lecture { private: vector<Student*>studnets; } 10분 40 초쯤에 선생님께서 Lecture class 가 사라지면 students instance 는 사라진다 하지만 student* 포인터가 가리키고 있는 원래 주소에 있는것들은 그대로 유지된다고 하셨는데 그렇다면 그 주소에 있는것들은 나중에 delete 을 사용하여 없애주어야하는거 아닌가요?
int **mat = new int *[row]; for (int r = 0; r < row; ++r) { mat[r] = new int[col]; } 이 부분이 이해하기 진짜 어려웠습니다.. 1번 봤을떈 이해가 안갔습니다 그래서 동적할당을 이해못해서 그런가해서 다시보고 생각하면서 코드 하나하나 다시 뜯어서 보고 다시 영상 보면서 코드를 보니까 아래처럼 이해를 했는데 이게 맞는걸까요? const int row = 3; const int col = 5; const int arr[row][col] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; //출력하기 위해선 초기화를 해줘야됨 int **mat = new int *[row]; // int *[3]크기의 메모리 할당 / 초기화 //const int arr[row][col] ={1~15} 초기화 해주기 for (int r = 0; r < row; ++r) // 3반복 { mat[r] = new int[col]; //int *r1 = new int{1,2,3,4,5};처럼 초기화를 해야하는데 //하나하나 다 해줄 수 없으니 int *[5] 크기의 메모리 즉 [col]5개를 3번 반복해서 [r]에 1~15를 저장해줌 } for (int r = 0; r < row; ++r) // row 열 만들기 3 { for (int c = 0; c < col; ++c) // col 열 만들기 5 { mat[r][c] = arr[r][c]; //mat[0~2][0~4] } } //출력용 for (int r = 0; r < row; ++r) { for (int c = 0; c < col; ++c) { cout << mat[r][c] << " "; } cout << endl; } //delete for (int r = 0; r < row; ++r) { delete[] mat[r]; }
7분쯤에 선생님이 이런식으로 코딩을 해주셨는데 Mystring hello("Hello"); cout<<(int*)hello.m_data<<endl; { MyString copy=hello; cout<<(int*)copy.m_data<<endl; } 여기서 output 둘다 006AF320 로 같게 나오는데 m data 가 가지고 있는 값이 같다는건가요 아니면 m data 포인터의 주소값이 같다는 뜻인가요?
안녕하세요 강의 시청 중 int 와 char의 차이에 관해 궁금증이 생겨 질문드립니다. 강의에서 char은 아스키코드를 통해 정수로 데이터를 저장하므로 int 와 마찬가지로 사칙연산이 가능하고, 또 차이점은 같은 바이트에 이진수로 정수를 저장하지만 int 가 char보다 더 넓은 범위의 정수를 저장하는 것으로 배웠습니다. 여기서 좀 헷갈리는 것이 그럼 int 와 char 의 차이가 미묘합니다. char cValue = 69;// 아스키 코드 값을 저장하므로... cout<< cValue; //출력값 : E 위가 성립함은 이해가 갑니다. cout<< 'S' - 8; //출력값 : 75 그런데 이 윗줄의 출력값이 75의 아스키 넘버에 해당하는 K가 아닌 75가 출력될 수 있었던 이유가 궁금합니다. #질문에 참고한 링크입니다 1) https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=lsv400&logNo=100090853321 2)https://stackoverflow.com/questions/15869931/practical-difference-between-int-and-char
안녕하세요! 1) 강의 4:68즈음에 #define MAX(a,b) ( (a) > (b) ) ? (a) : (b) 이런 식을 나오는데 함수와 다르게 a나 b에 대해 int 선언 같은 걸 안해줘도 되나요?? 2) 함수와 역할이 거의 흡사한 것 같은데 차이점이 뭔지 궁금합니다. 적용 범위의 차이인가요?
안녕하세요 강의 4:40 대에 소속된 중괄호가 다르면 같은 변수명을 초기화하더라도 메모리 주소가 다른 곳에 저장된다고 나옵니다. 그리고 강의 7:15에서는 x가 중괄호 밖으로 나온 순간 사용할 수 없다고 합니다. 그런데 강의 8:10에서 초기화를 하지 않고 "안 쪽"의 중괄호의 x=2를 쓰고, 그 떄의 주소를 보면 "바깥 괄호"의 x 주소를 그대로 사용하는 것을 확인할 수 있습니다. 중괄호의 포함관계가 적용되는 것인가요? 포함관계가 없는 중괄호 끼리는 변수를 혼용해서 못쓰는 것인가요? ex) int main () { int x = 4; { x =5; int y = 4; } { y=6; } } 위 코드는 에러가 납니다. 그 이유를 분석해보면 , 포함관계가 있는 중괄호라면, 즉 큰 범위에서 정의된 x는 값을 변경하는 게 가능하지만 독립된 범위에서 정의된 y는 포함관계가 없는 중괄호에서의 y는 정의되지 않았기 떄문에 값을 변경하는 게 불가능해서 인가요? 그런데 .. 오로지 포함관계로 볼 수 도 없는 것이 안 쪽 중괄호가 바깥 중괄호에 포함되는 것이라면 int main() { int x =4; { int x= 5; } } 위 코드는 에러가 나야합니다. 큰 범위의 중괄호에서 이미 정의된 x를 두 번 정의하기 떄문에요. 하지만 주소값을 출력해보면 위 x와 아래 x가 다른 메모리 주소값을 갖게 됩니다. 정리를 하자면, int main() { int x = 5; { int x= 3; } } 이 가능하려면 int main() { int x =3; { x=5; } } 가 가능할 수 없다고 생각합니다.
선생님께서 Fraction one_thirds=Fraction{1,3}; 이 경우는 복사한 instance 가 one_thirds 로 들어가 초기화를 해주신다고 하셨는데 instance 가 만들어지기 위해선 변수명을 지정해주어야하는거 아닌가요? 예를들어 Fraction one_thirds=Fraction a{1,3}; 이런식으로 해야지 복사된 instance 가 one_thirds class 에들어가서 초기화가 되는거 아닌가요?
안녕하세요 template<typename T> void func_wrapper(T &&t) { func(std::forward<T>(t)); // forward R로 오면 Rref로 L 로 오면 Lref 로 바다줌 } int main() { MyStruct s; func_wrapper(s); func_wrapper(MyStruct()); // template에 넣을땐 다 L-ref 로 들어가는 문제 //func(s); // L-ref //func(MyStruct()); // R-ref return 0; } 위에 template<typename T> void func_wrapper(T &&t) { func(std::forward<T>(t)); } 에서 매개변수를 T &&t 로 받고있는데 main 함수내에 func_wrapper(s); func_wrapper(MyStruct()); 에서 MyStruct()는 R-ref로 들어갈수있다고 생각이드는데 s는 l-ref인데 어떻게 T &&t 로 넣을수있는지 궁금합니다
안녕하세요! 1. 8:10초에 AutoPtr<Resource> res = new Resource; 는 포인터가 아니라 자체가 스마트 포인터이기 때문에 *res 가 아닌 res 로 한다고 하셨는데 new Resource는 메모리 동적할당을 받아서 주소를 가지고 있는데 res에 넣는게 가능한건가요?? 2. AutoPtr.h 헤더 내부에 AutoPtr(AutoPtr &a) { m_ptr = a.m_ptr; a.m_ptr = nullptr; } 이 함수는 디버깅해보니 이 예제에선 아예 사용되지 않던데 그냥 이렇게 쓰인단걸 알려주시기 위해서 이 강의에 넣으신건가요??
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
강의에서 배열이란것 자체가 시작위치를 가리키는 포인터라고 표현을 하셨는데 시작위치를 가리키고 있다는 것은 배열의 시작지점을 배열이란것이 주소 값을 통해 가지고 있는다라고 이해가되는데 이런 의미라고하면 디버깅 모드에서 statinfo 라는 자료형의 monsters 배열을 메로리 검색해보면 바로 값이 내장되어있는 스택메모리의 위치가 보여지고 만약 monsters 배열이 배열의 시작주소를 가리키고 있다면 &monsters 검색하게된다면 가령 배열의 주소가 0x007AFB4C 이라면 (배열의 값을 가지고 있는주소임) &monsters 는 0x007AFB4C를 가지고 있는 또하나의 메모리가 되어야 하는 건 아닌가요? 마치 포인터 처럼 예를들어 main 안에 int number = 0xaaaaaaaa; int * ptr = &number; 일때 number 의 주소값이 ptr 이라는 포인터변수안에 들어가있고 디버깅을 찍어서 확인해보면 &ptr 메모리검색을해보면 실제로도 number 의 주솟값이 들어가 있는것을 알수있습니다. 물론 배열이란것자체가 주소값이기 때문에 포인터 변수에 대입가능하고 메모리 검색자체도 &를 붙이지 않아도 되고 주소값이라는 건 충분히 이해가 되었지만 배열이란것이 "처음 주소를 가리키고 있다" 라는 말이 이해가안됩니다. 내부적으로 배열이 처음주소를 가리킨다면 그 처음주소를 가리키는 또다른 메모리가 존재를 해야하는것이아닌가요? 궁금해서 질문 드립니다.
안녕하세요? 함수내에서 변수를 선언하면 함수 호출이 종료될 때 변수에 대해 할당된 메모리가 반환되는것으로 알고 있습니다 다만 함수내에서 동적할당을 할 시에는 delete를 하지 않으면 메모리가 계속 유지가 되는데 이는 함수안의 변수가 stack에 저장이 되서 그렇고 동적할당을 할 시에는 heap에 저장이 되어 그렇다고 생각하면 될까요?
안녕하세요, 좋은 강의 해주셔서 감사합니다. 질문드리고 싶은 것이 있는데, 예를 들어 int nothing(int x = 1, int y=2, int z=3);같은 함수가 정의되어 있을 때, x와 z는 디폴트 값을 사용하고 y만 다른 값으로 변경한 함수를 활용하고 싶으면 어떻게 하여야 하나요? python의 경우 nothing(y = 3)같은 식으로 활용이 가능했는데 c++은 아닌 것 같아서 질문 드립니다.