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的主要内容,如果未能解决你的问题,请参考以下文章