2022暑期复习-Day4

Posted Booksort

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    
;

以上是关于2022暑期复习-Day4的主要内容,如果未能解决你的问题,请参考以下文章

如何正确的重写hashcode()?(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day4)

2022暑期复习-Day6

2022暑期复习-Day3

2022暑期复习-Day3

2022暑期复习-Day1

2022暑期复习-Day8