: lvalue๋ฅผ rvalue๋ก ์บ์คํ ํ๋ ๊ฒ์ ์๋ฏธํจ.
Object obj;
static_cast<object&&>(obj);
move(obj);
๋์ผํ ์๋ฏธ์ด๋ค.
: ์ด์ ์ ๋ง๋ cat ํด๋์ค๋ฅผ ๊ทธ๋๋ก ์ด์ฉํ์.
1) Cat a("kitty", 10); ๊ฐ์ฒด๋ฅผ ์์ฑํ์.
2) Cat b ๊ฐ์ฒด์๋ค๊ฐ a ๊ฐ์ฒด์ธ lvalue๋ฅผ rValue๋ก ์บ์คํ
๋์
ํ์.
3) a์ b์ name์ ์ถ๋ ฅํด๋ณด์.
4) ์บ์คํ
ํ ๊ฒ์ ๋ค๋ฅธ ํค์๋๋ก ๋ณ๊ฒฝํด๋ณด์.
5) Cat b("Tom" , 20); ์ผ๋ก ๋ณ๊ฒฝํ ํ,
6) b = a ๋์
ํด๋ณด์.
7) ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ๋ ์๋๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ๋ผ.
8) move ๋์
ํด๋ณด์.
1๋ฒ) string ์์์ move
-> move ๋ฅผ ํ๋ค๊ณ ํด์ string s ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ด์ง๋ ๊ฒ์ด์๋.
string s ๊ฐ์ฒด์ ๋ด๋ถ์ ์์์ด ์ด๋๋๋ ๊ฒ์.
--> 86๋ฒ ์ค์์ s๋ฅผ ์ถ๋ ฅํ๊ณ ์๋๋ฐ, ์? ์๋์ค๋ค?
๋ด๋ถ์ ์์์ด ์ฎ๊ฒจ์ง๋ค๋ ๊ฒ์ ์๋ฏธํจ. ์ฆ string ํด๋์ค์ char* ์ ์์์ด ์ด์ ๋์๋ค ๋ผ๋ ๊ฒ์ ์๊ฐํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ s์ ์ฃผ์๋ ์ฌ์ ํ ์กด์ฌํ๋ค.
์๋ ์ค๋ช ์ด ์ด์ํ๋ค... 240514
2๋ฒ) ํด๋์ค์์์ move
: ๊ฐ์ฒด b๋ฅผ move ํ์ง๋ง, ์ฌ์ ํ b์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์.
-> ์๋ํ ๊ฑฐ๋ c์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ทธ๋๋ก bํํ
์ด๋ํ ์ค ์์๋๋ฐ. ์๋์๋ค!
์ฝ๋
- -> move ๋ static_cast<&&> ์ ์ฌ์ฉํ์.
: Point p;
Point p2 = move(p); ๋๋ Point p2 = static_cast<Point&&>(p);
#include <iostream>
#include <vector>
//using namespace std;
//#include <stdio.h>
#include <winsock2.h>
#include <thread>
#pragma comment(lib, "ws2_32")
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <Windows.h>
#include <memory>
using namespace std;
#include <vector>
#include <algorithm>
class Cat
{
private:
char* name;
int age;
public:
Cat(const char* _name, int _age)
: age{ age }
{
std::cout << "constru" << std::endl;
name = new char[strlen(_name) + 1];
strcpy(name, _name);
std::cout << "this pointer : " << this << std::endl;
}
Cat(const Cat& _copy)
{
std::cout << "copy constru" << std::endl;
name = new char[strlen(_copy.name) + 1];
strcpy(name, _copy.name);
std::cout << "this pointer : " << this << std::endl;
}
~Cat()
{
if (name != 0)
{
delete[] name;
std::cout << this << " destructor" << "delete name! " << std::endl;
}
else
{
std::cout << this << " destructor " << " empty " << std::endl;
}
}
void print()
{
std::cout << name << std::endl;
std::cout << "==========" << std::endl;
}
Cat(Cat&& movObj)
{
std::cout << "move Call" << std::endl;
name = movObj.name;
age = movObj.age;
std::cout << "this pointer : " << this << std::endl;
movObj.name = 0;
}
};
Cat foo()
{
Cat c("naOng", 10);
std::cout << "foo" << std::endl;
std::cout << "this pointer : " << &c << std::endl;
return c;
}
#include <string>
int main()
{
Cat a("naong", 20); a.print();
Cat b = a; b.print();
Cat c = Cat("fairi", 40); c.print();
Cat d = static_cast<Cat&&>(a); d.print();
Cat e = b; e.print();
}
๋งค๋ฒ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์ฝ๋ฉํ๊ธฐ์๋ ๋ถํธํด์ move ํค์๋๋ฅผ ๋ง๋ค๊ณ , ๋์ฒดํจ.
: move(a);
๊ฒฐ๊ณผ
: c = Cat("fairi", 40) ์์ move๊ฐ ํธ์ถ๋์ง ์๋ ์ด์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์.
lvalue๋ผ๊ณ ํ๋๋ผ๊ณ rValue๋ก ์บ์คํ ํ๊ฒ ํจ์ผ๋ก์จ, ์ด๋์์ฑ์๋ ์ด๋๋์ ์ฐ์ฐ์๋ฅผ ํธ์ถํ๊ฒ ํ๊ฒ ๋ค ๋ผ๋ ์๋ฏธ์!
move์ ๋ง์ฐฌ๊ฐ์ง๋ก static_cast์ &&๋ฅผ ํ์
์ผ๋ก ๋ช
์ํ๋ฉด,
์ด๋์์ฑ์๋ฅผ ํธ์ถํ ์ ์์.
๊ทธ๋ฆผ 1๋ฒ
: cc๋ lValue์ด์ง๋ง, rValue๋ก์ ํ๋ณํ ์ดํ , ๋ฐ๋ก ๋์
์ ํตํด ์ด๋์์ฑ์๊ฐ ํธ์ถ๋๋ ๊ฒ์ ํ์ธํ ์ ์์.
๊ทธ๋ฆฌ๊ณ ๋์ cc.print๋ฅผ ํ๋๋ฐ, ์์์ด ์์์ด ์ถ๋ ฅ๋๋ค.
๊ทธ๋ฆผ 2๋ฒ.
: ์ด๋ฅผ ๋์ฒดํ๋ ํค์๋ move๊ฐ ์์.
๊ฒฐ๋ก
: ๊ทธ๋ฆผ 1๋ฒ๊ณผ 2๋ฒ ๋น๊ตํ๋๊น, ๋๋ค ์ด๋์์ฑ์๊ฐ ํธ์ถ๋จ์ ํ์ธํ ์ ์์.
์ฆ, move๊ฐ ๊ฐ๋ฅํ ์๊ฐ์ ์๋ก์ด ๊ฐ์ฒด์ ๋ํ ์ด๊ธฐํ๋
๋์ ํ๋ ์๊ฐ์.
: ๋ณต์ฌ์์ฑ์์ ์ด๋์์ฑ์ 2๊ฐ๋ฅผ ๋ชจ๋ ๋ง๋๋ ๊ฒ์ฒ๋ผ.
๋์ ์ฐ์ฐ์์ ์ด๋์ฐ์ฐ์๋ฅผ ๋ชจ๋ ๋ง๋ค์ด์ฃผ์.
int main()
{
point p;
point p1;
p1 = move(p);
}
: ๋ณต์ฌ ๋์ ๊ณผ ์ด๋ ๋์ ์ ๋ง๋ค์ด๋ผ.
๋) ์ด๋ ๋์
์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ
: ์์์ ์ด๋ํ๊ณ , ํด์ ํ๊ธฐ ๋ฌธ์๋ ๋ ๋ํ๋๋ใ
๊ฒ์ ํ์ธํ ์ ์์.
์ฝ๋
// cppTest.cpp : ์ด ํ์ผ์๋ 'main' ํจ์๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ฑฐ๊ธฐ์ ํ๋ก๊ทธ๋จ ์คํ์ด ์์๋๊ณ ์ข
๋ฃ๋ฉ๋๋ค.
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Cat
{
private :
char* name;
int age;
public :
Cat(const char* _name, int _age)
: age(_age)
{
name = new char[strlen(_name) + 1];
strcpy(name, _name);
}
Cat(const Cat& _obj)
: age{_obj.age}
{
name = new char[strlen(_obj.name) + 1];
strcpy(name, _obj.name);
cout << "copy" << endl;
cout << "name ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ" << endl;
}
void print() const
{
if (name == 0)
cout << "์์์ด ์์." << endl;
else
cout << name << endl;
}
Cat(Cat&& _cat)
: name{ _cat.name }, age{ _cat.age }
{
_cat.name = 0;
cout << "move constructor" << endl;
}
~Cat() {
delete[] name;
if (name != 0)
cout << "ํด์ ํ๊ธฐ" << endl;
}
Cat& operator=(const Cat& _obj)
{
age = _obj.age;
name = new char[strlen(_obj.name) + 1];
strcpy(name, _obj.name);
cout << "copy" << endl;
cout << "name ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ" << endl;
return *this;
}
Cat& operator=(Cat&& _obj)
{
age = _obj.age;
name = _obj.name;
_obj.name = 0;
cout << "move =" << endl;
return *this;
}
};
Cat foo()
{
Cat c("bom", 10); return c;
}
int main()
{
Cat cc("bomi",10);
Cat c2("zzokki", 20);
c2 = cc;
cc.print();
c2.print();
cout << "hello" << endl;
}
๋ณต์ฌ ๋์ ์ฐ์ฐ์์ ์ด๋ ๋์ ์ฐ์ฐ์ ๋ชจ๋ ์์๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๊ฒ์
๋ง๊ธฐ ์ํด์ ์ฐธ์กฐ๋ก ๋ฐํํด์ผ ํจ.