Skip to content

Commit 5c37806

Browse files
committed
update: more explaination on move proposal
1 parent 07badc8 commit 5c37806

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

book/zh-cn/03-runtime.md

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,16 +267,26 @@ int main()
267267
class A {
268268
public:
269269
int *pointer;
270-
A():pointer(new int(1)) { std::cout << "构造" << pointer << std::endl; }
271-
A(A& a):pointer(new int(*a.pointer)) { std::cout << "拷贝" << pointer << std::endl; } // 无意义的对象拷贝
272-
A(A&& a):pointer(a.pointer) { a.pointer = nullptr;std::cout << "移动" << pointer << std::endl; }
273-
~A(){ std::cout << "析构" << pointer << std::endl; delete pointer; }
270+
A():pointer(new int(1)) {
271+
std::cout << "构造" << pointer << std::endl;
272+
}
273+
A(A& a):pointer(new int(*a.pointer)) {
274+
std::cout << "拷贝" << pointer << std::endl;
275+
} // 无意义的对象拷贝
276+
A(A&& a):pointer(a.pointer) {
277+
a.pointer = nullptr;
278+
std::cout << "移动" << pointer << std::endl;
279+
}
280+
~A(){
281+
std::cout << "析构" << pointer << std::endl;
282+
delete pointer;
283+
}
274284
};
275285
// 防止编译器优化
276286
A return_rvalue(bool test) {
277287
A a,b;
278-
if(test) return a;
279-
else return b;
288+
if(test) return a; // 等价于 static_cast<A&&>(a);
289+
else return b; // 等价于 static_cast<A&&>(b);
280290
}
281291
int main() {
282292
A obj = return_rvalue(false);

code/3/3.4.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,31 @@
1010
class A {
1111
public:
1212
int *pointer;
13-
A():pointer(new int(1)) { std::cout << "构造" << pointer << std::endl; }
14-
A(A& a):pointer(new int(*a.pointer)) { std::cout << "拷贝" << pointer << std::endl; } // 无意义的对象拷贝
15-
A(A&& a):pointer(a.pointer) { a.pointer = nullptr;std::cout << "移动" << pointer << std::endl; }
16-
~A(){ std::cout << "析构" << pointer << std::endl; delete pointer; }
13+
A():pointer(new int(1)) {
14+
std::cout << "构造" << pointer << std::endl;
15+
}
16+
A(A& a):pointer(new int(*a.pointer)) {
17+
std::cout << "拷贝" << pointer << std::endl;
18+
} // 无意义的对象拷贝
19+
A(A&& a):pointer(a.pointer) {
20+
a.pointer = nullptr;
21+
std::cout << "移动" << pointer << std::endl;
22+
}
23+
~A(){
24+
std::cout << "析构" << pointer << std::endl;
25+
delete pointer;
26+
}
1727
};
1828
// 防止编译器优化
1929
A return_rvalue(bool test) {
2030
A a,b;
21-
if(test) return a;
22-
else return b;
31+
if(test) return a; // 等价于 static_cast<A&&>(a);
32+
else return b; // 等价于 static_cast<A&&>(b);
2333
}
2434
int main() {
2535
A obj = return_rvalue(false);
2636
std::cout << "obj:" << std::endl;
2737
std::cout << obj.pointer << std::endl;
2838
std::cout << *obj.pointer << std::endl;
29-
3039
return 0;
31-
}
40+
}

0 commit comments

Comments
 (0)