Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- 코딩
- Python
- 코스닥
- 빅데이터
- 프로그래밍
- 풀스택프레임워크
- 프로그램
- 코딩테스트
- C++
- Project
- 자바
- 개발
- 개인프로젝트
- 모의 주식
- 자바독학
- frontend
- 이웃한 칸
- java정리
- Reflex
- 코딩독학
- 주가예측
- 개발자
- 프로그래머스
- SNS
- java
- 백준
- 코테
- 자바정리
- backend
- 사물인터넷
Archives
- Today
- Total
Creative Code
string4(reference counting사용) 본문
※main.cpp파일
#include <iostream>
#include "string.h"
int main() {
String s1;
String s2 = "hello, world"; // String s2("hello,world");
//String s2 = 0; // NULL
String s3 = s2; // String s3(s2);
s1 = s2;
String s4 = " IoT";
s1 = s2 + s4;
s1 = "hello, "; //String tmp("hello, ");
if (s1 == s2) std::cout << "s1 and s2 are equal" << std::endl;
else std::cout << "s1 and s2 are not equal" << std::endl;
s4+= s4;
s1 != s2;
std::cout << "s1 : " << s1.c_str() << std::endl;
std::cout << "s2 : " << s2.c_str() << std::endl;
std::cout << "s2 len : " << s2.size() << std::endl;
std::cout << "s3 : " << s3 <<std::endl;
const String s5 = "hello";
//s5 = "world";
std::cout << "s5 len : " << s5.size() << std::endl;
return 0;
}
※string.h파일
#ifndef STRING_H
#define STRING_H
#include <iostream>
#include "stringRep.h"
class String {
friend std::ostream& operator<<(std::ostream& out, const String& rhs);
private:
//char *str;
//int len;
//void init_str(const char *str); // tool function, helper function(다른 멤버함수들에 의해서만 사용되는 함수)
StringRep *rep_;
public:
String(const char *str=0);
String(const String& str);
~String();
String& operator=(const String& rhs);
String& operator=(const char* str);
String& operator+=(const String& rhs);
bool operator!=(const String& rhs) const;
bool operator==(const String& rhs) const; // const member function (객체에 대해서 read only)
const String operator+(const String& rhs) const;
const char* c_str() const;
const int size() const;
};
#endif
※string.cpp파일
#include "string.h"
#include <cassert>
#include <cstring>
std::ostream& operator<<(std::ostream& out, const String& rhs) {
//out << rhs.rep_->str_;
return out << rhs.c_str();
}
String::String(const char *str) {
rep_ = new StringRep(str);
rep_ ->rc_ = 1;
}
String::String(const String& rhs) {
rep_ = rhs.rep_;
++rep_->rc_;
}
String::~String() {
--rep_->rc_;
if (rep_->rc_ == 0) {
delete rep_;
}
}
const char *String::c_str() const{
return rep_->str_;
}
const int String::size() const {
return rep_->len_;
}
String& String::operator=(const String& rhs) {
if (this != &rhs) { //self-assignment test!
--rep_->rc_;
if (rep_->rc_ == 0) {
delete rep_;
}
rep_ = rhs.rep_;
++rep_ ->rc_;
}
return *this;
}
String& String::operator=(const char *str) {
--rep_ ->rc_;
if (rep_->rc_ == 0) {
delete rep_;
}
rep_ = new StringRep(str);
rep_ ->rc_ = 1;
return *this;
}
bool String::operator==(const String& rhs) const{
return (strcmp(rep_->str_,rhs.rep_->str_)==0);
}
const String String::operator+(const String& rhs) const {
char *buf = new char[rep_->len_ + rhs.rep_->len_+1];
assert(buf);
strcpy(buf,rep_->str_);
strcat(buf,rhs.rep_->str_);
String result(buf);
delete[] buf;
return result;
}
String& String::operator+=(const String& rhs) {
*this = *this + rhs;
return *this;
}
bool String::operator!=(const String& rhs) const{
return !this->operator==(rhs);
}
※stringRep.h파일
#ifndef STRINGREP_H
#define STRINGREP_H
class StringRep{
friend class String;
private:
char *str_;
int len_;
int rc_;
StringRep(const StringRep& rhs);
StringRep& operator=(const StringRep& rhs);
public:
StringRep(const char* str = 0);
~StringRep();
};
#endif
※stringRep.cpp파일
#include <cassert>
#include <cstring>
#include "stringRep.h"
StringRep::StringRep(const char *str) {
if (str) {
str_ = new char[strlen(str)+1];
assert(str_ );
strcpy(str_, str);
len_ = strlen(str);
} else {
str_ = new char[1];
assert(str_);
str_[0] = '\0';
len_ = 0;
}
}
StringRep::~StringRep() {
delete[] str_;
}
'C++ Programming' 카테고리의 다른 글
array(array 클래스) (0) | 2023.09.05 |
---|---|
list2(linked list 클래스 연결) (0) | 2023.09.05 |
string3(string 클래스 개선) (0) | 2023.09.05 |
add.cpp(cin으로 입력받기) (0) | 2023.09.05 |
main.cpp(Rational클래스 라이브러리) (0) | 2023.09.04 |