C++ 中面向对象编程中对象的状态存储与恢复的处理
1.对象存储1)栈存储:
对于局部对象,它们存储在栈上。当进入包罗对象定义的代码块时,对象被创建并压入栈中。
比方:
class fun {
public:
int a;
};
void func() {
fun A;// 对象存储在栈上,随着函数结束自动销毁
A.a = 10;
} 栈存储的对象生命周期由其地点的作用域决定,作用域结束时对象主动烧毁,不需要手动开释内存。
2)堆存储:
利用 new 运算符在堆上动态分配对象。
比方:
class fun {
public:
int a;
};
int main() {
fun* p = new fun();// 在堆上分配对象
p->a = 20;
// 记得使用delete来释放内存
delete p;
return 0;
} 这种方式可以根据程序运行时的需求机动分配内存,但需要手动利用 delete 来开释内存,避免内存泄漏。
对象恢复
2.序列化和反序列化:
1)序列化:是将对象的状态转换为可以存储或传输的格式,好比转换为字节流。可以通过重载
比方,将一个包罗基本数据范例成员的类对象序列化为一个文本格式:
#include <iostream>
#include <fstream>
class fun {
public:
int a;
friend std::ostream& operator<<(std::ostream& os, const fun& obj) {
os << obj.a;
return os;
}
};
int main() {
fun obj;
obj.a = 30;
std::ofstream file("a.txt");
file << obj;// 将对象状态序列化到文件
file.close();
return 0;
} 2)反序列化:是从存储或传输的格式中恢复对象状态。可以通过重载 >> 运算符来实现简朴的反序列化。
比方,从之前存储的文本文件中恢复对象状态:
#include <iostream>
#include <fstream>
class fun {
public:
int a;
friend std::istream& operator>>(std::istream& is, fun& obj) {
is >> obj.a;
return is;
}
};
int main() {
fun obj;
std::ifstream file("a.txt");
file >> obj;// 从文件反序列化对象状态
std::cout << "Recovered a: " << obj.a << std::endl;
file.close();
return 0;
} 3.对象复制和移动语义:
1)复制:可以通过定义拷贝构造函数来复制对象。
比方:
class fun{
public:
int a;
MyClass(const fun& other) {
a = other.a;
}
};
int main() {
fun obj1;
obj1.a = 40;
fun obj2 = obj1;// 调用拷贝构造函数复制对象
std::cout << "obj2 a: " << obj2.a << std::endl;
return 0;
} 2)移动:C++11引入了移动语义,通过移动构造函数和移动赋值运算符来高效地转移资源的所有权。
比方,对于一个管理动态分配内存的类:
#include <iostream>
#include <utility>
class MyString {
public:
char* buffer;
MyString() : buffer(nullptr) {}
MyString(const char* str) {
buffer = new char;
strcpy(buffer, str);
}
MyString(MyString&& other) noexcept {
buffer = other.buffer;
other.buffer = nullptr;
}
MyString& operator=(MyString&& other) noexcept {
if (this!= &other) {
delete[] buffer;
buffer = other.buffer;
other.buffer = nullptr;
}
return *this;
}
~MyString() {
delete[] buffer;
}
};
int main() {
MyString str1("Hello");
MyString str2 = std::move(str1);// 调用移动构造函数
std::cout << "str2: " << str2.buffer << std::endl;
return 0;
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]