建设网站专业公司,个人业务网站创建,八埏网站开发,wordpress不同页面广告#x1f308;一、选择题❤1.下列哪一个是析构函数的特征#xff08; #xff09;。A: 析构函数定义只能在类体内 B: 一个类中只能定义一个析构函数
C: 析构函数名与类名相同 D: 析构函数可以有一个或多个参数答案#xff1a;B答案解析#xff1a;析构函数是构造函…一、选择题❤1.下列哪一个是析构函数的特征 。A: 析构函数定义只能在类体内 B: 一个类中只能定义一个析构函数
C: 析构函数名与类名相同 D: 析构函数可以有一个或多个参数答案B答案解析析构函数是构造函数的逆函数,它的功能是用来释放一个对象,它也是一种特殊的构造函数。它具有如下特点:函数名同类名,并前边加修饰符~。定义该函数时不加返回类型。该函数无参数。该函数通常是系统在释放所创建对象时自动调用的。一个类中只能有一个析构函数。析构函数既能在类内定义也能在类外定义。❤2.如果有一个类是 myClass , 关于下面代码正确描述的是 。myClass::~myClass(){
delete this;
this NULL;
}
A: 正确我们避免了内存泄漏 B: 它会导致栈溢出
C: 无法编译通过 D: 这是不正确的它没有释放任何成员变量答案C答案解析析构函数的作用当对象生命周期结束后收回对象占用的资源。delete 的作用用于收回new分配的内存空间。再来看delete this这句代码 在析构函数中delete this时代码是可以通过编译的。但是如果代码中具体创建了这个类的对象时代码会在运行中崩溃。 delete实现是通过调用析构函数完成的也就是会形成死循环造成栈溢出并且delete清除的是堆上new开辟的)的对象,但是不是所有的对象都是堆上开辟的。在没有new的前提下对资源进行delete就会导致运行崩溃。 但是这个还不是最关键的。在析构函数中this NULL; 这一句会直接导致编译失败因为 this指针的类型为 类类型 * const 。this指针本身的值是无法修改的。❤3.设已经有 A,B,C,D 4个类的定义程序中 A,B,C,D 析构函数调用顺序为C c;
void main()
{
A*panew A();
B b;
static D d;
delete pa;
}
A: A B C D B: A B D C
C: A C D B D: A C B D答案B答案解析对于类A,是建立在堆上的对象指针pa,手动释放 对于类B,是建立在栈上的对象 , main函数结束就释放 对类C在静态存储区创建了一个对象c程序结束时候释放 对类D也是在静态存储区建立对象d但是局部变量程序结束时候释放析构函数调用顺序。首先手动释放pa 所以会先调用A的析构函数其次是C,B, D编译器先构造的是全局对象C然后是静态局部对象D最后是普通对象B所以三者的析构顺序完全相反B-D-C,综上来说就是A-B-D-C。答案是B。❤4.假定有类 AB 有相应的构造函数定义能正确执行AB a(4),b(5),c[3],*p[2]{a,b};
语句请问执行完此语句后共调用该类的构造函数次数为 。
A: 5 B: 4
C: 3 D: 9答案A答案解析只有给对象分配内存才调用构造函数 AB a(4) 定义对象a, 调用了带一个参数的构造AB b(5)跟上面的性质类似, 调用了带一个参数的构造AB c[3] 跟上面的性质类似, 定义对象数组,调用无参构造3次AB *p这至是一个指针,没有指向任何空间,更么有分配内存,不会调构造❤5.下面有关类的静态成员和非静态成员说法错误的是 。A: 静态成员变量存在与数据段非静态成员需要实例化才会分配内存
B: 非静态成员函数中可以直接访问类中静态的成员
C: 静态成员函数中能访问非静态的成员
D: 非静态成员的生存期决定于该类对象的生存期而静态成员生存期则与程序生命期相同答案C答案解析静态成员变量1、所有对象共享同一份数据2、在编译阶段分配内存3、类内声明类外初始化。 静态成员函数1、所有对象共享同一个函数2、静态成员函数只能访问静态成员变量。A选项静态成员存在于内存非静态成员需要实例化才能分配内存。B选项静态成员属于类非静态成员属于对象对象必须实例化才存在而类一直在所以不可以用静态成员函数访问非静态成员因为非静态可能不存在。因为静态成员存在于内存所以非静态成员函数可以访问静态成员。所以B正确C错误。D选项D选项不严谨非静态成员函数的生存期决定于对象的生存期不是类静态成员的生存期取决于进程的生存期。二、编程题第1题字符串压缩思路分析这个题如果一个一个遍历然后再数出每一个字符的个数然后拼接成新字符最后再和原字符比较的话一点都不简单而且特别繁琐。这里的话可以考虑一下双指针解答一个记录字母一个记录字母的个数简单明了然后再利用一下to_string函数将数字转化为字符串接下来一比较就完成了。string compressString(string S) {int N S.length();string res; //拼接已经记录好的字符int i 0;while (i N) { int j i; //双指针i,jwhile (j N S[j] S[i]) {j;}res S[i]; //先记录字符res to_string(j - i); //在把字符的个数的数字转化为字符i j; //再继续记录下一个字符}if (res.length() S.length()) {return res;} else {return S;}
}这个题的关键不是用不用to_string函数而是双指针。难并不是看不懂那种对于各位小伙伴来说都是小趴菜。这就不过多的说了。今天就更新一道编程题了开学了休息一下