전체 글

전체 글

    함수의 설계와 객체의 복사

    함수의 설계와 객체의 복사

    전 책에서 이 부분을 좋아합니다. 왜냐하면 이 책을 읽지 않았더라면 평생 모르고 생각하지도 않고 살았을 테니까요. 같은 기능의 함수라도 매개변수와 반환형을 다르게 할 수 있고 그거에 따른 복사 생성자와 대입 연산자 사용 횟수를 저는 절대 생각하고 깨닫지 못했을 거니까요. φ(◎ロ◎;)φ 여기 Complex 클래스가 정의돼있습니다. class Complex { double real, imag; // 복소수의 실수부와 허수부 public: Complex(double r = 0, double i = 0) : real(r), imag(i) { } //... }; void main() { Complex a(1,2), b(3,4), c; } 복소수 객체 a와 b를 더해 c에 저장하려고 합니다. 물론 계산 후 a와 ..

    얕은 복사와 깊은 복사

    얕은 복사와 깊은 복사

    얕은 복사는 컴파일러가 메모리 영역을 그대로 다른 객체의 메모리로 복사하는 식으로 작동합니다. 컴파일러는 클래스가 뭐하는지 뭘 가지고 있는지 관심도 없고 알지도 못합니다. 그저 클래스의 크기가 얼마인지 만 알고 있습니다. 정리하자면 어떤 크기의 메모리 영역을 복사하면 얕은 복사입니다. 2022.07.28 - [C++ 프로그래밍/클래스] - 객체의 복사와 복사 생성자 객체의 복사와 복사 생성자 같은 자료형의 변수들을 복사하는 것과 같이 객체도 서로 복사할 수 있습니다. 바로 대입연산자(=)와 복사생성자 두 가지의 이유로 복사할 수 있습니다. 대입연산자 이용 Point p(2,3), q; q = p; 복사 onesside-world.tistory.com 이 글에서 소개한 디폴트 대입 연산자와 디폴트 복사 생..

    객체의 복사와 복사 생성자

    객체의 복사와 복사 생성자

    같은 자료형의 변수들을 복사하는 것과 같이 객체도 서로 복사할 수 있습니다. 바로 대입연산자(=)와 복사생성자 두 가지의 이유로 복사할 수 있습니다. 대입연산자 이용 Point p(2,3), q; q = p; 복사생성자 이용 printPoint함수에서 매개변수로 객체를 전달하는 과정에 Point a가 p로 복사 생성자를 이용하여 객체 복사 readPoint함수에서 Point p 함수를 반환하면서 복사 생성자를 이용하여 객체 복사 #include using namespace std; struct Point { int x, y; Point(int xx = 0, int yy = 0) : x(xx), y(yy) { } }; Point readPoint() { Point p; cout > p.x >> p.y; r..

    객체 생성되는 것과 안 되는 것

    객체 생성되는 것과 안 되는 것

    객체 생성인 것(생성자 소멸자 호출됨) Point point; //객체 생성 Point list[10]; //배열 객체 생성 객체 생성이 아닌 것(생성자 소멸자 호출안됨) Point& q = p; //객체의 참조자는 새로운 객체를 만드는 것이 아님 Circle* pc; //객체의 포인터는 새로운 객체를 만드는 것이 아님 Point* plist[10]; //객체의 포인터 배열은 새로운 객체를 만드는 것이 아님 여기서 포인터 객체는 동적할당에 필요합니다. Circle* pc = new Circle(); new 연산자는 data_type 크기의 메모리 블럭을 할당하여 그 블럭의 시작 주소를 반환합니다. 동적 생성을 하면 그때 생성자를 한번 호출합니다.

    멤버 초기화 리스트

    멤버 초기화 리스트

    생성자의 가장 큰 특징 중 하나인 멤버 초기화 리스트(member initialization list)는 생성자 함수 헤더와 함수 몸체 사이에 :를 넣고 클래스의 멤버 변수와 매개변수를 "멤버(매개변수)"의 형태로 나열하는 것입니다. class Complex { double real, imag; public: Complex(double r = 0, double i = 0) : real(r), imag(i) {} }; void main() { Complex a(2.0, 4.0); //객체 초기화 } 여기서 real(r)은 real = r과 똑같이 동작합니다. 이제 함수 블록에 멤버의 초기화 코드를 적을 필요가 없게 됩니다. 이 방법은 얼핏 보면 초기화 방법의 변경에 지나지 않는 것이라고 보이지만 사실 매우..

    생성자와 멤버 함수의 유사점과 차이점

    생성자와 멤버 함수의 유사점과 차이점

    유사점 클래스의 멤버 변수와 멤버 함수를 마음대로 사용할 수 있다. 함수 중복을 사용할 수 있다. 디폴트 매개변수도 지원한다. 여러 생성자를 한꺼번에 정의하는 강력한 효과가 있다 차이점 생성자는 일반적인 멤버 함수에 비해 다음과 같은 차이가 있습니다. 생성자는 반환형이 없다. void도 사용할 수 없다. 함수의 이름이 클래스와 동일하다. 생성자는 객체가 생성될 때 오직 한 번만 호출된다. 다른 멤버 함수와는 달리 일단 생성된 객체에서 다시 생성자를 호출할 수는 없다. 생성자가 하나도 정의되어 있지 않으면 컴파일러가 자동으로 기본 생성자(default constructor)를 제공한다. 대부분의 경우 생성자는 고용 접근 권한 public을 갖도록 권한다. 멤버 초기화 리스트(member initializa..

    구조체에서 클래스로

    구조체에서 클래스로

    C언어로 잘 만들어진 구조체와 관련 함수들을 클래스로 변경하는 것 자체는 크게 어렵지 않습니다. Complex라는 구조체와 관련 함수를 4번의 변화로 클래스로 변경해 보겠습니다. 1. 구조체와 일반 함수로 구현된 Version1 #pragma once #include struct Complex { doublereal; doubleimag; }; extern void setComplex(Complex &c, double r, double i) { real = r; imag = i; } extern voidreadComplex(char* msg = " 복소수 ="); extern voidprintComplex(char* msg = "복소수 = "); extern voidaddComplex(Complex a,..

    참조자의 반환

    참조자의 반환

    여기 글에서는 참조형과 참조에 의한 호출은 생략하겠습니다. 이해하는데 그렇게 어렵지 않고 참조형은 그냥 변수를 여러 별명으로 부르는 방법이기 때문입니다. 다른 블로그나 책을 추천합니다. 참조는 꼭 익히길 바랍니다. 저는 참조자의 반환을 잘 이해하지 못했었기 때문에 이 파트만 다루도록 하겠습니다. 함수에서 참조자를 반환할 수도 있습니다. 참조자를 반환하면 반환 과정에서 복사가 일어나지 않고 참조가 일어납니다. 물론, 이때 반환되는 변수는 함수가 끝나도 자동으로 소멸되지 않아야 합니다. 위의 줄에서??? 가 뜨는 분들을 위해 조금 설명하겠습니다. ヾ(^▽^*))) 괜찮습니다 저도 몰랐거든요. 전 책을 2번째 보고 난 후에 알게 되었어요. 참조 매개변수가 그 값을 복사하는 게 아니고 전달 인자의 별명을 매개변..

    함수로 배열을 전달, 반환

    함수로 배열을 전달, 반환

    함수로 배열을 전달하는 방법은 함수를 호출할 때 전달인자(argument)에 배열의 시작주소를 전달하는 것입니다. 하지만, 이제 함수에서 전달 받게 되면 방법이 두가지로 나뉘어지게 됩니다. 배열명[]로 받는 방법과 포인터로 받는 방법 #include //배열의 길이를 같이 전달 해줘야 한다. int findMaxValue(int a[], int len) { int maxVal = a[0]; for (int i = 1; i