월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C++
4:30 부근 질문입니다.
ref를 함수 인자로 넘기면 변수의 복사가 일어나는게 아니라 변수를 직접 넘기는 것은 이해했습니다.아래 질문들을 보고 const ref에는 literal도 대입될 수 있다는 것도 이해했구요.그런데, const ref를 함수 인자로 쓰면 literal을 함수 인자로 그대로 쓰는 게 장점이라고 강의에 말씀하셨는데, 그건 그냥 일반 변수를 인자로 받는 함수도 마찬가지 아닌가요? 그게 왜 장점이 되는지 모르겠습니다.아래 코드에서 보시면, doSomething과 doSomething2 역시 doSomething4와 동일하게 literal을 인자로 받을 수 있습니다. literal을 함수 인자로 쓰는 경우는 메모리 주소가 필요한 상황이 아니니(애초에 literal은 R-value니까) 위에서 언급하신 "변수 복사가 아니라 같은 주소값을 갖는 그 변수 자체가 넘어간다"는 이점도 없어보입니다. literal을 인자로 받는 함수에서 인자를 const ref로 받는 것이 정말 다른 경우에 비해 효용성이 큰가요? #include <iostream>using namespace std;void doSomething(const int x) { cout << "In doSomething : " << x << endl; cout << "In Dosomething : " << &x << endl;}void doSomething2(int x) { cout << "In doSomething2 : " << x << endl; cout << "In Dosomething2 : " << &x << endl;}void doSomething3(int& x) { cout << "In doSomething3 : " << x << endl; cout << "In Dosomething3 : " << &x << endl;}void doSomething4(const int& x) { cout << "In doSomething4 : " << x << endl; cout << "In Dosomething4 : " << &x << endl;}int main() { int x = 5; int& ref_x = x; /*ref를 쓰기 위해선 메모리 주소가 있어야 하기 때문에 literal은 대입 불가. 즉, int& ref1 = 5; int& ref2 = 3 + 4; 는 불가능.그러나, const ref는 가능.즉, 아래 코드는 가능. 주소값도 있음*/ const int& ref3 = 3; cout << ref3 << endl; cout << &ref3 << endl; /*심지어 주소도 있음. 그럼 이게 const int ref3 = 3;이랑 뭐가 다르냐? 함수 파라미터로 넣을 때 아주 유용함*/ doSomething(ref3); cout << ref3 << endl; cout << &ref3 << endl; doSomething2(ref3); cout << ref3 << endl; cout << &ref3 << endl; doSomething4(ref3); cout << ref3 << endl; cout << &ref3 << endl; doSomething(90); doSomething2(90); doSomething4(90);//const ref를 함수 입력인자로 받으면 literal 직접 입력 가능 return 0;}
- 미해결홍정모의 따라하며 배우는 C++
4:04 코드 질문입니다.
변수 앞의 const는 "그 변수의 값"을 안바꾸겠다는 의미지만, 포인터 앞의 const는 "포인터가 저장한 주소값"을 안바꾸겠다는 게 아니라 "그 주소에 있는 값"을 안바꾸겠다는 것. 이라고 설명해주셨는데요.근데 그럼 아래 코드의 13~15째 줄과 충돌되는 내용인 거 아닌가요?14줄이 "ptr2에 저장된 주소값에 있는 값(=value2의 값 = 10)"을 안바꾸겠다는 의미인데, 15번째 줄에서 그걸 12로 변경이 가능한 거로 앞서 설명하셨어서요.게다가, 16번째 줄에 코딩한 대로 추가로 한줄 더 테스트 해보니 역참조로 값에 직접 접근해서 바꾸는 건 또 안되네요. 무슨 차이가 있는 건가요?아래 코드 캡쳐 내 주석 24~29번째 줄도 상술한 것과 같은 내용 질문입니다(강의 들으면서 바로바로 주석으로 적은 질문이라 말투가 좀 날 것 그대로네요..죄송합니다)
- 미해결홍정모의 따라하며 배우는 C++
9:03 코드 질문
delete 후 다시 ptr(주소값)과 *ptr(직접참조:value)를 출력하면, 강의와 달리 주소값부터 다르게 나옵니다. debug 모드로 돌리면 delete 이후 ptr의 주소값이 아예 달라지는데요. 컴파일러 버전에 따라 다른건가요? visual studio 2019 사용 중입니다.
- 미해결홍정모의 따라하며 배우는 C++
코드 작성한 것을 실행시킬 때 ctrl+f5, f5 둘 중 뭘 해야 하나요?
질문 그대로 코드 작성한 것을 실행시킬 때 디버깅하지 않고 시작(ctrl+f5)해서 실행이 되면 맞는 코드인 건가요? 저는 디버깅 시작(f5)을 하면 맞는 코드인데도 프로그램이 끝날 때 항상 exe_common.inl이 뜨면서 if (!__scrt_is_managed_app()) 이 부분에 예외가 발생했다고 떠요. 그래서 저는 그냥 이때까지 ctrl+f5로만 실행시켰었거든요...ㅜㅜ
- 미해결홍정모의 따라하며 배우는 C++
연습문제 질문
아래와 같이 연습문제를 풀어봤는데요(16번째 줄 Ptractice-while 출력 다음부터).16번째 줄 이전은 수업때 보여주신 출력 코드입니다.visual studio 2019 x64 쓰고있는데, 제가 보는 출력화면에서는 강의대로 입력한 코드에서 마지막 \0이 출력 안되고, jack jack만 출력됩니다.연습문제로 제가 구현한 코드도 jack jack만 출력되구요(마지막 \0 미출력) 컴파일러 버전에 따라 cout이 \0을 출력안하는 건가 싶은데 맞나요?? #include <iostream>using namespace std;int main() { char name[] = "jack jack"; const int n_name = sizeof(name) / sizeof(name[0]); char* ptr = name; for (int i = 0; i < n_name; i++) { cout << *(name + i); } cout << "--"; cout << endl << "----" << endl; cout << "Practice - while" << endl; int i = 0; while (true) { cout << *ptr; ++ptr; if (*ptr == '\0') break; } cout << "--"; return 0;}
- 미해결홍정모의 따라하며 배우는 C++
1:47 uintptr_t 질문입니다.
uintptr_t 가 hex로 반환되는 값을 unsigned int 10진수로 바꿔주는 것으로 알았는데요.직접 형변환을 해보니 값이 다르게 나오네요. 왜그런건가요?
- 해결됨홍정모의 따라하며 배우는 C++
소멸자, delete 질문
중요한 내용은 아닌 것 같지만 궁금해서 질문 올려봅니다.8:06 쯤에 작성한 코드 delete[] my_int_arr.m_arr;처럼 쓰지 않고, 클래스 안에서 소멸자와 함께 delete를 쓴다... 는 것은 이해했습니다.그런데 만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?
- 미해결홍정모의 따라하며 배우는 C++
9:56 getRandomNumber 함수 질문
getRandomNumber 함수를 보면,int getRandomNumber(int min, int max){const double fraction = 1.0/(RAND_MAX +1.0);return min+static_case<int>((max-min+1)*(rand()*fraction));} 으로 구현하셨는데요. 여기서 rand의 seed를 time을 이용해 바꾸지 않았으니 매번 실행할 때마다 같은 seed가 들어가서 같은 결과가 나올테니, getRandomNumber함수도 매번 실행할 때마다 같은 값이 나오게 될 것 같은데 맞나요?
- 미해결홍정모의 따라하며 배우는 C++
conditional operator 우선순위 질문
강의 마지막부분에서 int x = 5;cout << (x % 2 == 0) ? "even" : "odd" << endl;이 코드에서 가운데 출력부분에 전체 괄호를 감싸지 않으면 오류가 나는 이유를 생각해 보라고 해주셨는데 잘 모르겠어서 질문드립니다. 찾아보면 결합방향이 오른쪽에서 왼쪽이라고 되어있긴한데 오른쪽에서 왼쪽이라는게 저 위에 코드에서는 어떻게 적용이되는지가 이해가 잘 안되네요.. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 해결됨홍정모의 따라하며 배우는 C++
배열을 함수 내부에서 선언된 경우, 초기화했을 때의 기본값
배열을 함수 내부에서 선언된 경우, 초기화했을 때의 기본값을 출력할 때 그냥 출력하면 쓰레기값이 나오는데 for문을 이용해서 출력하면 다른 값으로 출력됩니다. 왜 차이가 발생하는 지 알 수 있을까요?
- 미해결홍정모의 따라하며 배우는 C++
이 수업 마지막에 lock() 이용해서 getname 하는 부분 질문입니다.
#include <iostream> #include <memory> #include <string> class Person { std::string m_name; //std::shared_ptr<Person> m_partner; std::weak_ptr<Person> m_partner; // ⭐⭐⭐ public: Person(const std::string& name) : m_name(name) { std::cout << m_name << " created\n"; } ~Person() { std::cout << m_name << " destroyed\n"; } friend bool partnerUp(std::shared_ptr<Person>& p1, std::shared_ptr<Person>& p2) { if (!p1 || !p2) return false; p1->m_partner = p2; p2->m_partner = p1; std::cout << p1->m_name << " is partnered with " << p2->m_name << "\n"; return true; } const std::shared_ptr<Person> getPartner() const // ⭐⭐⭐ { return m_partner.lock(); // ⭐⭐ lock 함수 실행 } const std::string& getName() const { return m_name; } }; int main() { auto lucy = std::make_shared<Person>("Lucy"); auto ricky = std::make_shared<Person>("Ricky"); partnerUp(lucy, ricky); std::cout << lucy->getPartner()->getName() << std::endl; return 0; }수업 중 마지막 코드 입니다. std::cout << lucy->getPartner()->getName() << std::endl;이 부분을 통해 Ricky를 출력하게 되는 과정을 다음과 같이 해석했는데 제가 해석한게 맞는지 확인 부탁드립니다.lucy->getPartner() 에서 lucy객체의 멤버 변수이자 weak_ptr인 m_partner의 lock()함수 호출한편 m_partner를 ricky라는 객체 역시 소유하고 있음(partnerUp함수로 인해)따라서 lock()는 ricky객체를 shared_ptr로 임시 변환해서 리턴오로지 weak_ptr로는 소유하고 있는 객체의 멤버에 접근하는 것이 불가능했지만 lucy->getPartner() 이런 방식으로 ricky라는 객체를 리턴하였고 따라서 ricky라는 객체의 맴버함수 및 맴버변수에 접근할 수 있게 되었다.1.저 코드 한줄에 대한 제 해석이 맞는지 확인 부탁드리고 2.혹시 lock()함수가 lucy객체의 멤버 함수지만 리턴한건 해당 객체의 멤버 변수(여기선 m_partner)를 해당 객체인 lucy객체와 공동으로 소유중인 ricky객체를 리턴했는데 그렇다면 lock함수는 자신이 속한 객체 이외에 공동으로 소유중인 또 다른 객체를 리턴한다로 이해해도 되겠습니까? 답변 부탁드립니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
3.9 답 공유?
2. myflags 0000option4 0001option5 0010 으로 가정했을 때, 첫번째 문제는 괄호안에 있는 것을 먼저 계산하면 0011 에서 ~(not)이니, 1100입니다. 두번째 문제는 연산자 우선순위로 각각에 ~을 먼저 계산 후 &를 풀면되는 데, 1110 & 1101으로 결과는 1100이 되니 결국 정답은 같습니다!
- 미해결홍정모의 따라하며 배우는 C++
22:15 두줄을 한줄로 할수 있다고 한 부분 답 질문!
비트 플래그 강의 중 22:15초 에 두 줄에서 한 줄로 줄여 사용할 수 있다고 한 부분이 있는 데,items_flag ^= opt2 | opt1;이거 맞나요???
- 해결됨홍정모의 따라하며 배우는 C++
얕은 복사시 소유권 박탈에 관한 질문
#include <iostream> //#include "autoptr.h" #include "autoptr2.h" #include "resource.h" #include "Timer.h" AutoPtr<Resource> generateResource() // AutoPtr<Resource> 타입을 리턴하는 함수 { // 10000000 의 length를 가진 Resource타입의 멤버를 가지는 AutoPtr 객체 생성 AutoPtr<Resource> res(new Resource(10000000)); return res; } int main() { using namespace std; streambuf* orig_buf = cout.rdbuf(); // cout.rdbuf(NULL); 화면에 출력되는 메세지들 끄기. 시간 어마어마하게 걸릴테니까 😎 Timer timer; { AutoPtr<Resource> main_res; main_res = generateResource(); // ⭐ generateResource() 리턴값은 R-value } cout.rdbuf(orig_buf); //cout << timer.elapsed() << endl; timer.elapsed();//실행시간 재서 출력 } 메인.cpp#pragma once #include <iostream> using namespace std; template<typename T> class AutoPtr { public: T* m_ptr; public: AutoPtr(T* ptr = nullptr) :m_ptr(ptr) { cout << "AutoPtr default constructor" << endl; } ~AutoPtr() { cout << "AutoPtr destructor" << endl; if (m_ptr != nullptr) delete m_ptr; } AutoPtr(AutoPtr&& a) // ⭐이동생성자⭐ : m_ptr(a.m_ptr) // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! { cout << "AutoPtr move constructor" << endl; a.m_ptr = nullptr; // really necessary? } AutoPtr& operator = (AutoPtr&& a) //R-value 레퍼런스 , ⭐*이동 대입 연산자 오버로딩⭐ { cout << "AutoPtr move assignment" << endl; if (&a == this) return *this; // 공간은 비워줘야하는 것 똑같고 (delete 안하고 그냥 대입하면 메모리 누수가 발생할 수 있다) if (m_ptr != nullptr) delete m_ptr; m_ptr = a.m_ptr; // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! a.m_ptr = nullptr; // 소유권 박탈 return *this; } T& operator *() const { return *m_ptr; } T* operator ->() const { return m_ptr; } bool inNull() const { return m_ptr == nullptr; } };AutoPtr.h#pragma once #include <iostream> using namespace std; class Resource { public: int* m_data = nullptr; unsigned m_length = 0; public: Resource() // 기본 생성자 { cout << "Resource constructed" << endl; } Resource(unsigned length) // 일반 매개변수 1개 생성자 { cout << "Resource length constructed" << endl; this->m_data = new int[length]; this->m_length = length; } Resource(const Resource& res) // 💎복사 생성자💎 { cout << "Resource copy constructed" << endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) // 내용물을 전부 깊은 복사 (시간이 꽤 걸림) m_data[i] = res.m_data[i]; } ~Resource() // 소멸자 { cout << "Resource destroyed" << endl; } Resource& operator = (Resource& res) // 💎대입 연산자 오버로딩💎 { cout << "Resource copy assignment" << endl; if (&res == this) return *this; // 대입하려는게 자기 자신이면 아무것도 안함 if (this->m_data != nullptr) delete[] m_data; // 1. 내 자신의 m_data 비워주기 m_length = res.m_length; // 2. 대입으로 넘겨받은 res의 length 로 내 length 갱신 m_data = new int[m_length]; // 3. 비워진 내 자신의 m_data에 새로운 공간 할당받기 for (unsigned i = 0; i < m_length; ++i) // 4. m_data내용물 넣기. m_data[i] = res.m_data[i]; // 대입으로 넘겨받은 res의 m_data 내용물들을 **내 m_data**에 깊은 복사 return *this; } };Resource.h 위 3코드는 수업에 나온 코드입니다. 얕은 복사시에 강사님께서 소유권 박탈의 목적으로 매개변수로 받은 참조 객체의 private변수인 포인터변수를 꼭 nullptr로 초기화를 해주는것이 깔끔하다고 하셨습니다.예를 들면AutoPtr(AutoPtr&& a) // ⭐이동생성자⭐ : m_ptr(a.m_ptr) // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! { cout << "AutoPtr move constructor" << endl; a.m_ptr = nullptr; // really necessary? }이나AutoPtr& operator = (AutoPtr&& a) //R-value 레퍼런스 , ⭐*이동 대입 연산자 오버로딩⭐ { cout << "AutoPtr move assignment" << endl; if (&a == this) return *this; // 공간은 비워줘야하는 것 똑같고 (delete 안하고 그냥 대입하면 메모리 누수가 발생할 수 있다) if (m_ptr != nullptr) delete m_ptr; m_ptr = a.m_ptr; // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! a.m_ptr = nullptr; // 소유권 박탈 return *this; }이 부분에서 a.m_ptr=nullptr;이렇게요. 질문1. nullptr로 초기화를 안시키면(소유권 박탈을 안하면) 문제가 생기나요?2.제가 찾아보니까 "박탈 시키지 않으면 대입 연산자 인수로 이 인스턴스를 참조 하게 된 매개 변수 AutoPtr && a가 대입 연산자 호출이 종료됨에 따라 소멸자가 호출되어 delete될 수 있기 때문이다." 라는 글을 어디서 봤는데 이게 무슨말인지 모르겠는데 맞는 말인가요??3.저 위의 코드에서 혹시 매개변수로 기능하는AutoPtr && a같은 매개변수 객체도 함수 호출시에정식적인 객체 처럼 생성자와 소멸자를 호출하나요?안하는걸로 알고있고 안하기 때문에 2번 질문이 이해가 안되서 질문하는거거든요.혹시 제가 햇갈리고 있나 싶어서 다시 질문드립니다.
- 해결됨홍정모의 따라하며 배우는 C++
수업시간 코드인데 결과값이 왜 이렇게 나오는지 궁금합니다.
#include <iostream> #include "autoptr.h" //#include "autoptr2.h" #include "resource.h" #include "Timer.h" AutoPtr<Resource> generateResource() // AutoPtr<Resource> 타입을 리턴하는 함수 { // 10000000 의 length를 가진 Resource타입의 멤버를 가지는 AutoPtr 객체 생성 AutoPtr<Resource> res(new Resource(10000000)); return res; } int main() { using namespace std; streambuf* orig_buf = cout.rdbuf(); // cout.rdbuf(NULL); 화면에 출력되는 메세지들 끄기. 시간 어마어마하게 걸릴테니까 😎 Timer timer; { AutoPtr<Resource> main_res; main_res = generateResource(); // ⭐ generateResource() 리턴값은 R-value } cout.rdbuf(orig_buf); //cout << timer.elapsed() << endl; timer.elapsed();//실행시간 재서 출력 }메인.cpp#pragma once #include <iostream> using namespace std; template<typename T> class AutoPtr { public: T* m_ptr; public: AutoPtr(T* ptr = nullptr) :m_ptr(ptr) { cout << "AutoPtr default constructor" << endl; } ~AutoPtr() { cout << "AutoPtr destructor" << endl; if (m_ptr != nullptr) delete m_ptr; } AutoPtr(const AutoPtr& a) // 💎복사 생성자💎 { cout << "AutoPtr copy constructor" << endl; // deep copy m_ptr = new T; // T가 Resource 타입으로 들어오면 m_ptr은 Resource 타입의 포인터 *m_ptr = *a.m_ptr; // ⭐Resource의 '대입 연산자 오버로딩 호출 , deep copy } AutoPtr& operator = (const AutoPtr& a) //L-value 레퍼런스 , 💎대입 연산자 오버로딩💎 { cout << "AutoPtr copy assignment" << endl; if (&a == this) return *this; if (m_ptr != nullptr) delete m_ptr; // deep copy m_ptr = new T; // 새로운 빈 공간 할당 받기. T가 Resource 타입으로 들어오면 m_ptr은 Resource 타입의 포인터 *m_ptr = *a.m_ptr; // ⭐Resource의 '대입 연산자 오버로딩' 호출 , deep copy return *this; } T& operator *() const { return *m_ptr; } T* operator ->() const { return m_ptr; } bool inNull() const { return m_ptr == nullptr; } };AutoPtr 헤더파일#pragma once #include <iostream> using namespace std; class Resource { public: int* m_data = nullptr; unsigned m_length = 0; public: Resource() // 기본 생성자 { cout << "Resource constructed" << endl; } Resource(unsigned length) // 일반 매개변수 1개 생성자 { cout << "Resource length constructed" << endl; this->m_data = new int[length]; this->m_length = length; } Resource(const Resource& res) // 💎복사 생성자💎 { cout << "Resource copy constructed" << endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) // 내용물을 전부 깊은 복사 (시간이 꽤 걸림) m_data[i] = res.m_data[i]; } ~Resource() // 소멸자 { cout << "Resource destroyed" << endl; } Resource& operator = (Resource& res) // 💎대입 연산자 오버로딩💎 { cout << "Resource copy assignment" << endl; if (&res == this) return *this; // 대입하려는게 자기 자신이면 아무것도 안함 if (this->m_data != nullptr) delete[] m_data; // 1. 내 자신의 m_data 비워주기 m_length = res.m_length; // 2. 대입으로 넘겨받은 res의 length 로 내 length 갱신 m_data = new int[m_length]; // 3. 비워진 내 자신의 m_data에 새로운 공간 할당받기 for (unsigned i = 0; i < m_length; ++i) // 4. m_data내용물 넣기. m_data[i] = res.m_data[i]; // 대입으로 넘겨받은 res의 m_data 내용물들을 **내 m_data**에 깊은 복사 return *this; } };Resource헤더파일 결과값이AutoPtr default constructorResource length constructedAutoPtr default constructorAutoPtr copy assignmentResource constructedResource copy assignmentAutoPtr destructorResource destroyedAutoPtr destructorResource destroyed 이렇게 나왔습니다.여기서 궁금한점은 소멸자 출력문구 순서인데요디버깅을 해봤는데Timer timer;{AutoPtr<Resource> main_res;main_res = generateResource();}이 지역범위를 벗어나고 소멸자 호출을 시작하는데 정확히 main_res = generateResource(); 이부분에서AutoPtr destructorResource destroyedAutoPtr destructorResource destroyed이 4번의 소멸자가 호출됩니다. 그에 대한 설명을 나름 추리해봤는데 제 설명이 맞는지 확인해주시고 혹시 틀렸다면 정확히 어떤점에서 틀렸고 어떠한 근거로 저 소멸자호출문구가 출력 되는건지 알려주실 수 있나요? 저의 설명==================================AutoPtr destructor >>> generateResource() 함수의 리턴 값인 res를 블럭이 끝나면서 소멸자로 할당값을 해제해주는 과정에서 소멸자 호출 Resource destroyed >>> 소멸자 호출 문구 출력 이후 if (m_ptr != nullptr) delete m_ptr; 구문 실행과정에서 m_ptr이 resource타입이니까 삭제시에 resource 소멸자 호출 AutoPtr destructor >>> main_res 역시 해제하기 위해 autoptr의 소멸자 호출 Resource destroyed >>>소멸자 호출 문구 출력 이후 if (m_ptr != nullptr) delete m_ptr; 구문 실행과정에서m_ptr이 resource타입이니까 삭제시에 resource 소멸자 호출
- 미해결홍정모의 따라하며 배우는 C++
3.8 퀴즈 답
0110 >> 2 -> decimal답 : 1.....영상에서는 앞에 0을 붙여서 8진수로 계산되어 18이 되는 데, 2진수를 나타낸 문제로 파악하여 답은 1입니다.5 | 12 답 : 1101 (십진수로 13)5 & 12답 : 0100 (십진수로 4)5 ^ 12답 : 1001 (십진수로 9)
- 미해결홍정모의 따라하며 배우는 C++
3.7 이진수 영상 마지막 연습 문제 답 이거 맞나요??
이진수 0100 1101을 10진수로답 : 7710진수 93을 8비트 무부호 정수로답 : 0101 110110진수 -93을 8비트 부호 정수로답 : 1010 00112진수 1010 0010을 무부호 10진수로답 : 162(8번째자리도 해당 되기 때문)같은 2진수를 부호가 있는 10진수로답 : -93(8번째 자리는 부호이기 때문에 제외, 2의 보수 형태로 보기는 어렵기 때문에, 양수로 전환후, - 붙임)
- 미해결홍정모의 따라하며 배우는 C++
8:30 printcolorName 함수 switch case 통해 구현 시 질문입니다.
printcolorName 함수를 switch case 구문으로 구현해놓고,main 함수에서 int 형태의 입력 x를 받아 printcolorName(x) 함수를 돌렸는데요. C2664(인수 타입변환 에러)가 발생합니다.인수 x 를 printcolorName함수 입력 자료형인 COLORS로 형변환 하고, printcolorName 함수 내에서 switch case 구문을 이용하기 위해 다시 이 인수를 int로 형변환 하니 정상 실행되네요. 강의에서 알려주신 대로 case에 COLOR 자료형을 직접 넣는것과 별개로, 이렇게 형변환을 거듭해서 사용해도 문제는 없나요?강의에서는 main 함수에서도 int 형 인수가 아닌 COLORS::BLACK를 써서 간단한 것 같긴 한데요.. #include <iostream>using namespace std;enum class COLORS{BLACK,WHITE,RED,GREEN,BLUE,};void PrintColorName(COLORS color) {/*if (color == COLORS::BLACK) cout << "Black" << endl;else if (color == COLORS::WHITE) cout << "White" << endl;else if (color == COLORS::RED) cout << "Red" << endl;...이런식으로 모든 경우에 대해 else if 쓰는 건 너무 불편이때 switch case 문 활용*/switch (static_cast<int>(color)) {case 0:cout << "Black";break;case 1:cout << "White";break;case 2:cout << "Red";break;case 3:cout << "Green";break;case 4:cout << "Blue";break;}}int main() {//PrintColorName(COLORS::BLACK);int x;cin >> x;PrintColorName(static_cast<COLORS>(x));return 0;}
- 미해결홍정모의 따라하며 배우는 C++
8:14부근 코드 질문입니다.
if문 조건부에 constant 1을 넣어서 무조건 실행되게 하면, if문 전 main 함수에 의해 int x=10이 설정되고 cin으로 임의 입력값을 받는데요.이 다음에 if문이 실행되면, 또다시 int x =5를 선언하는데 왜 에러가 안나나요? 같은 변수명 x를 중복선언하는 것 아닌가요?if문 안의 실행부가 x=5이면 이전에 선언해놨던 x에 값만 5로 대입하는 것으로 이해가 되는데요.새로 int x를 또 선언하는데 중복에러가 안나는 이유가 궁금합니다. 아래는 그 코드입니다. #include <iostream>using namespace std;int main() { int x=10; cin >> x; if (x > 10) cout << x << " is greater than 10" << endl; else cout << x << " is not greater than 10" << endl; cout << endl; if (1) int x = 5; else int x = 6; cout << x << endl; return 0;}
- 미해결홍정모의 따라하며 배우는 C++
constexpr을 사용했을때의 장점
2.9강 9:10초 정도부터 컴파일 내에서 정해지는 상수를 정의할때 constexpr을 사용할 수 있다고 하셨는데 const말고 constexpr을 사용 했을때 장점이 무엇인가요?제가 생각했을때의 장점은 런타임중에 정해지는 상수에만 const를 쓰니까 컴파일중 정해지는 상수와 좀더 쉽게 구분할수 있다...정도인데 이게 constexpr을 쓰는 이유가 맞나요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.