在C++笔试中常见的题目解析

本文提供了C++笔试中常见的题目及其解析代码,包括链表反转、自定义String类及strcpy函数实现等,并探讨了C++类型安全性、内存分配方式等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我看了一些资料,找到一些在笔试中常用到的题目的解析,自己从中挑了一些作为练习,拿出来供大家参考!
直接以代码的形式给出了部分题目的解析代码!与君共勉之!

//在C++笔试中常见的题目解析

#include <iostream>
#include <algorithm>
#include <time.h>

using namespace std;

//1.链表反转
class ReverseLink
{
public:
    ReverseLink()
    {
        head=NULL;
    }
    ~ReverseLink()
    {
        while(head)
        {
            LinkNode* tmp=head->next;
            delete head;
            head=tmp;
        }
    }
public:
    void createLink()
    {
        head=new LinkNode();
        LinkNode* pH=head;
        srand((unsigned int)time(NULL));
        for(int i=0;i<10;i++)
        {
            LinkNode* pTmp=new LinkNode();
            pTmp->next=NULL;
            pTmp->data=rand();
            pH->next=pTmp;
            pH=pTmp;
        }
        pH->next=NULL;
    }

    void OutPut()
    {
        LinkNode* pH=head->next;
        while(pH!=NULL)
        {
            cout << pH->data << " ";
            pH=pH->next;
        }

        cout << endl;
    }

    void MyReverse()
    {
        if(head==NULL || head->next==NULL)
            return ;
        LinkNode *next,*cur;

        cur=head->next;
        head->next=NULL;

        while(cur)
        {
            next=cur->next;
            cur->next=head->next;
            head->next=cur;

            cur=next;
        }
    }
private:
    typedef struct _Link
    {
        int data;
        struct _Link* next;
    }LinkNode;
    LinkNode* head;
};


//2.自定义实现String类的功能
#include <string>
#include <string.h>
using namespace std;

class MyString
{
public:
    MyString(){ m_data=NULL; }
    MyString(const char*str=NULL)
    {
        if(str==NULL)
        {
            m_data=new char[1];
            m_data[0]='\0';
        }
        else
        {
            if(m_data)
                delete []m_data;
            m_data=new char[strlen(str)+1];
            strcpy(m_data,str);
        }
    }
    MyString(const MyString&another)
    {
        if(another.m_data!=NULL)
        {
            if(m_data!=NULL)
                delete []m_data;
            m_data=new char[strlen(another.m_data)+1];
            strcpy(m_data,another.m_data);
        }
    }
    ~MyString()
    {
        if(m_data!=NULL)
            delete []m_data;
    }
public:
    MyString& operator=(const MyString&rhs)
    {
        if(this==&rhs)
            return *this;
        if(m_data!=NULL)
            delete []m_data;
        m_data=new char[strlen(rhs.m_data)+1];
        strcpy(m_data,rhs.m_data);
        return *this;
    }

private:
    char* m_data;
};

//3.请编写自己的strcpy()
char* MyStrcpy(char* strDest,const char* strSrc)
{
    if(strDest == NULL || strSrc == NULL)
        return NULL;
    if(strDest == strSrc)
        return strDest;
    char* tmp=strDest;
    while((*strDest++=*strSrc++) != '\0')
        return tmp;
    return NULL;
}

/*
4.C++是不是类型安全的?
  C++不是类型安全的,两个不同类型的指针之间可以进行强制转换
*/

/*
5.描述内存分配的方式以及他们的区别?
(1).从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运
    行期间都存在。例如全局变量,static 变量。
(2).在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行
    结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
(3).从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的
    内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,
    使用非常灵活,但问题也最多。
*/
/*
6.说说const与#define相比的区别于联系?
  const常量是有数据类型的,而宏变量是没有数据类型的;
  编译器可以对const进行类型检查,而对后者仅仅是进行字符串的替换,可能会产生不可以预料的错误
  有些集成化的调试工具可以对const常量进行调试 ,而对于#define类的宏常量不能进行替换。
*/
int main()
{
    ReverseLink rLink;
    rLink.createLink();
    rLink.OutPut();
    rLink.MyReverse();
    rLink.OutPut();
    //7.打印出文件目录已经成本语句所在的行号
    cout << __FILE__ << endl;
    cout << __LINE__ << endl;
    //8.打印出本文件是有那个编译器编译的
    #ifdef __cplusplus
    cout << "c++" << endl;
    #else
    cout << "C" << endl;
    #endif // __cplusplus
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值