월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C++
private 안에 static 멤버변수
8.11강 3분쯤 보다가 궁금한 점이 있어 질문 남깁니다. class Something { private: static int s_value; public: int getValue() { return s_value; } } int Something::s_value = 1024;이렇게 클래스 내부에서 s_value 선언을 하고, 클래스 외부에서 초기화를 하셨는데,클래스 외부에서 private 안에서 선언된 멤버변수로 접근하는것이 불가능한것으로 알고 있는데, 이 경우는 어떻게 가능한건지 알고 싶습니다. int main() { cout << something.getValue() << endl; // cout << something.s_value << endl; // 에러 }그리고 이렇게 cout으로 출력했을 때, 아래 부분이 에러나는 이유도 궁금합니다. private 내의 static 멤버변수는 외부에서 접근이 불가능한거고, 초기화만 외부에서 해줄 수 있는건가요?
- 미해결홍정모의 따라하며 배우는 C++
#include<algorithm>없이 std:max()사용 가능
강의 5:20에서 보면std::max()는 <algorithm>이라는 라이브러리 안에 저장되어 있어서 #include로 불러와야 사용이 가능하다고 하셨습니다.#include <iostream> using namespace std; int main() { cout << std::max(100,2) << endl; return 0; }근데 왜 저는 <algorithm>을 불러오지 않아도 오류 없이 사용이 가능할까요? 궁금하네요... 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
namespace의 활용
namespace의 사용이유는std::cout, std::cin, std::in처럼 함수를 목적에 따라 분류하기 위해서 사용하는 건가요? 함수만 namespace에 저장할 수 있는 지 궁금해져서 #include <iostream> using namespace std; namespace Space1 { int a = 10; } int main() { cout << Space1::a << endl; return 0; }이렇게 입력했더니 정수형 변수 a도 namespace에 저장할 수 있었습니다.함수 이외에도 namespace를 사용하는 경우가 있을까요?? 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
함수포인터 질문 드려요!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.7.9강을 듣고 의문이 들었던점은포인터는 메모리를 새로 할당받는다는 단점이 있기때문에참조를 사용했는데 함수를 매개변수로 활용하고싶을때 함수포인터가 아닌참조를 사용할수도있나요?
- 미해결홍정모의 따라하며 배우는 C++
선택정렬 관하여 다른 코드
이 원리도 맞을까요? 부등호만 반대로 바꾸면 내림차순이 되는 것 같은데 비효율적이진 않은지 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C++
단항 연산자 오버로딩 방법에 대해 질문있습니다.
9.1 산술 연산자 오버로딩하기 강의에서는 연산자 오버로딩을 멤버 함수, friend 함수, 전역 함수로 구현하는 방법을 각각 알아봤었습니다. 그런데 이번 강의의 단항 연산자 오버로딩은 멤버함수로만 구현하고 전역 함수로 구현하는 내용이 없어 스스로 시도해보았습니다.https://learn.microsoft.com/en-us/cpp/cpp/overloading-unary-operators?view=msvc-170위 링크의 아래 내용을 참고하여 작성해 보았습니다.To declare a unary operator function as a nonmember function, use this declaration form:return-type operator op ( class-type ); class Cents { private: int m_cents; public: Cents(int cents) { m_cents = cents; } int getCents() const { return m_cents; } int& getCents() { return m_cents; } friend std::ostream& operator << (std::ostream& out, const Cents& cents) { out << cents.m_cents; return out; } }; // 비멤버 함수로 오버로딩 Cents operator -(const Cents& cents) { return Cents(-cents.getCents()); } int main() { Cents cents1(6); cout << cents1 << endl; cout << -cents1 << endl; // 6 // -6 return 0; }테스트는 잘 되더라구요. 이렇게 하는 것이 맞나요?
- 미해결홍정모의 따라하며 배우는 C++
7.15강 2:55 부분
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 2분 55초 부근에서 exe파일에 접근하여 문자열이나 숫자를 입력하는 부분을 보고 있는데혹시 vscode로 하고 있으면 어떻게 해야 하는지 알 수 있을까요?현재 저는 맥으로 하고 있으며, exe파일은 없고 폴더 안에 cpp파일만 있는 상태입니다..
- 해결됨홍정모의 따라하며 배우는 C++
함수 오버로딩 부분 (7.7강)
void print(char *value) {} void print(int value) {} int main() { print(0); print('a'); }이 부분에서 print('a')가 print(char *value) 쪽으로 인식되지 않는 이유가 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C++
const member function에 관하여 궁금한 점이 있습니다.
강의 중 아래 코드를 작성하고 난 후, 코드를 변형해 보다가 의문의 생겨 질문드립니다. class Something { public: string m_value = "default"; const string& getValue() const { cout << "const version" << endl; return m_value; } string& getValue() { cout << "non-const version" << endl; return m_value; } };영상에서 const member function은 함수 내에서 멤버 변수를 수정하지 않겠다는 의미라고 나왔습니다.그런데 해당 함수의 반환 타입에 해당하는 const를 지우자 에러가 발생합니다. const member function이 아닌 getValue()와 하는 작업이 같은데도 불구하구요.(둘 다 함수 내부에서 값을 변경하지 않음)string& getValue() const { cout << "const version" << endl; return m_value; // 오류 발생 }오류문을 검색하여 유사한 질문을 찾을 수 있었습니다.https://stackoverflow.com/questions/30146562/error-qualifiers-dropped-in-binding-reference-of-type-x-to-initializer-of-type링크의 답변을 읽고 제가 이해한 바는 다음과 같습니다 : 함수의 반환형이 참조형이라면 잠재적으로 접근하여 값을 변경할 가능성이 있는데, 본 함수는 const member function라서 함수의 멤버 변수가 변하지 않아야 하기에 이를 보장하기 위하여 수정하도록 에러를 발생시킨다고 보면 될까요?오류가 발생하던 함수의 형태에서 &와 const 둘 중 하나를 지웠을 때 에러가 사라지는 것을 보면 맞는 것 같긴 한데, 정확한 설명을 듣고 싶습니다.
- 미해결홍정모의 따라하며 배우는 C++
함수 포인터 질문
std::function<bool(const int&)> fcnptr = isEven; cout << fcnptr << endl;이 방식의 초기화에서는 오류가 뜨고bool(*fcnptr)(const int&) = isEven; cout << fcnptr << endl;이 초기화에서는 오류가 안 뜨는 이유가 궁금합니다. 뜨는 에러 :E0349 no operator matches these operands
- 미해결홍정모의 따라하며 배우는 C++
7.3 포인터에 대한 레퍼런스
7.3강 16초 부분과 관련해 질문 드립니다. void foo(int* &ptr) { cout << ptr << " " << &ptr << endl; } int main() { int x = 5; int *ptr = &x; cout << ptr << " " << &ptr << endl; foo(ptr); return 0; }여기서 foo함수의 매개변수 부분에 왜 int* ptr이 아닌 int* &ptr로 쓰는지 궁금합니다.그리고 int* &ptr부분에서 &가 의미하는 것이 주소를 말하는 것인지, 참조를 말하는 것인지 헷갈리는데 어떤게 맞는지 궁금합니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C++
강의자료
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 혹시 강의자료 같은 파일이 있을까요?
- 해결됨홍정모의 따라하며 배우는 C++
L value, R value
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요, 제가 초반 강의들 중에서 스킵한 강의들이 좀 있는데, r value, l value에 관한 내용이 있는 강의가 어디쯤에 있을까요??
- 해결됨홍정모의 따라하며 배우는 C++
동적 2차원 배열 생성 시 연속된 메모리 할당 여부
안녕하세요. 강의를 듣고 난 후 메모리 상에서 row간에 인접한 주소를 가지는지, 즉 2차원 배열의 원소 전체가 메모리 상에서 연속되어 있는지 궁금하여 아래와 같이 작성한 후 실행해 보았습니다. int** matrix = new int* [row]; cout << intptr_t(&matrix[0]) << endl; cout << intptr_t(&matrix[1]) << endl; cout << intptr_t(&matrix[2]) << endl; cout << endl; for (int r = 0; r < row; r++) { matrix[r] = new int[col]; } cout << intptr_t(matrix[0]) << endl; cout << intptr_t(matrix[1]) << endl; cout << intptr_t(matrix[2]) << endl; ```x64로 빌드하였고, 각 row를 가리키는 포인터의 주소는 8 바이트씩 연속되어 있는것을 확인하였습니다. 하지만 각각의 row 의 첫 원소의 주소끼리는 간격이 일정하지 않았고, 여러 번 테스트를 해보니 row간의 주소가 증가하다 감소하는 경우도 있었기에 정적 배열과 달리 메모리가 연속되어있지 않다고 결론내렸습니다. 그런데 주소 사이의 간격이 과도하게 멀어지는것 같지도 않았기에 아래 그림과 같이 약간 느슨하게(?) 가까이 있는 느낌이 들었습니다. C++에서 new 키워드를 사용해서 메모리를 할당할 때에 무언가 법칙이 있는것 같은데, 위 코드처럼 연속적으로 메모리를 할당받는 경우에는 가능한 한 가까운 주소에 할당해주는 건가요?
- 해결됨홍정모의 따라하며 배우는 C++
정적 변수 관련 질문
정적변수 a로 정의되어 있으면, 다른 파일에서 a로 접근이 불가능하다고 하셨는데이 두가지 코드는 한 파일에서만 놓고 보면 동일한 결과이지만,첫번째 코드는 static으로 정의되어 있기 때문에 다른 cpp파일에서 a로 접근이 불가능하고, 두번째 코드는 전역변수로 정의되어 있기 때문에 다른 cpp파일에서 a로 접근이 가능한 것이라 보면 되는걸까요? // static 사용한 경우 #include <iostream> using namespace std; void doSomething() { static int a = 1; ++a; cout << a << endl; } int main() { doSomething(); // 2 doSomething(); // 3 doSomething(); // 4 doSomething(); // 5 return 0; }// static 사용 안했지만 static 사용한 것과 동일한 결과 #include <iostream> using namespace std; int a = 1; void doSomething() { ++a; cout << a << endl; } int main() { doSomething(); // 2 doSomething(); // 3 doSomething(); // 4 doSomething(); // 5 return 0; }
- 미해결홍정모의 따라하며 배우는 C++
빈칸 채우기 반복문 예제 리뷰 부탁드립니다
#include <iostream> using namespace std; int main() { int outer_count; cin >> outer_count; cout << endl; int outer_count_storeage = outer_count; // 처음 입력값 while (outer_count >= 1) // 처음 입력값만큼 반복 { int inner_count = outer_count_storeage; while (inner_count >= outer_count) // 숫자 반복을 위한 반복문 { cout << inner_count-- << " "; } int save; save = outer_count; while (outer_count >= 2) // 문자 반복을 위한 반복문 { cout << "*" << " "; --outer_count; } outer_count = save; --outer_count; cout << endl; } return 0; }숫자를 입력받아 역순으로 출력하며 빈칸에 *를 넣고자 짠 코드입니다. outer_count_storeage와 save 변수를 통해 값들을 저장하여 코드를 작성하였는데 이와같이 코드를 짜는게 괜찮은지 더 나은 방향이 있었는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C++
구조체 안의 구조체
#include <iostream> #include <string> using namespace std; struct Person { double height; float weight; int age; string name; void print() { cout << height << " " << weight << " " << age << " " << name; cout << endl; } }; struct Family { Person me, mom, dad; }; int main() { Family fm1; Person fm1.me = { 2.0,100.0,20,"Jack Jack" }; fm1.me.age = 4.0; fm1.me.print(); return 0; }여기에서 Person fm1.me = { 2.0,100.0,20,"Jack Jack" };Error expected a ';' E0065가 뜹니다. fm1 안에 정의된 me를 초기화하고 age만을 바꾸어서 출력하고 싶은데 어떻게 해야 되나요?
- 미해결홍정모의 따라하며 배우는 C++
fptr1에 Something으로 접근 연산자를 붙히는 이유는 Something 클래스의 인스턴스 주소를 넘겨줘야해서 인가요?
int (*fptr2)() = &Something::getValue;는 단순히 정적 메모리에 있는 Something클래스의 함수 포인터를 초기화한다고 이해 할 수 있지만 제목 그대로의 의문점이 있습니다.
- 미해결홍정모의 따라하며 배우는 C++
IntArray 구현 공유합니다
copy constructor, = operator overloading, << overloading 도 같이 해봤습니다insertBefore, remove 에서 resize 를 쓰면 코드 반복을 줄일수 있는데, 비슷하게 옮기는걸 두번해서 속도 느려지기 때문에 그냥 각 함수에 기능들을 따로따로 만들었습니다...class IntArray{ private: int _len; int *_arr = nullptr; public: IntArray(int length) : _len(length) { _arr = new int[length]; } // initializer_list constructor IntArray(const std::initializer_list<int> & ilist) : IntArray(ilist.size()) { int i = 0; for (const auto & n : ilist) { _arr[i++] = n; } } // copy constructor IntArray(const IntArray &source) : IntArray(source._len) { for(int i = 0; i < _len; i++){ _arr[i] = source._arr[i]; } } // assignment operator overloading IntArray& operator = (const IntArray & source) { // prevent self-assignment if (&source == this) return *this; _len = source._len; delete[] _arr; if (source._arr == nullptr) { _arr = nullptr; } else { _arr = new int[_len]; for(int i = 0; i < _len; i++){ _arr[i] = source._arr[i]; } } return *this; } // cout << overloading friend std::ostream& operator << (std::ostream &out, const IntArray &intarray) { out << "[ "; for(int i = 0; i < intarray._len; i++){ out << intarray._arr[i] << " "; } out << "]"; return out; } void reset(){ _len = 0; delete[] _arr; _arr = nullptr; } void resize(int newlen) { int *newarr = new int[newlen]; int minlen = std::min(_len, newlen); for(int i = 0; i < minlen; i++){ newarr[i] = _arr[i]; } delete[] _arr; _arr = newarr; } void insertBefore(const int &val, const int &ix) { _len++; int *newarr = new int[_len]; for(int i = 0; i < ix; i++){ newarr[i] = _arr[i]; } newarr[ix] = val; for(int i = ix+1; i < _len; i++){ newarr[i] = _arr[i-1]; } delete[] _arr; _arr = newarr; } void remove(const int &ix) { _len--; int *newarr = new int[_len]; for(int i = 0; i < ix; i++){ newarr[i] = _arr[i]; } for(int i = ix; i < _len; i++){ newarr[i] = _arr[i+1]; } delete[] _arr; _arr = newarr; } void push_back(const int &val){ resize(++_len); _arr[_len-1] = val; } ~IntArray() { delete[] _arr; } };
- 미해결홍정모의 따라하며 배우는 C++
강의 시간 12:45에 작성된 함수const stirng& getValue() const{...} 에 대해서 질문드립니다.
const string& getValue() const 이부분에서 함수 이름 뒤에 위치한 const는 getValue함수 내부에서 멤버 변수의 값을 변경하지 않겠다는 의미인것은 이해 할 수 있습니다. 하지만 함수이름 앞에 const string& 은 잘 이해가 가지 않습니다.string타입의 멤버 변수의 주소를 변경하지 않겟다라는 의미 인가요?