2022暑期复习-Day4

前几天有事,一直没法发博客,这几天补上

选择题

Q1下列哪一个是析构函数的特征( )。

A: 析构函数定义只能在类体内
B: 一个类中只能定义一个析构函数
C: 析构函数名与类名相同
D: 析构函数可以有一个或多个参数

析构函数,用于系统调用来清理对象,回收资源,一个类有且只有一个析构函数,析构函数不能有参数

析构函数的函数体可以在类内,也能在类外。

与类名相同的函数是构造即构造的重载

答案:B

Q2 如果有一个类是 myClass , 关于下面代码正确描述的是( )。

在这里插入图片描述

A: 正确,我们避免了内存泄漏
B: 它会导致栈溢出
C: 无法编译通过
D: 这是不正确的,它没有释放任何成员变量

引用我的笔记
在这里插入图片描述

答案:B

Q3 设已经有 A,B,C,D 4个类的定义,程序中 A,B,C,D 析构函数调用顺序为( )

在这里插入图片描述
A: A B C D
B: A B D C
C: A C D B
D: A C B D

先要对各种对象的生命周期理清楚

  • 全局对象在main函数调用前构造,在main结束后析构
  • 函数中的对象在创建时构造,在出了作用域/函数结束时析构
  • 静态对象在创建时构造,在main结束后析构
  • 在堆上创建的对象,如果不delete,那么就不会析构,造成内存泄漏的问题。

全局对象C 和 静态对象D 依旧是 符合 先创建后析构的规则
对象A 在main函数结束前,进行delete,所以是A最先
然后,main函数结束,对象B析构
最后就是 C、D两对象,先创建后析构

答案:B

Q4 假定有类 AB ,有相应的构造函数定义,能正确执行语句,请问执行完此语句后共调用该类的构造函数次数为( )。

AB a(4),b(5),c[3],*p[2]={&a,&b};

A: 5
B: 4
C: 3
D: 9

只创建了 a , b , c,c是一个AB类的对象数组,所以每个都是一个AB类对象,都是需要调用构造函数
p只是个指针数组,指向前面两个对象,是不会调用构造函数的
所以只调用了构造函数2+3=5次

答案:A

Q5下面有关类的静态成员和非静态成员,说法错误的是( )。

A: 静态成员变量存在与数据段,非静态成员需要实例化才会分配内存
B: 非静态成员函数中可以直接访问类中静态的成员
C: 静态成员函数中能访问非静态的成员
D: 非静态成员的生存期决定于该类对象的生存期,而静态成员生存期则与程序生命期相同

访问非静态成员需要一个隐式的this指针,而静态成员函数中是没有this指针的,是不能访问非静态成员的。
可以参考2022暑期复习-Day3-Q5

答案:C

编程题

Q6

在这里插入图片描述
把握连续相同字符的边界条件,主要是把握最后一个字符的特例。

class Solution {
public:
    string compressString(string s) {
        string ret="";
        int i=0;
        int len=s.size();
        int prev=0;
        while(i<len)
        {
            if(s[i]==s[prev]&&((i<len-1&&s[i+1]!=s[prev])||(i==len-1)))//把握连续字符的条件
            {
                //加入字符,加入数字
                ret+=s[prev];
                int num=i-prev+1;
                string temp="";
                while(num)
                {
                    int tmp = num%10;
                    num = num/10;
                    temp.insert(0,1,tmp+'0');
                }
                ret += temp;
                prev=i+1;
            }
            i++;
        }
        if(ret.size()>=s.size())
            return s;
        return ret;
    }
};

Q7

在这里插入图片描述

使用传统的先乘在加,传统的竖式计算方法
还需要处理乘0造成的全零特例

class Solution {
public:
    string AddString(const string& s1, const string& s2)
    {
        string ret="";
        
        int len1 = s1.size(),len2 = s2.size();
        int i=len1-1,j=len2-1;
        int carry = 0;
        while(i>=0||j>=0||carry)
        {
            int r1 = (i>=0)?(s1[i] - '0'):(i=-1,0);
            int r2 = (j>=0)?(s2[j] - '0'):(j=-1,0);
            int sum = r1 + r2 + carry;
            carry  = sum /10;
            ret.insert(0,1,(sum%10 + '0'));
            i--;
            j--;
        }
        return ret;
    }
    string multiply(string num1, string num2) {
        int len1 = num1.size();
        int len2 = num2.size();
        string ret ="";
        for(int i=0;i<len2;i++)
        {
            int carry = 0;
            string temp="";
            for(int j=len1-1;j>=0;j--)
            {
                int sum = (num2[i]-'0')*(num1[j]-'0') + carry;
                carry = sum/10;
                temp.insert(0,1,(sum %10 + '0'));
            }
            if(carry)
                temp.insert(0,1,(carry + '0'));
            //cout<<"temp:"<<temp<<endl;
            if(i>0)
                ret += "0";
            //cout<<"ret:"<<ret<<endl;
            ret = AddString(ret ,temp);
            int ts = ret.size();
            string panduan(ts , '0');
            if(ret == panduan)
                ret ="0";
            //cout<<"temp+ret = "<<ret<<endl;
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值