我是靠谱客的博主 丰富冥王星,最近开发中收集的这篇文章主要介绍C++引用的正确使用--从常见的面试题说起系列2,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C++中的引用使用起来还是比较方便的,但是对初学者也容易使用错误导致系统崩溃等问题。

因此也成为面试官们常问到的知识点。有这么一个问题:

class A

{

public:

    A(){m_pszContent = NULL;}

    virtual ~A(){delete[] m_pszContent;}

    char* m_pszContent;

}

void F()

{

    A a;   A& aa = a;

    .......  // 对aa进行操作,为m_pszContent申请内存等, 最后aa.m_pszContent  为“123”;

    if()

    {

        A b;

        ...... // 对b进行操作,为m_pszContent申请内存等

        aa = b;

        strcpy(aa.m_pszContent,“456”);

    }

    printf(a.m_pszContent);

}

请问最后打印的 a.m_pszContent 的字符串是什么?

如果你是面试者,你能准确的回答这个问题么?

 

其实这里面除了考了引用的使用方法外,还有一个知识点,=号运算符。

引用的特点:引用必须也只能是在定义的时候初始化。

因此其他非定义的地方给引用赋值,其实不是引用到新的对象,而是执行了一次赋值运算,会调用=号运算符,如果类没有重载=号运算符,则执行默认=号运算(即两个对象内容拷贝)

这个题目中,第一次aa引用a后,对aa操作其实也就是对a操作,a.m_pszContent 为 “123”

第二次aa = b; 时,实际是给a进行了赋值,这时a.m_pszContent 和 b.m_pszContent 指向同一个地址,前面a.m_pszContent 申请的内存泄漏了;

当出了 if 语句后,b析构了,将b.m_pszContent ,因为a.m_pszContent 跟b的地址相同,因此内存也释放了, a.m_pszContent为野指针。

后面再打印a.m_pszContent,则会出现不确定结果,甚至可能进程崩溃。

 

最后

以上就是丰富冥王星为你收集整理的C++引用的正确使用--从常见的面试题说起系列2的全部内容,希望文章能够帮你解决C++引用的正确使用--从常见的面试题说起系列2所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部