월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결홍정모의 따라하며 배우는 C++
강의내용중 질문이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1. 클래스의 멤버함수 정의 할 때 인스턴스의 이름을 출력하게 하는 방법이 있는지 궁금합니다. 예를 들어서 Student s1; 을 정의하고 나서 s1.function(); 을 수행하면 "s1" 처럼 인스턴스의 이름을 출력하게 하는 기능이 있는지 궁금합니다. 2. string getName() { return m_name;} 을 수행할 때 const를 붙이지 않으면 안되는 이유가 궁금합니다. (string getName() const 라고 해야만 되는 이유) 3. 출력 연산자 오버라이딩 할때 friend ostream & ... 에서도 마찬가지로 '&' 를 붙이지 않으면 기능하지 않는 이유에 대해서도 궁금합니다 감사합니다
- 미해결홍정모의 따라하며 배우는 C++
네임스페이스
namespace를 myspace1 과 myspace2 를 줬을때는 main에서 usingnamespace myspace1을 준뒤, 코드를 실행해 보면 오버라이딩이 안 일어나고 정상적으로 실행이 되는데, namepace를 한개만 주고 main함수에서 using namespace myspace1을 준 뒤 코드를 실행했을때 오버라이딩이 일어나는 이유가 궁금합니다. 코드 첨부하였습니다! #include <iostream> using namespace std; namespace Myspace1 { int doSomething(int a, int b) { return a + b ; } } int doSomething(int a, int b) { return a * b; } int main() { using namespace Myspace1; cout << doSomething(3, 4) << endl; return 0; } #include <iostream> using namespace std; namespace Myspace1 { int doSomething(int a, int b) { return a + b ; } } namespace Myspace2 { int doSomething(int a, int b) { return a * b; } } int main() { using namespace Myspace1; cout << doSomething(3, 4) << endl; return 0; }
- 해결됨홍정모의 따라하며 배우는 C++
7:50 생성자 관련 질문드려요
안녕하세요? 7:50 에 교수님께서 생성자가 파라미터가 하나도 없는 경우에만 괄호를 항상 빼도록 되어있다고 하셨습니다. 그런데 괄호를 붙이고 빌드를 해보니, 아무런 에러나 경고가 뜨지 않았습니다. 괄호를 빼는것이 에러가 떠야 하는건데 제 컴파일러가 잡아내지 못한것인지, 아니면 프로그래머끼리의 약속인지 궁금합니다. 항상 감사드립니다.
- 미해결홍정모의 따라하며 배우는 C++
struct 나 class스 선언뒤에 }; 이두기호 사이에 무언가가 삽입?되는게 궁금합니다
typedef struct tagData { }Data; 이렇게 쓰여진 코드를 봤는데 저뒤에 Data 가 무엇인지 그리고 클래스같은곳에서도 이렇게 쓰이는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
2분39초에
삭제된 글입니다
- 해결됨홍정모의 따라하며 배우는 C++
데이터 영역 관련 질문드립니다.
데이터 영역은 initialized data와 uninitialized data로 나뉜다는 것을 알게되었습니다. 그런데 왜 데이터만 두가지 경우로 나뉘어져있나요? 나뉘어졌을 때 어떤 이점이 생기는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
대입연산자 오버로딩 리턴형
클래스내에 deep copy를 하는 복사 생성자와 deep copy를 하는 대입연산자가 있다면 deep copy를 한다는 측면에서는 기능이 갔다고볼수있습니다. 대입연산자를 오버로드 할때 카피생성자 처럼 리턴형이 없이 void operator= (....) 해도 데이터를 복사하는 데에는 이상이 없는데 레퍼런스로 리턴해주는 이유라도있나요? 코드도 첨부합니다 class String { private: char* m_data = nullptr; unsigned m_length = 0; public: String() {} String(const char* source) { //assert(source); m_length = strlen(source) + 1; m_data = new char[m_length]; data_copy(source); } String(const String& source) { cout << "카피생성자" << endl; deep_copy(source); } String& operator=(const String& source) { cout << "대입연산자" << endl; if (m_data == source.m_data) return *this; delete[] m_data; deep_copy(source); return *this; } void deep_copy(const String& source) { m_length = source.m_length; if (source.m_data != nullptr) { m_data = new char[m_length]; data_copy(source.m_data); } else m_data = nullptr; } void data_copy(const char* source) { for (unsigned i = 0; i < m_length; ++i) { m_data[i] = source[i]; } } };
- 미해결홍정모의 따라하며 배우는 C++
버퍼 오버런 관련 질문 합니다.
강의에서는 생성자에서 다른 생성자를 호출하는식으로 코드를 작성하였습니다. 그런데, 호출되는 생성자의 코드를 똑같이 적어주는 방식으로하면 컴파일러가 버퍼오버런 경고를 띄어줍니다 그래서 std::vector, std::array, initializer_list, 정적배열 로 실험을 해보았는데, 벡터와 이니셜라이저리스트에서는 똑같은 경고를 띄어주더라구요.. 이런 경고를 띄어주는 이유와, 해결 방법에 대해 질문합니다. vs2019 , 디버그모드입니다.감사합니다 아래 코드를 첨부합니다. 코드를 긁어서 복사하시면 더 편하게 질문을 이해하실 수 있습니다. //강의에서 사용된 코드 #include <initializer_list> #include <vector> #include <array> class My_array { private: unsigned m_length = 0; int* m_ptr = nullptr; public: My_array() {} My_array(const unsigned& length) { m_length = length; m_ptr = new int[m_length]; } My_array(const std::initializer_list<int>& list) //:My_array(list.size()) { //생성자를 호출하지않고 생성자와 똑같은 코드를 적어줌 m_length = list.size(); m_ptr = new int[m_length]; unsigned i = 0; for (const auto& e : list) { m_ptr[i] = e; ++i; } } }; //여기서부터 실험 코드 void print(int* ptr); int main() { //동적 할당을 받은후 정적배열의 데이터들을 복사 int arr[]{ 1,2,3,4,5 }; const int length_arr = sizeof(arr) / sizeof(arr[0]); int* ptr_arr = new int[length_arr]; unsigned i = 0; for (const auto& e : arr) { ptr_arr[i] = e; ++i; } print(ptr_arr); //동적할당을 받은후 std::array의 데이터들을 복사 std::array<int, 5> stdArr {1, 2, 3, 4, 5, }; int* ptr_stdArr = new int[stdArr.size()]; i = 0; for (const auto& e : stdArr) { ptr_stdArr[i] = e; ++i; } print(ptr_stdArr); //동적할당을 받은후 initializer list의 데이터들을 복사 auto list={ 1,2,3,4,5 }; int* ptr_list = new int[list.size()]; i = 0; for (const auto& e : list) { ptr_list[i] = e; ++i; } print(ptr_list); //동적 할당을 받은후 벡터의 데이터들을 복사 std::vector<int> my_vec{ 1,2,3,4,5 }; int* ptr_vec = new int[my_vec.size()]; i = 0; for (const auto& e : my_vec) { ptr_vec[i] = e; ++i; } print(ptr_vec); return 0; } void print(int* ptr) { for (unsigned i = 0; i < 5 ;++i) { cout << ptr[i] << " "; } cout << endl; }
- 해결됨홍정모의 따라하며 배우는 C++
13:50 질문드립니다.
#include <iostream> #include <array> using namespace std; int& get(array<int, 100>& my_array, int idx) { return my_array[idx]; } int main() { array<int, 100> my_array; my_array[30] = 10; get(my_array, 30) = 1024; return 0; } 강의 13:50 내용입니다. get(my_array, 30) = 1024; 여기서 get함수가 레퍼런스로 반환이 되는데, 참조자의 우변에는 L-Value가 들어가야 한다고 알고있습니다. 그래서 1024가 들어갈 수 없다고 알고있었는데 여기선 실행이 잘 돼서 헷갈립니다. const 참조자로 반환된것도아닌데 어떻게 가능한건가요?
- 해결됨홍정모의 따라하며 배우는 C++
17:34 질문드립니다.
17:34에서 교수님께서 "std::array와 std::vector을 사용해서 보내면 데이터타입을 보내는것과 같다" 라고 하셨는데 어떤 의미인지 잘 모르겠습니다.
- 미해결홍정모의 따라하며 배우는 C++
동적할당 배열 관련 질문드립니다.
안녕하세요? 강의 7:20 에 보면 배열의 길이를 넣어 주지 않으면 빌드에서 오류가 뜨는데, 제가 직접 해보니 빌드도 오류가 없고 실행도 이상없이 됩니다. 시간이 흐른뒤 버전이 업데이트돼서 배열의 길이를 넣지않아도 컴파일이 처리해주는건지 궁금합니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
동적할당 질문
퍼블릭 문에보게되면 m_arr = new int[m_length]; 로 초기화를 해주고있는데 동적할당에서 new문을쓸때 주소값을 반환해주는거라서 포인터로 받아야하는거 아닌가요? *m_arr = new int[m_length]; 처럼요
- 해결됨홍정모의 따라하며 배우는 C++
배열이름 포인터 관련 질문드립니다.
안녕하세요? 강의를 보다가 궁금한 점이 생겨 질문드립니다. Q1. 10번줄과 15번줄을 비교했을 때, 둘 다 배열의 이름을 넣었지만 전자는 주소값이 출력이 되고 후자는 문자열이 출력되는 이유가 궁금합니다. (아마 타입형이 달라서 이러한 결과가 나타는것 같은데 어떠한 원리인지 궁금합니다.) Q2. 8번줄과 13번줄을 비교했을때, 전자는 주소값이 출력이 되고 후자는 문자열이 출력되는 이유가 궁금합니다. (13줄은 배열의 첫번째요소에 &를 붙였으니 주소값이 출력될것을 기대하고있었는데 문자열이 출력되었습니다.) Q3. C언어의 printf는 출력할때 서식문자를 지정했지만, C++의 cout은 서식문자를 지정하지 않고있습니다. cout이 내부적으로 어떻게 값을 출력하는지 궁금합니다. 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C++
delete 전과 후의 주소값이 동일한 이유가 궁금합니다.
6.11 강의 중 아래 코드에서 궁금한 점이 있습니다. delete를 통해 ptr의 메모리를 해제한 후에 ptr 에 nullptr을 넣어주면 다른 메모리를 할당 받는 걸로 이해하고 있었는데, 출력해보니 delete 하기 전과 후의 ptr의 주소값이 같습니다. 제가 잘못 이해한 부분이 있는 것 같은데, delete 후에 ptr의 주소값이 변하지 않는 이유에 대해 알려주시면 감사하겠습니다!
- 미해결홍정모의 따라하며 배우는 C++
피보나치수열 구현 못하면 문제가 있는거겠죠??
사실 제귀함수 자체를 이해하기까지도어려웠습니다..그래도 이해하고 피보나치 수열을 구현하려 생각을 해봐도x + y = z 에서 y와 z값을 앞으로 밀면 될꺼같은데이 부분에서 막혔습니다.. 코드 3개정도를 생각하고 해봤지만 다른값이 나오고결국 다른사람의 코드를 봤습니다..그럼에도 완벽하게 이해는 못했지만작동원리는 알겠습니다..n-1 + n-2 = n막상 보고나니 머리가 멍해집니다..제가 더 생각해본다고 답이 나왔을꺼란 생각은 안들기도 하고..지금 제 수준 문제가 많은거겠죠??남들보다 안좋은 머리로 생각한다고 하는데결국 0+0= 0인가 봅니다..그래도 계속 하고싶습니다..그래서 공부 방법에 대해 질문이 있습니다지금같이 생각을 계속 해봐도 도저히 안될떄남의 코드를 보고 작동원리를 이해하는건 괜찮을까요??물론 계속 써봐야지 실력이 느는건 알겠는데저처럼 머리가 나쁜 상태로 생각을 한다고 도저히 답에 근접할지가 의문입니다..그럼에도 생각을 해야 한다는건 동의하는데그 생각하는거에 시간을 정해두고 그 시간안에못푼다고 할떄 다른 이에 코드를 보고 공부하다보면기초적인 부분이 지나고 지식이 쌓이다보면자연스럽게 모르는 부분이 나왔을떄 답이 나올떄까지 생각을 하는것도 가능하지 않을까 싶어서요.. 안좋은 공부법일까요??
- 미해결홍정모의 따라하며 배우는 C++
cin >> name >> endl;
#include <iostream> #include <string> int main(void) { using namespace std; string name; string age; cout << "Your name : " << endl; cin >> name >> endl; return 0; } cin 하고 endl을 쓰고싶어서 >> 으로 cout 하고 같은 방식으로 해봤는데 C++ no operator matches these operands operand types are: std::basic_istream<char, std::char_traits<char>> >> <unknown-type> 이 오류가뜨며 작동이 되질 않습니다... endl을사용하면 안되는건가요? 그리고 string 변수선언을 위에 몰아서 다해줘도 상관없나요??
- 미해결홍정모의 따라하며 배우는 C++
12분 50초때쯤 질문이 있습니다
class Student:public Person { private: int m_intel public: Student (const std:: string&name_in ="No Name", const int &intel_in=0) :Person(name_in),m_intel(intel_in)//여기서 오류발생 {} } 선생님께서 여기서 오류가 나는 이유가 default constructor가 없기 때문에 생긴다 하셨는데 Student 의 생성자가 호출될때 string&name_in 여기에 "No Name" 으로 initialize 가 되고 "No Name"을 가진 변수 name_in을 Person(name_in)이런식으로Person class을 생성하면서 보내기때문에 Person class 의 생성자 Person(const std::string & name_in) :m_name(name_in) {} 이 생성자 만으로도 충분히 작동이 될꺼같은데 안되는 이유가 무엇인가요? Person(const std::string &name_in)이 생성자의 name_in 에 "No Name" 이 들어가서 m_name 에 "No Name"을 할당시켜주므로 default constructor 없이도 잘 작동될꺼 같은데 안되는 이유를 잘 모르겠습니다
- 미해결홍정모의 따라하며 배우는 C++
배열에서 링킹에러, 초기화에 대한 질문
Q1. 강의에서 선언된 배열의 범위 밖의 index를 선언하면 링킹에러가 뜬다고 설명하셨는데, 왜 컴파일에러가 아닌 링킹에러가 발생하는건지 궁금합니다. Q2. 배열을 초기화하지 않고 위 코드를 실행하면, 사진과 같이 -858993460이라는 고정된 값이 출력됩니다. 초기화하지 않으면 쓰레기값이 나오기 때문에, 실행될 때마다 다른 값이 출려될 거라 예상했는데 -858993460라는 수만 출력이 됩니다. 구글링해서 찾아봐도 다른 예시 코드에서도 -858993460만 출력되더라고요. 이러한 이유가 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
재귀함수 마지막 코드가 이해가 안갑니다..
int Ss(int ss) { if (ss <= 0) { return 0; } else if (ss <= 1) { return 1; } else { const int st = Ss(ss - 1); return st + ss; } } int main() { cout << Ss(10) << endl; } ///////////////////////// 디버그로 돌려봤는데 Ss(ss =10) 함수 내부를 실행하게 되고 세번쨰 else문 실행 const int st = Ss(ss - 1); 로 ss는 10 -1 = 9가되고 재귀함수로 인해 Ss(ss =9)로 함수 안에 함수로 들어가게됨 계속 재귀함수가 반복되고 ss는 1이 된 상태로 재귀함수되서 Ss(ss = 1)이 되서 두번쨰 if else문 else if (ss <= 1){return 1;}가 실행되어 리턴 값 1이 되서 세번쨰 else문으로 들어감 ss는 1이 리턴되어 값이 1인상태고 ss = 1(컴퓨터는 0부터 시작하기에 값은 2) ss = 2가 됨 const int st = Ss(ss - 1); = Ss(2 -1) = 1이 되고 st = 1이됨 return st + ss; = 1 + 2 =3 즉 3이 반환되어 Ss(ss=3)이됨 제가 궁금한건 ss = 10;값이 줄어들고 ss =1;이 되고부터 입니다.. 1.왜 여기선 재귀함수가 안되는거죠?? 디버그로 보면 return st + ss; 실행되고 else문을 나가고 바로 다시 else문으로 실행이 되던데 이건 재귀함수가 안되고 else문이 반복 실행되고 있는 상태 아닌가요? 2. 왜 st(3) + ss(3) 되는지 모르겠습니다.. Ss(ss=3)된 상태로 다음으로 넘어가면 const int st = Ss(3 -1) st는 2이되서 2+3되서 5가 되어야 하는데 왜 3+3 되는지 모르겠습니다.. 제가 아직 if문 동작하는걸 모르는거겠죠?? 코드가 쉬울떈 이해가 되는데 코드가 어려워지면 기존에 이해했던것들도 뒤죽박죽 됩니다...다시 처음부터 공부해야 될까요??
- 미해결홍정모의 따라하며 배우는 C++
주소값을 나태내기위해서
이번강의에서는 uintptr_t를 사용했는데 예전강의에서는 size_t도 알려주셨는데요 둘에 차이가 어떤건가요?