반응형
깊은복사
얕은 복사를 하면 주소값도 옮겨지기 때문에
소멸과정에서 오류가 난다
이에 내용은 같고 메모리는 다르게 만들어 줄 수 있도록
복사 생성자를 수정해줘야한다
//깊은 복사, 복사생성자 수정 예시
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;
}
반응형
'학부내용 예습 > [ 2021 겨울 ] C++' 카테고리의 다른 글
[ 13강 ] 상속 (0) | 2022.04.19 |
---|---|
[ 11강 ] 연결리스트 (Linked List) (0) | 2022.02.20 |
[ C++ ] 9강. 실습, 얕은 복사 (0) | 2022.02.05 |
[ 8강 ] 클래스 (const 멤버함수, 생성자, 소멸자) (0) | 2022.02.05 |
[ C++ ] 7강. 클래스, 객체지향 프로그래밍 (0) | 2022.01.30 |