【C++ 面试 - 基础题】每日 3 题(十二)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

34. 深 拷贝与浅拷贝的区别,什么时候要深拷贝什么时候要浅拷贝?

浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用

深拷贝:创建一个新的对象和数组,将原对象的各项属性的 “值”(数组的所有元素)拷贝过来,是 “值” 而不是 “引用”。

当类中的成员变量指向动态分配的内存时,进行对象拷贝操作时需要使用深拷贝,以确保新的对象与原始对象完全独立,对一个对象的修改不会影响另一个对象,并且防止二次析构的问题。

当类中的成员变量不指向动态分配的内存时,进行对象拷贝操作时可以使用浅拷贝。这是因为在这种情况下,复制指针并不会对程序产生任何负面影响。

案例:

#include <iostream>
#include <cstring>

class MyString {
private:
    char* str;

public:
    // 深拷贝的构造函数
    MyString(const char* s) {
        int len = strlen(s) + 1;
        str = new char[len];
        strcpy(str, s);
    }

    // 深拷贝的赋值重载运算符
    MyString& operator=(const MyString& other) {
        if (this != &other) {
            delete[] str; // 先释放原来的资源
            int len = strlen(other.str) + 1;
            str = new char[len];
            strcpy(str, other.str);
        }
        return *this;
    }

    // 浅拷贝的构造函数,默认浅拷贝
    // MyString(const MyString& other) {
    //     str = other.str;
    // }

    // 浅拷贝的赋值重载运算符,默认浅拷贝
    // MyString& operator=(const MyString& other) {
    //     if (this != &other) {
    //         str = other.str;
    //     }
    //     return *this;
    // }

    ~MyString() {
        delete[] str;
    }

    void print() {
        std::cout << str << std::endl;
    }
};

int main() {
    MyString s1("Hello");
    MyString s2 = s1; // 深拷贝
    MyString s3("World");

    s1.print(); // 输出Hello
    s2.print(); // 输出Hello

    s2 = s3; // 深拷贝
    s2.print(); // 输出World

    return 0;
}

35. 整型 变量为什么不是原子的?

因为 int a=10 这样一句定义,转换成汇编代码可能会有三句,那么当存在多线程程序时,万一在汇编代码三句中时间片用完了,就可能发生不可预料的情况。

36. 在头文件把一个变量申明为 static 变量,那么引用该头文件的源 文件能够访问到该变量吗?

可以。声明 static 变量一般是为了在本 cpp 文件中的 static 变量不能被其他的 cpp 文件引用,但是对于头文件,因为 cpp 文件中包含了头文件,故相当于该 static 变量在本 cpp 文件中也可以被见到。当多个 cpp 文件包含该头文件中,这个 static 变量将在各个 cpp 文件中将是独立的,彼此修改不会对相互有影响。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值