值语义就像朋友给你看他的丑照,你说'发我一份',他给你复印了一张。现在你可以在你的复印件上随便画胡子,把他进一步丑化,完全不影响他的原片...
值语义如同复印照片后自由涂鸦,彼此独立;引用语义则是共用原片,牵一发而动全身。把C++内存模型变成生活场景,这种"翻译"功力才是编程教学的真功夫。
【代码演示】
#include <iostream>
void demonstrate_semantics() {
std::cout << "=== 值语义 vs 引用语义 ===\n";
// 📸 值语义:复印照片
int original_photo = 10; // 朋友的原照片
int copied_photo = original_photo; // 复印一份
copied_photo = 20; // 在复印件上画胡子
std::cout << "朋友的原照片: " << original_photo << " (干净如初!)\n";
std::cout << "我的复印件: " << copied_photo << " (画了胡子!)\n\n";
// 🎨 引用语义:共享原片
int& shared_photo = original_photo; // 共享原照片
shared_photo = 30; // 任何修改都影响原片
std::cout << "朋友的原照片: " << original_photo << " (被画花了! 😠)\n";
std::cout << "共享引用: " << shared_photo << " (大家一起修改)\n";
}
// 实际应用例子
class Photo {
public:
int data;
Photo(int d) : data(d) {}
};
void modify_copy(Photo p) { // 值传递:获得复印件
p.data = 100; // 修改复印件
}
void modify_original(Photo& p) { // 引用传递:获得原片
p.data = 200; // 修改原片
}
int main() {
demonstrate_semantics();
Photo family_photo(1);
modify_copy(family_photo);
std::cout << "\n值传递后: " << family_photo.data << " (原片安全)\n";
modify_original(family_photo);
std::cout << "引用传递后: " << family_photo.data << " (原片被改!)\n";
}