(0831) C++ 학습일지

런치·2023년 9월 3일
0

C++

목록 보기
3/14
post-thumbnail

1. 생성자

  1. 기본 생성자 (Default Constructor):
    • 매개변수를 가지지 않는 생성자
    • 클래스가 다른 생성자를 가지지 않을 때 자동으로 제공
    • 객체를 생성할 때 호출되며, 주로 멤버 변수를 기본값으로 초기화하는 데 사용
class Complex {
public:
    Complex() { // 기본 생성자
    }
};
  1. 매개변수가 있는 생성자 (Parameterized Constructor):
    • 하나 이상의 매개변수를 가지는 생성자
    • 객체를 생성할 때 호출되며, 매개변수를 사용하여 멤버 변수를 초기화할 수 있다
class Complex {
public:
    Complex(double re, double im) { // 매개변수가 있는 생성자
    }
};
  1. 복사 생성자 (Copy Constructor):
    • 다른 객체로부터 생성자가 호출되는 생성자
    • 객체를 복사하거나 객체를 인수로 받는 함수 호출 시 자동으로 호출
class Complex {
public:
    Complex(const Complex& rhs) {
        // 복사 생성자
    }
};
  1. 복사 할당 연산자 (Copy Assignment Operator):
    • 다른 객체의 값을 현재 객체에 할당
    • 객체의 복사본을 생성하는 대신 기존 객체의 값을 업데이트
class Complex {
public:
    Complex& operator=(const Complex& rhs) {
        // 복사 할당 연산자
        if (this != &rhs) {
            // 자기 자신과의 할당을 방지
        }
        return *this;
    }
};
  • 생성자의 무한복사 : Call by Reference(&)가 아닌 Call by value 일때 복사 생성자를 호출하면,
    외부에서 객체를 복사 생성 -> 복사생성자 호출 -> 매개변수를 값으로 전달받을 경우 호출하는 쪽으로부터 매개변수가 복사 생성 -> 복사생성자 호출 -> 무한 반복....

2. 얕은 복사 & 깊은 복사

  1. 깊은 복사 (Deep Copy) :

    • 깊은 복사는 복사 대상 객체의 모든 데이터나 멤버 변수를 완전히 복사
    • 새로운 객체를 생성하고, 원본 객체의 모든 데이터를 복사하거나 복제합니다.
    • 객체 내에 포인터 또는 동적 할당된 자원이 있는 경우, 깊은 복사는 해당 자원을 새로 할당하여 복사합니다.
    • 따라서 깊은 복사를 수행한 후에는 원본과 복사본이 완전히 독립적이며, 한 쪽을 수정해도 다른 쪽은 영향을 받지 않는다
  2. 얕은 복사 (Shallow Copy) :

    • 얕은 복사는 복사 대상 객체의 주소만 복사하는 것을 의미
    • 복사본은 원본 객체와 동일한 데이터나 멤버 변수를 가리키며, 데이터나 멤버 변수를 공유
    • 만약 객체 내에 포인터나 동적 할당된 자원이 있다면, 원본과 복사본이 같은 자원을 가리킴
    • 이로 인해 한 객체에서 자원을 수정하면 다른 객체에서도 동일한 자원이 수정
  3. Complex c4 = c3, c4=c3의 차이 :

    • Complex c4 = c3 :
      객체 c3를 사용하여 객체 c4를 초기화하는 과정으로 생성자 또는 복사 생성자를 호출하여,
      c4c3와 동일한 값으로 초기화시키며 복사 초기화 또는 객체 초기화라고 한다
    Complex c4 = c3; // 복사 초기화

    c3c4는 별도의 독립적인 객체므로 변경이나 수정은 각 객체에 영향을 주지 않는다

  4. c4 = c3 :
    이미 생성된 객체 c4에 객체 c3의 값을 할당 -> 할당 연산이라고 한다

    c4 = c3; // 할당 연산

    c3의 값이 c4에 복사되는 것을 의미하고 변경하면 한 객체가 다른 객체에 영향을 미칠 수 있다

3. 함수중복

class Complex{
public:
   Complex()
   Complex(double re)
   complex(double re,double im)
// 함수 이름을 같게 하되 입력 받는 매개변수를 다르게 함으로 써, 함수를 정의 

4. 디폴트 인수 ( Default Argument )

  1. 디폴트 인수(default argument)는 기본값이 미리 정의되어 있는 인수를 의미
  2. 함수를 호출할 때 인수를 전달하지 않으면, 함수는 자동으로 미리 정의되어 있는 디폴트 인수값을 사용

Complex(),Complex(double re), Complex(double re,double im)
-> Complex(double re = 0.0 , double im = 0.0)로 대체 가능

friend

  1. friend 는 클래스의 멤버 함수가 다른 클래스의 비-멤버 함수를 호출하도록 허용하는 기능을
    ->friend 함수는 클래스의 private 또는 protected 멤버에 접근할 수 있도록 허용

  2. 두 클래스 간의 밀접한 관계: 두 클래스가 서로 밀접하게 관련되어 있으며 한 클래스가 다른 클래스의 비공개 멤버에 접근해야 하는 경우 friend 키워드를 사용

  3. 연산자 오버로딩: 연산자 오버로딩 함수 중에서 두 개 이상의 클래스의 비공개 멤버에 접근해야 하는 경우에 friend 키워드를 사용

friend 함수를 정의할 때에는 해당 함수가 어떤 클래스의 friend인지를 지정해야 합니다. friend 함수는 클래스의 정의 내부 또는 외부에서 정의할 수 있으며, 함수 정의에서 friend 키워드를 사용하여 해당 클래스를 선언합니다.

class String{
friend std::ostream& operator<< (std::ostream& out, const String& rhs);
private:
}

+) 마주한 Error

  • undefined reference to~ : header에는 선언 되었지만 cpp파일에는 없을 때 나오는 에러...
profile
점심을 안먹음

0개의 댓글