학부내용 예습/[ 2021 겨울 ] C++

[ C++ ] 10강. 깊은 복사, mutable, friend, static 멤버변수/함수

haena02 2022. 2. 5. 19:01
반응형

깊은복사

 

얕은 복사를 하면 주소값도 옮겨지기 때문에

소멸과정에서 오류가 난다

이에 내용은 같고 메모리는 다르게 만들어 줄 수 있도록

복사 생성자를 수정해줘야한다

 

//깊은 복사, 복사생성자 수정 예시

ArrayData::ArrayData(const ArrayData& copy)  // 자기 자신이 인자로 들어올 때
	: capacity(copy.capacity), used(copy.used) // 들어온거랑 똑같이 멤버변수 세팅
{
	data = new double[capacity];  // 동적할당은 새로운 매모리에
	for (int i = 0; i < used; i++)  // 내용은 모두 똑같이 복사
		data[i] = copy.data[i];
}

 

 

const 추가적인 내용

- const 객체 생성가능, const 함수만 호출 가능

- const 멤버 변수는 시작과 동시에 초기화 해줘야하기 때문에 생성자에서 초기화 못함

 

mutable

- const 함수 내에서 바꿀 수 있음

- 변수 선언 앞에 붙여주면 됨

 

friend

- private 멤버들 접근 허용

- friend (허용하고싶은 멤버함수, 클래스)

 

static 멤버변수

-클래스의 모든 객체들이 공유하는 공간이 됨

- 생성자에서 초기화 하면 안됨

-const static 은 공통 상수가 필요할 때 사용하면 됨

(클래스 내부에서 초기화 해줘야함, 예외적)

 

 

static 멤버함수

- static 멤버함수 내에서는 일반 멤버변수 사용X

static 함수, 멤버는 객체에 존재하는 것이 아니기 때문

 

 

실습

//lec10_ArrayData.h

#pragma once

class ArrayData {

private:
	double* data;
	int capacity;
	int used;
	static int count;

public:
	ArrayData();
	ArrayData(const ArrayData& copy);
	ArrayData(int num);
	~ArrayData();
	void addElement(double num);
	bool full();
	int getcapacity();
	int getUsed();
	static int getCount();
	void emptyArray();
	void showData();
	friend double getArraySum(const ArrayData& arr);

};

 

//lec10_ArrayData.cpp

#include<iostream>
#include "lec10_ArrayData.h"



ArrayData::ArrayData()
	: capacity(0),used(0),data(nullptr)
{
	count++;
}

ArrayData::ArrayData(const ArrayData& copy)
	: capacity(copy.capacity), used(copy.used)
{
	data = new double[capacity];
	for (int i = 0; i < used; i++)
		data[i] = copy.data[i];
	count++;
}

ArrayData::ArrayData(int num)
:capacity(num),used(0)
{
	data = new double[capacity];
	count++;

}
ArrayData::~ArrayData()
{
	if (data != nullptr)
		delete[] data;
	data = nullptr;
	count--;

}
void ArrayData::addElement(double num) {
	
	if (!full()) {
		data[used++] = num;
	}
	else {
		std::cout << "빈공간이 없습니다"<< std::endl;
	}

}
bool ArrayData::full() {
	if (used == capacity )
		return true;
	else
		return false;
}
int ArrayData::getcapacity() {
	return capacity;
}
int ArrayData::getUsed() {
	return used;
}
 int ArrayData::getCount()
{
	return count;
}
void ArrayData::emptyArray() {
	used = 0;
}
void ArrayData::showData() {
	for (int i = 0; i < used; i++) {
		std::cout<<data[i]<<" ";
	}
}

 

//메인

#include<iostream>
#include "lec10_ArrayData.h"

using namespace std;

int ArrayData::count = 0;

double getArraySum(const ArrayData& arr) {
	double total = 0;
	for (int i = 0; i < arr.used; i++) { // arr.used는 private 여서 사용 못함, friend 필요
		total += arr.data[i];
	}
	return total;

}

int main() {

	ArrayData arr1(4);
	arr1.addElement(1.1);
	arr1.addElement(2.1);

	ArrayData arr2(arr1);
	arr1.addElement(3.1);
	arr1.addElement(4.1);

	arr1.showData();
	arr2.showData();

	cout << ArrayData::getCount() << endl;
	

	return 0;


}
반응형