C++面试题(4)

SpringBoot+MyBatis-Plus实战:从零构建物资管理系统,掌握并发库存控制 在Java企业级应用开发中,SpringBoot作为快速开发框架,通过简化配置和依赖管理,极大提升了项目启动效率。其核心原理是基于约定大于配置的理念,内嵌Web服务器,使开发者能专注于业务逻辑实现。结合MyBatis-Plus这一持久层增强工具,可以在保留灵活SQL能力的同时,高效完成数据访问层开发,这对于需要精细控制数据库操作的管理系统尤为重要。在涉及库存、订单等核心业务时,数据一致性是技术价值的关键体现,通常需要通过事务管理和并发控制机制来保障。例如,在物资管理、电商库存等典型应用场景中,乐观锁是防止超 阅读详情

关于C++的面试方面,林锐博土的<<高质量C++/C编程指南>>里附带的一些试题被大量引证来测试应试人员的基础。很不幸,我也被做了一份,回来后,和林锐的标准答案一对,觉得,他的答案还是有些不足之处,下面我就说说那两个题,也许凭记忆能回忆起面试中的一些趣事。

已知strcpy函数的原型是

char *strcpy(char *strDest, const char *strSrc);

其中strDest是目的字符串,strSrc是源字符串。

不调用C++/C的字符串库函数,请编写函数 strcpy

林锐的标准答案如下:

char *strcpy(char *strDest, const char *strSrc);

{

         assert((strDest!=NULL) && (strSrc !=NULL));   // 2分

         char *address = strDest;                     // 2分

         while( (*strDest++ = * strSrc++) != ‘/0’ )      // 2分

           NULL ;

         return address ;                            // 2分

}

我在写时,写出下面这样子的:

char *strcpy_x(char *strDest, const char *strSrc)

{

    if((strDest==NULL) || (strSrc ==NULL))

       return NULL;       // 2分

    if(strDest==strSrc)//add by xie

       return strDest;  

    char *address = strDest;                                     // 2分

    while( (*strDest++ = * strSrc++) != ''/0'' )              // 2分

       ;

   return address ;                                          // 2分

}

我当时这样写的理由如下:

a. 没必要为一个strcpy函数中的参数有NULL就断言大错涌出,返回NULL值也是一个好见识

b. 为了防止写出strcpy(strDest,strSrc)(而strDest是等于strSrc,又很不凑巧strDest是大字串,这些代码又运行一种比较计时的环境下,所以判断是否相同应该是必须的。更重要的一点:林锐的这篇文章影响了好多公司招人,这样一写,我给别人留下的印象是不同的,你认为呢?:)

2. 相信大部人都看过甚至做过下面这个题:

已知类String的原型为:

    class String

    {

      public:

        String(const char *str = NULL);  // 普通构造函数

        String(const String &other);        // 拷贝构造函数

        ~ String(void);                        // 析构函数

        String & operate =(const String &other);    // 赋值函数

      private:

        char      *m_data;                // 用于保存字符串

    };

       请编写String的上述4个函数。

在我给出我找碴的理由先,我先给出林锐的标准答案及指出一点不足处:

// String的析构函数

       String::~String(void)               // 3分

{

    delete [] m_data;                        

// 由于m_data是内部数据类型,也可以写成 delete m_data;

       }

       // String的普通构造函数            

       String::String(const char *str)      // 6分

{

    if(str==NULL)                         

    {

        m_data = new char[1];    // 若能加 NULL 判断则更好(你都白痴的,还判断null干鸟啊)

        *m_data = ‘/0’;                     

    }                                         

    else

    {

        int length = strlen(str);          

        m_data = new char[length+1];  // 若能加 NULL 判断则更好     

        strcpy(m_data, str);               

    }

}  

// 拷贝构造函数

    String::String(const String &other)   // 3分

    {  

    int length = strlen(other.m_data); 

    m_data = new char[length+1];      // 若能加 NULL 判断则更好   

    strcpy(m_data, other.m_data);        

}

// 赋值函数

    String & String::operate =(const String &other)    // 13分

    {  

      // (1) 检查自赋值                     // 4分

        if(this == &other)

           return *this;

// (2) 释放原有的内存资源            // 3分

        delete [] m_data;

       // (3)分配新的内存资源,并复制内容 // 3分

    int length = strlen(other.m_data); 

    m_data = new char[length+1];         // 若能加 NULL 判断则更好

        strcpy(m_data, other.m_data);

       // (4)返回本对象的引用            // 3分

        return *this;

}  

我记得我去年初买了<<inside C++ object modules>>时,里面也以String为例作了一个介绍,不过书到用时找不到,因为我已送给好学后进了。而电子版的,我当时在网上看了,但好像没当下来。我依稀记得里面的拷贝构造函数也要判断if(this == &other)的,不过我认为要是已实现了operator==函数的话,if(*this == other)会更好一些,因为例如象String的两个对象,内容一样,一个给另一个赋值时,用if(*this == other)的判断的话,就可避免下一些操作了。黑夜给了我黑色的眼,我睁一只眼闭一只眼都可以看出上面的标准答案里关于拷贝构造函数中没有这样的判断,对了,上文中的operator被误写成operate了,那些公司里的试题也是这样子的,让我看的时候愣了下。

大家可能会认为拷贝构造函数是构造函数,怎么会传进去它自己呢?肯定是别的对象了。很搞笑的是:String ss(ss),没错,String ss(ss=”xieyingjun”)也是对的写法(对了,我没就这个C++语意查看C++标准,要是根据C++98的标准,我的说法扯淡,也请付之一笑)。文后我附上本篇文章的测试代码。您也可以在C++Builder中先打上这两行,看看结果:AnsiString ss(ss=”xieyingjun”);ShowMessage(ss); 不过,很不幸,类似的代码用STL中的String或VC中的CString来实现,运行结果好象并非是一帆风顺。

#include <iostream>

char *strcpy_x(char *strDest, const char *strSrc)

{

    if((strDest==NULL) || (strSrc ==NULL))

       return NULL;       // 2分

    if(strDest==strSrc)//add by xie

       return strDest;  

    char *address = strDest;                                     // 2分

    while( (*strDest++ = * strSrc++) != ''/0'' )              // 2分

        ;

   return address ;                                          // 2分

}

class String

       {

         friend std::ostream& operator <<(std::ostream& os, const String& arg);       //add by xie

         public:

              String(const char *str = NULL);  // 普通构造函数

              String(const String &other);           // 拷贝构造函数

              ~ String(void);                              // 析构函数

              String & operator =(const String &other); // 赋值函数

        private:

              char         *m_data;                            // 用于保存字符串

       };

// String的析构函数

String::~String(void)               // 3分

{

       delete [] m_data;

       m_data=0; //add by xie                       

// 由于m_data是内部数据类型,也可以写成 delete m_data;

//note by xie:有次去华为,华为批题,写成delete m_data;不给分,一个人的见识就是这样得来的,:P 

}

       // String的普通构造函数            

String::String(const char *str)      // 6分

{

       if(str==NULL)                         

       {

              m_data = new char[1];    // 若能加 NULL 判断则更好

              *m_data = ''/0'';                     

       }                                           

       else

       {

              int length = strlen(str);          

              m_data = new char[length+1];  // 若能加 NULL 判断则更好     

              strcpy(m_data, str);               

       }

}    

// 拷贝构造函数

       String::String(const String &other)   // 3分

       {    

        if(this==&other)

           return; //add by xie

       int length = strlen(other.m_data);    

       m_data = new char[length+1];      // 若能加 NULL 判断则更好   

       strcpy(m_data, other.m_data);        

}

// 赋值函数

       String & String::operator =(const String &other)    // 13分

       {    

              // (1) 检查自赋值                     // 4分

              if(this == &other)

                     return *this;

// (2) 释放原有的内存资源            // 3分

              delete [] m_data;

              // (3)分配新的内存资源,并复制内容 // 3分

       int length = strlen(other.m_data);    

       m_data = new char[length+1];         // 若能加 NULL 判断则更好

              strcpy(m_data, other.m_data);

// (4)返回本对象的引用            // 3分

              return *this;

}    

std::ostream& operator <<(std::ostream& os, const String& arg) //add by xie

{

  os<<arg.m_data;

  return os;  

}

int main()

{

  const char s1[]="hello world!";

  char s2[100];

  char s3[100];

  strcpy_x(s3, strcpy_x(s2,s1));

  std::cout<<"s3:"<<s3<<std::endl;

  std::cout<<"s2:"<<s2<<std::endl;

  String ss(ss=s1);

  std::cout<<"ss:"<<ss<<std::endl;

 /*此处会报一个内存不能read的错,具体原因引起,还要看C++标准关于这处的语意定义,再作修改,不过要是有人写出大量的不当类似实现代码也会造成内存泄露的。 */

  return 0;

}

c++ 练习4 google面试题 谷歌面试题:1024! 末尾有多少个0? 思路: 末尾0的个数取决于乘法中因子2和5的个数。显然乘法中因子2的个数大于5的个数,所以我们只需统计因子5的个数。 是5的倍数的数有: 1024 / 5 = 204个 是25的倍数的数有:1024 / 25 = 40个 是125的倍数的数有:1024 / 125 = 8个 是625的倍数的数有:1024 / 625 = 1个 所以102 阅读详情

相关推荐

C++面试题4:memcpy的用法

C++面试题4:memcpy的用法 memcpy函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(desk所指向的内存区域);拷贝多少个?有一个size变量控制 用法:可以拷贝任何类型的对象,因为函数的参数类型是void*,也就是说传进去的实参可以是int *,short*,char*等等。 原型:void *memcpy(void *desc, void *src, un

Voidwalkerxiaohui 2881

微软公司等数据结构+算法面试100题(第1-100题)全部出炉

微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相                        作者:July、2010年12月6日。更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.youkuaiyun.com/v_july_v/article/details/6870251。关于此100道面试题的所有一切详情,包括答案,资源

结构之法 算法之道 24万+

C/C++基础题005.工资

Hello: Person person = new Person(); person.Name = “xueyubin”; person.WeChat = “18309212110”; person.HeaderPhoto=“戴眼镜、黑眼圈、格子衫、牛仔裤、双肩包”; person.Sex = “男”; String major[] = { ‘C’,“C++”, “Linux”,“MySQL” }; person.IWantSay(“关心足够大的问题,注重考察成本的增长趋势!”) 加入专栏,变强!!!..

C/C++/Linux/MySQL 653

this != &other 这个是什么意思

&other` 的目的是确保赋值操作不会自我赋值。如果 `this`(当前对象)的地址与 `&other`(另一个对象)的地址相同,那么它们是同一个对象,即自我赋值。在这种情况下,赋值操作不需要执行任何操作,直接返回当前对象的引用 `*this`。自我赋值是指将一个对象赋值给自身,例如 `str1 = str1`。可以理解为 `this` 是一个指向当前对象的指针,而 `&other` 是指向另一个对象的指针。= &other` 是一个指针比较操作,用于检查当前对象的地址是否与另一个对象的地址不同。

f593256的博客 627

C++版 - 剑指offer 面试题4: 替换空格 题解

面试题4:替换空格 参与人数:10327 时间限制:1秒 空间限制:32768K 本题知识点:字符串 题目描述 请实现一个函数void replaceSpace(char *str,int length),将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 分析:

极客学长Bravo | 突破信息差 | 副业生财有术 1338

C++常见面试题-4.STL

STL(标准模板库)是C++的核心组件,包含六大模块:容器(存储数据)、迭代器(访问元素)、算法(操作元素)、函数对象(仿函数)、适配器(调整接口)和分配器(内存管理)。容器分为顺序容器(如vector、list)、关联容器(如set、map)和无序容器(如unordered_set)。vector适合频繁随机访问,list适合任意位置插入删除;map基于红黑树实现有序存储,unordered_map基于哈希表实现快速查找。STL各组件协同工作,为C++提供了强大的泛型编程能力。

qq_31709205的博客 1014

C++ 实现Variant类

Variant类借鉴于Qt的QVariant类,类似于Boost的any类。它把常用类型使用一个类包装起来,这样使用QVector等容器时,其内部就可以存储不同的数据。例如: std::vector<Variant> vec; vec.push_back(1); // 整形 vec.push_back("str"); // 字符串 vec.push_back(f...

WSG的博客--盛年不重来,一日难再晨.及时当勉励,岁月不待人. 4038

Android开发Intent详解

本文详解Android开发Intent。

qq_30725967的博客 2414

2024年最全cpp程序优化 嵌入式C C++代码优化 C C++代码优化具体方案_c+(4),腾讯C C++面试题社招

为了提高执行速度,用下面这段代码来替换这个上面的switch语句。

2401_84973321的博客 302

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

AutoDL上传数据详细步骤(自己用的步骤,可能没有其他大佬用的那么高级)

孟孟单单的博客 7万+

尚硅谷课程【笔记】——大数据之Shell【一】

【【尚硅谷】Shell脚本从入门到实战】笔记

n04j04h06的博客 1319

C++面试题4

 1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?virtual修饰符会被隐形继承的。private 也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类

xiaoyu315的专栏 1200

【存储原理】IO超时处理 块层block-scsi层之间

【存储原理】IO超时处理 块层block-scsi层之间

sinat_37817094的博客 1024

c++面试题4

字符串的几个问题

The Coding World 648

关于UMI设备采集数据的模型训练方法

模仿学习如专家模型、VLA模型,ACT、DP、openpi等算法模型训练时,都是使用的机器人的绝对位姿或关节角;而UMI记录的轨迹是相对于UMI起始点的,可以理解为是相对于起点的绝对增量,对应到机器人中就是相对于末端TCP的增量。在用模型进行训练时,当然可以,但这样进行模型训练的话达不到跨本体的能力,因为模型本身还是学习的基于机器人base坐标系的绝对位姿关系,倘若用这种方式进行处理,则UMI可以理解为是一个遥操的方法,本质还是记录的机器人的state。在看了和。

boss-dog 421

【大模型】SpringBoot整合LangChain4j实现RAG检索实战详解

SpringBoot整合LangChain4j实现RAG检索实战详解

congge 1万+

4 c/c++面试题

16 typedef和define有什么区别16 typedef。

wt20050610的博客 579

ConvNeXt 系列改进:二次创新 ConvNeXt:结合 RepVGG 结构重参数化,训练多分支、推理单路

2026年的视觉模型赛道呈现出一种有趣的“返璞归真”趋势——在Transformer狂飙数年之后,卷积网络正以全新的姿态回归。这其中,ConvNeXt无疑是纯卷积阵营中最耀眼的明星。从2022年Meta AI首次提出至今,ConvNeXt系列已经走过了近四年的演进之路,衍生出ConvNeXt V2、E-ConvNeXt等多个增强版本。ConvNeXt的7×7深度卷积带来了不错的感受野,却也埋下了推理效率的隐患。

ZXSXJ的博客 234

c/c++面试题(4)

许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。

yxyong2006的专栏 528

OpenFeign整合Sentinel实现熔断降级

常用于实现熔断降级的框架有Hystrix、Sentinel,我们常说的Spring Cloud项目说的其实是Spring Cloud Netflix,Hystrix以及前面学习过的Ribbon都是Netflix系的家族成员,所以使用Hystrix可以非常简单的与当前项目中使用到的OpenFeign、Ribbon整合,但笔者并没有选择Hystrix,而是选择阿里系的Sentinel。 为什么选择Sentinel而不是Hystrix?从接入简单考虑可能选择Hystrix是不错的选择,但笔者对Hyst...

吴就业 6718

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C/C++面试题大汇总4【转】

1.介绍一下STL,详细说明STL如何实现vector。 Answer: STL (标准模版库,Standard Template Library.它由容器算法迭代器组成。 STL有以下的一些优点: 可以方便容易地实现搜索数据或对数据排序等一系列的算法; 调试程序时更加安全和方便; 即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。 vector

大磊大的专栏 980

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

面试之C++面试题汇总4

1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之

283

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c++面试题总结(4)

一.找错题 试题1: void test1() {  charstring[10];  char* str1 ="0123456789";  strcpy( string, str1 ); }   试题2: void test2() {  charstring[10],str1[10];  int i;  for(i=0; i10; i++)

无形的风专栏 627
上一篇: C++面试题(3)
下一篇: C++面试题(5)
manplus
博客等级 码龄22年 6粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值