Java面试黄金宝典48

发布于:2025-04-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

1. C++ 的拷贝构造函数,深拷贝和浅拷贝

 

  • 定义
  1. 拷贝构造函数:在 C++ 里,拷贝构造函数属于特殊的构造函数,其功能是使用一个已存在的对象来初始化一个新对象。当对象以值传递的方式作为参数传给函数、函数返回对象、用一个对象初始化另一个对象时,拷贝构造函数会被调用。
  2. 浅拷贝:仅复制对象的成员变量值。要是成员变量包含指针,仅仅复制指针的值,也就是两个对象的指针指向同一块内存区域。
  3. 深拷贝:不但复制对象的成员变量值,当遇到指针类型的成员变量时,会另外开辟一块新的内存空间,接着把原指针指向的内容复制到新的内存空间。

浅拷贝实现起来较为简单,但是存在内存管理方面的风险,例如一个对象销毁时释放了内存,另一个对象的指针就会变成野指针。深拷贝能够避免这种问题,不过实现起来更复杂,需要额外的内存分配和数据复制操作。

  • 要点
  1. 浅拷贝实现简单,但可能引发内存问题。
  2. 深拷贝能保证对象独立性,但开销较大。
  • 应用

在实际开发中,若对象包含动态分配的内存,通常需要使用深拷贝来避免内存错误。比如在图形处理程序里,每个图形对象可能包含指向图像数据的指针,使用深拷贝可以确保每个图形对象有自己独立的图像数据副本。

C++ 代码示例

cpp

#include <iostream>
#include <cstring>

class MyClass {
private:
    char* data;
public:
    // 构造函数
    MyClass(const char* str) {
        data = new char[strlen(str) + 1];
        strcpy(data, str);
    }

    // 浅拷贝构造函数
    MyClass(const MyClass& other) {
        data = other.data; // 只复制指针
    }

    // 深拷贝构造函数
    MyClass(const MyClass& other, bool deepCopy) {
        if (deepCopy) {
            data = new char[strlen(other.data) + 1];
            strcpy(data, other.data);
        } else {
            data = other.data;
        }
    }

    // 析构函数
    ~MyClass() {
        delete[] data;
    }

    void printData() {
        std::cout << data << std::endl;
    }
};

int main() {
    MyClass obj1("Hello");
    MyClass obj2(obj1, true); // 深拷贝
    MyClass obj3(obj1);       // 浅拷贝

    obj1.printData();
    obj2.printData();
    obj3.printData();

    return 0;
}

 

2. 分布式架构中,怎么保证数据的一致性

 

  • 定义

在分布式架构里,数据会分散存储在多个节点上,由于网络延迟、节点故障等因素,数据可能出现不一致的情况。保证数据一致性