월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C++
안녕하세요! 내부 클래스를 통해 정적 클래스변수를 초기화하는 방법에 질문 있습니다.
안녕하세요! 항상 좋은강의해주셔서 감사합니다. 내부 클래스를 통해 정적 클래스변수를 초기화하는 방법에서 잘 이해가 가지 않는 부분이 있어 질문 드립니다. 강의에서 Something::_init Something::s_initializer; 를 통해 정적클래스 변수를 초기화 하였는데, 굳이 클래스 내부의 Something::s_initializer 를 통해 _init의 생성자를 실행시키지 않고 Something::_init sti; 와 같이 별도의 전역 인스턴스 생성을 통해서도 초기화가 됨에도 굳이 클래스 내부에Something::s_initializer 를 생성하고 사용하는 이유가 궁금합니다. _init 클래스 인스턴스를 Something 클래스 내부에 두어 보다 잘 관리하는 것 외에 혹시 다른 이유가 있나요?
- 미해결홍정모의 따라하며 배우는 C++
5.9 난수 만들기 rand() 와 srand()
난수를 만드는 과정에서 #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int main(){ srand(time(NULL)); int a= rand() + 10; cout << a; } 이렇다면 a는 0~10까지의 난수를 생성하는 것으로 알고 있습니다. 그런데, srand(time(NULL)); 와 #include<ctime>이 없더라도, 0~10까지의 난수가 생성되는 것 아닌가요..? 만약 맞다면, srand(time(NULL)); 의 사용 이유가 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
[12:40] Rvalue 참조 생성자 질문
안녕하세요! 디버거 찍어보다가 모르는 부분이있어 질문드립니다. AutoPtr<Resource> generateResource() { AutoPtr<Resource> res(new Resource(10000000)); return res; } generateResource() 함수에서 return res; 부분에서 res를 리턴을 하게 되어있는데 여기서 디버거를 찍어보니 AutoPtr 클래스의 AutoPtr(AutoPtr&& a) rvalue를 오버로딩하는 함수로 진입이 되더라구요. AutoPtr(AutoPtr&& a)에서 어떻게 함수 파라메터로 들어오는지 잘 모르겠어요 ㅠㅠ
- 미해결홍정모의 따라하며 배우는 C++
아래 질문에 제 코드 첨부하겠습니다. 죄송합니다!
<main source> #include "AutoPtr.h" #include "Resource.h" #include <utility> //std::move #include <vector> #include <string> template<class T> void MySwap(T &a, T &b) { T tmp = a; a = b; b = tmp; /*T tmp{ std::move(a) }; a = std::move(b); b = std::move(tmp);*/ } int main() { using namespace std; //예제2) { AutoPtr<Resource> res1(new Resource(3)); res1.setAll(3); AutoPtr<Resource> res2(new Resource(5)); res2.setAll(5); MySwap(res1, res2); res1->print(); res2->print(); } } *************************************************** <Resource> #include <iostream> class Resource { //private: public: int *m_data = nullptr; unsigned m_length = 0; public: Resource() { std::cout << "Resource default constructed" << std::endl; } Resource(unsigned length) { std::cout << "Resource length constructed" << std::endl; this->m_data = new int[length]; this->m_length = length; } //깊은 복사 Resource(const Resource &res) { std::cout << "Resource copy constructed" << std::endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) m_data[i] = res.m_data[i]; } //소멸자 ~Resource() { std::cout << "Resource destroyed" << std::endl; if (m_data != nullptr) delete[] m_data; } Resource & operator = (Resource &res) { std::cout << "Resource copy assignment" << std::endl; if (&res == this) return *this; if (this->m_data != nullptr) delete[] m_data; m_length = res.m_length; m_data = new int[m_length]; for (unsigned i = 0; i < m_length; ++i) m_data[i] = res.m_data[i]; return *this; } void print() { for(unsigned i = 0; i < m_length; ++i) std::cout << m_data[i] << " "; std::cout << std::endl; } void setAll(const int& v) { for (unsigned i = 0; i < m_length; ++i) m_data[i] = v; } }; *************************************************** <Autoptr> #include <iostream> template<class T> class AutoPtr { //private: public: T *m_ptr; public: AutoPtr(T*ptr = nullptr) :m_ptr(ptr) { std::cout << "AutoPtr default constructor" << std::endl; } ~AutoPtr() { std::cout << "AutoPtr destructor" << std::endl; if (m_ptr != nullptr) delete m_ptr; } //copy constructor AutoPtr(const AutoPtr& a) { std::cout << "AutoPtr copy constructor" << std::endl; //deep copy m_ptr = new T; *m_ptr = *a.m_ptr; } //copy assignment AutoPtr& operator = (const AutoPtr& a) { std::cout << "AutoPtr copy assignment" << std::endl; if (&a == this) //prevent self-assignment return *this; if (m_ptr != nullptr) delete[] m_ptr; //deep copy m_ptr = new T; *m_ptr = *a.m_ptr; return *this; } //copy constructor나 copy assignment operator을 강제로 사용하지 않게 할 때 //AutoPtr(const AutoPtr& a) = delete; //AutoPtr& operator=(const AutoPtr& a) = delete; AutoPtr(AutoPtr&& a) :m_ptr(a.m_ptr) { a.m_ptr = nullptr; std::cout << "AutoPtr move constructor" << std::endl; } AutoPtr& operator=(AutoPtr&& a) { std::cout << "AutoPtr move assignment" << std::endl; if (&a == this) //prevent self-assignment return *this; if (!m_ptr) delete m_ptr; //shallow copy //모든 것을 다 복사해서 넣는 것이 아니고, 첫 주소를 넣으면 되기 때문에 속도가 빠르다. m_ptr = a.m_ptr; a.m_ptr = nullptr; return *this; } T& operator*() const { return *m_ptr; } };
- 미해결홍정모의 따라하며 배우는 C++
[5:21}정도에 에러
이 부분에서 res1과 res2가 'expression must have pointer type'이라고 오류가 나옵니다.. 오류의 원인을 알 수 있을까요?
- 미해결홍정모의 따라하며 배우는 C++
[15:48] 복사 생성자 필요한지?
안녕하세요! 항상 답변 감사드립니다. AutoPtr 클래스에서 복사생성자가 구현되어있는데 이 복사생성자는 이 코드에서 쓸모가 없는 코드가 아닌가요..? (아래 대입연산자 오버로드가 되어있으므로)
- 미해결홍정모의 따라하며 배우는 C++
연습문제에는 없지만 궁금해서 여쭤봅니다!
안녕하십니까. 평소처럼 듣고 있었는데 마지막 문제를 풀고 나니 문제와는 상관없는 쓸데없는 생각이 들었습니다. 1. 1010 0010(2) 의 경우 unsigned일 때 162가 되고, 이를 signed 형으로 표현하고자 한다면 단순히 더 큰 byte의 자료형을 사용하면 되는 것입니까? 2. 그렇다면 2byte signed를 사용한다는 가정하에 이를 0000 0000 1010 0010(2) 으로 작성하는 것이 옳은 표현 방법인지도 궁금합니다. 당연히 162를 표현하는 데에 있어서는 1byte unsigned를 활용하는 것이 합리적이라고 생각합니다. 그러나 실제 사용하는 int 자료형의 경우 이미 4byte를 차지하고, signed와 unsigned 양쪽 모두 엄청나게 큰 수의 연산에서 2배 정도의 차이는 별 의미가 없는 범위 차이라는 생각이 들었습니다. 이러한 경우에도 마찬가지로 단순히 더 많은 byte할당으로만 극복을 하는 것이 가장 직관적이고 손쉬운 해결방안인지 1번 질문을 통해 어렴풋이 알고 싶었습니다. 답변 기다리겠습니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
7.3 참조에 의한 인수 전달 (2:55)
2분 55초 내용입니다. 선생님께서 call by reference의 경우 주소 자체를 넘기기 때문에 "복사"가 이루어지지 않는다고 하셨는데, 여기서 "복사"의 의미를 잘 모르겠습니다. void addOne( int &y) 대신 void addOne( int y)을 사용할 때, main 함수 안에 int x = 5; 라는 argument 가 void addOne(int y)에 parameter로 대입되어 들어가는 경우를 "복사"라고 말씀하신 것인가요? 감사합니다 :)
- 미해결홍정모의 따라하며 배우는 C++
8:11 질문 있습니다.
제가 정확히 이해를 한건지 확인차 질문 드립니다. int(Something:: * fptr1)() = s1.temp; 이 부분이 오류가 생기는 이유가 static member function의 주소는 항상 하나인데 s1과 s2를 나눠서 호출했기 때문에 오루가 발생한게 맞나요? 글로 적어보니까 제가 이해한 것이 아닌거 같은 느낌이 드네요. 왜 오류가 생기는 걸까요? 강의 내용만으로는 이해를 잘 못하겠네요.
- 미해결홍정모의 따라하며 배우는 C++
함수 parameter
안녕하세요, 좋은 강의 해주셔서 감사합니다. 질문드리고 싶은 것이 있는데, 예를 들어 int nothing(int x = 1, int y=2, int z=3);같은 함수가 정의되어 있을 때, x와 z는 디폴트 값을 사용하고 y만 다른 값으로 변경한 함수를 활용하고 싶으면 어떻게 하여야 하나요? python의 경우 nothing(y = 3)같은 식으로 활용이 가능했는데 c++은 아닌 것 같아서 질문 드립니다.
- 미해결홍정모의 따라하며 배우는 C++
array에대한 간단한 질문있습니다!
6분쯤 이미 using namespace std;라는 이름공간을 설정하셨는데 array선언하실 때 array가아닌 std::array로 하신지 궁금합니다!
- 미해결홍정모의 따라하며 배우는 C++
9:00경 copy constructor 질문드립니다.
deduging으로 하나하나씩 찍어보는 장면에서 const Something somthing은 Something() 생성자를 호출하고 print(something)은 Something(const Something&st_in)인 copy constructor를 호출하는 것을 확인했습니다. 비슷한 질문자분의 질문을 참고해서 copy constructor가 호출되는 것은 함수 overloading때문에 그런 것이라고 어렴풋이 납득이 갔지만 의문이 좀 남아서, copy constructor의 정의부를 빼고 다실 de buging을 해보았는데 오류 없이 잘 작동이 되고, 전에 debuging했을 때 copy constructor에서 처리되던 것이 그냥 constructor에서 처리되는 것을 확인했습니다. 이게 오류 없이 돌아간다면, 함수 overloading은 대체 어떤 근거로 돌아가는 것이며, copy constructor는 왜 쓰는 것인지 잘 모르겠습니다. 조잡한 글 읽어주셔서 감사합니다. 더 열심히 공부하는 것이 보답하는 길이라고 생각하겠습니다. 좋은 강의 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
클래스 내 함수 리턴값 질문
안녕하세요! 혼자 구현하면서 궁금한 점이 생겨 질문드립니다. 함수 기능 자체에서 포인터로 구현되는 것들은 리턴값을 굳이 IntArray&로 하지않고 void로 해도 상관없지 않는가 해서 질문남깁니다... 예를들어 void push_back(const int& value) { resize(m_length + 1); m_data[m_length - 1] = value; //return *this; } 리턴값을 void 처리해도 기능은 똑같이 구현되어서요..
- 미해결홍정모의 따라하며 배우는 C++
namespace 관련 질문
안녕하세요 좋은 강의 감사드립니다. namespace와 external variable 관련해서 질문하고 싶은 것이 있는데, 강의에서 보면 namespace 내에 external variable을 정의한 cpp파일을 작성한 후 헤더파일에서 동일한 명칭의 namespace를 정의한 후 external variable을 선언해 주었는데요, 그랬을 때 cpp 파일에서의 namespace와 헤더파일에서의 namespace도 동일한 것이라고 볼 수 있는 것인가요? 아니면 서로 다른 것이지만 내부의 변수가 constants::pi로 동일한 이름을 가지고 있기 때문에 external variable 선언이 가능한 것인가요?
- 미해결홍정모의 따라하며 배우는 C++
9.8[3:40] Dollar -> cents 변환 문제
안녕하세요, Cents 클래스와 Dollar클래스를 이용하여 Dollar -> cents로 변환을 하고있는데, 메인함수에서 Cents cents = dol; 이 부분이 잘 이해가 가지 않습니다. 제가 이해한 프로세스가 1 .Dollar dol(3); 으로 선언 2. Dollar 클래스 안에 operator Cents()로 Cents로 형변환 오버로딩이 실행되서 dol(3)의 타입이 Cents가 됨. 3. 따라서, 메인함수의 cents객체에 대입 가능 (Cents가 사용자 정의 타입이므로) 제가 이해한게 맞나요..?
- 해결됨홍정모의 따라하며 배우는 C++
[3:21]전위/후위증가 오버로딩 구별 질문(dummy)
안녕하세요! 항상 감사드립니다. 3:21경에 전위/후위증가 연산자 오버로딩의 구별을 매개변수에 int라는 더미를 넣어 오버로딩을 한다고 설명해 주셨는데, 메인 함수의 ++d와 d++이 어떻게 더미에 의해 구별이 되는지 궁금합니다. 디버거를 돌려봐도 잘 이해가 가지 않네요.. (아니면 그냥 암기해야하는 부분인지...)
- 미해결홍정모의 따라하며 배우는 C++
포인터 개념 질문드립니다
안녕하세요 교수님 바쁘신데도 직접 답변주셔서 감사합니다. 6.8의 12분14초에 궁금한게 있습니다. x86을 기준으로 ptr이 포인터이므로 저는 *ptr 과 *(ptr+4) 가 배열의 인접 값이라고 생각하였는데 *(ptr+1)이 다음값이 어떻게 되는건가요? 궁금해서 아래 코드로 써봤는데 각각 주소를 출력할때는 4차이가 맞는데 빼보니까 또 1이라고 합니다. 제가 어떤 개념이 잘못된것인지 궁금합니다. 감사합니다 #include <iostream> using namespace std; int main() { int array[5] = { 11,12,13,14,15, }; int* ptr = array; cout << *ptr << " " << *(ptr + 1) << endl; // +4를 해야 다음 index로 넘어갈것이라고 생각했는데 1로 넘어감 cout << (int)&ptr[1] << " " << (int)&ptr[0] << endl; //주소 차이는4 cout << &ptr[1] - &ptr[0] << endl; //차이를 찍어보면 1 return 0; }
- 해결됨홍정모의 따라하며 배우는 C++
call by reference 관련 질문입니다
9분 09초 쯤에 getSinCos(double degrees , double &sin_out, double &cos_out) 함수에서 double degrees 부분을 const double °rees로 바꾸셨는데요 궁금한것은 main함수 안에서 getSinCos(..)안의 argment중 degrees부분에 바로 상수를 넣어준다면(ex : getSinCos(30, ...) double degrees에서 const double& degrees로 바꾸지 않아도 효율?의 차이는 별로 없지 않을까 생각되는데 제 생각이 맞을까요? 아니면 degrees를 상수로 넣어준다고 해도 그것에 의해 메모리가 할당되면서 좀 더 효율이 안좋아지나요?
- 미해결홍정모의 따라하며 배우는 C++
위임 생성자 전방선언에 대한 질문입니다.
4분쯤 위임 생성자 코드 :Student(0, name_in)에서 상수와 문자열을 매개변수로 하는 생성자는 Student(0,name_in)보다 아래에 정의되어 있는데 컴파일러 입장에서 전방선언이 없어도 에러가 나지 않는 이유가 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
isEven, isOdd 함수 관련 질문입니다
12분 쯤에 함수포인터를 이용해서 true를 리턴하는 함수인 isEven과 isOdd가 있습니다.(이때는 return false가 없습니다 오직 조건이 맞을때 true만 리턴) 이것을 이용해서 값을 출력 해보니 isOdd일떈 1, 3, 5, 7, 9가 출력이 되지만 isEven이면 0,1,2,3,4,5,6,7,8,9 즉 배열이 다 출력이 됩니다 디버거로 찍어보니까 isOdd는 0일땐 false 1일땐 true 이런식으로 홀수일땐 true, 짝수일떈 false가 반환이 되지만 isEven 함수는 짝수, 홀수 구분없이 모두 true가 반환이 됩니다. 밑에 비슷한 질문이 있어서 보니까 cpu 산술연산에 의해 그렇다 라고 답변이 되어있는데 그렇다면 isOdd를 사용할시 0을 제외한 1부터 9까지는 모두 true가 반환되어야하는게 아닌가요? 잘 이해가 안되서 질문드립니다