【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数

本节博客是对阅读剑指offer后的笔记归纳总结,有需要借鉴即可。

目录

1.p21-p25内容概要

面试官对于语言的考察,主要有三种考察形式

  • 1.询问语法概念
  • 2.分析代码
  • 3.写代码

下面来依次进行举例(以cpp为例)并分析,对书中内容进行总结和提炼。

2.询问语法概念

常考:CPP关键字理解

举例:sizeof空类

问:定义一个空类型,里面没有任何函数和变量,其sizeof大小是多少?

答:非0,具体是多少取决于编译器 。原因在于至少给一个字节标识该结构体的存在,从而能够去使用。

问:在该空类型中添加相对于的构造函数和析构函数,sizeof该类型是多大?为什么?

答:依旧是非0 ,原因在于构造函数和析构函数用到的是该类对象的地址,并且类中的函数是存放在内存的公共代码区的,并没有真的放在类对象中。如下图:

3.分析代码

举例:类中拷贝构造的无限递归问题

问:下面代码是否可以进行编译?其结果是什么?

cpp 复制代码
class A
{
private:
int value;
piblic:
A(int n){value = n;}
A(A other) {value = other.value;}
void Print(){std::cout << value << std:endl;}
};

int _tmain(int arge,_TCHAR* argv[])
{
A a = 10;
A b = a;
b.Print();
return 0;
}

其实这个地方我感觉要看编译器怎么看待A(A other) {value = other.value;}该函数了。我自己在vs2022的环境下去测上面代码结果是10

如果编译器将其视为拷贝构造函数,那么编译是可以编过的,但是会陷入无限递归模式。

这是因为CPP语法规定值传参要调用拷贝构造进行拷贝。所以把a要先传给other就得调用拷贝构造,就会陷入无限递归模式。

如果编译器将其视为一般的构造函数重载,编译可以编过并且运行结果是10

这是因为编译器会因为没有拷贝构造而自动提供一份拷贝构造,虽然编译器提供的这个拷贝构造是浅拷贝,但在这个地方也足够用。

4.写代码

常考点:类内成员函数、迭代器

举例:string模拟实现的赋值运算重载

如下图为模拟string的类声明,请补充其赋值运算重载

下面直接给出一般答案,请思考其中的问题:

下面是对上面图片中的问题进行解答:

  • 1.返回类型string&:
    • 引用提高代码效率,引用不存在值拷贝调用拷贝构造问题
    • 返回string支持连续赋值,若为void则连续赋值会报错
  • 2.参数类型const string&
    • 引用提高代码效率
    • const限制str在函数内被修改
  • 3.if必要性
    • 具有必要性。
    • 可以防自赋值,提高代码效率
    • 在当前代码下,若无if,自赋值delete会把str和其本身全部delete,会变成空
  • 4.delete具有必要性
    • 防止内存泄漏长期影响服务器导致崩溃问题
    • 减少资源浪费

然而,虽然上面代码基本凑合,但是还有一个小问题,在特定场景下会出现崩溃。

异常安全性问题
当内存不足时,new char会抛异常,从而终止程序。
在上面代码中,会先删后创,如果发生new抛异常,会造成原string内容丢失。

解决方案:

  • 方案1:将上面代码改为先创建新内容,再删除旧内容
  • 方案2:使用现代写法,即先创建一个临时string变量,再将其内容与*this进行交换
    下面是现代写法示例:

    实际上,这种现代写法本质就是一种代码复用

5.总结

本文主要是用三个例子讲了面试对语法的三种考察形式。

我感觉《剑指offer》这三个例子举得挺好,可以好好思考一波。


EOF

相关推荐
Xiao Fei Xiangζั͡ޓއއ20 分钟前
一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
c语言·开发语言·笔记·程序人生·面试·蓝桥杯·学习方法
NMBG221 小时前
[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
java·开发语言·面试·java-ee·intellij-idea
醉颜凉2 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
hunandede2 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
爱学习的大牛1232 小时前
通过vmware虚拟机安装和调试编译好的 ReactOS
c++·windows内核
tumu_C4 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源
杜若南星4 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
Neophyte06084 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法
云空4 小时前
《InsCode AI IDE:编程新时代的引领者》
java·javascript·c++·ide·人工智能·python·php
写bug的小屁孩4 小时前
websocket初始化
服务器·开发语言·网络·c++·websocket·网络协议·qt creator