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[strlen(str)+1];
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |