【C++笔试强训】第十四天 末蓝、 2024-04-20 06:15 73阅读 0赞 > **?C++笔试强训** > > -------------------- > > * **博客主页:**[一起去看日落吗][Link 1] > * **分享博主的C++刷题日常,大家一起学习** > * **`博主的能力有限,出现错误希望大家不吝赐教`** > * **分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光** ?。 > > -------------------- > > ![在这里插入图片描述][047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center] ?? -------------------- ## 选择题 ## ### ?第一题 ### 下列有关this指针使用方法的叙述正确的是() A 保证基类保护成员在子类中可以被访问 B 保证基类私有成员在子类中可以被访问 C 保证基类共有成员在子类中可以被访问 D 保证每个对象拥有自己的数据成员,但共享处理这些数据的代码 **this指针跟父类或者子类中的成员能否被访问,没有任何关系** ![请添加图片描述][335e48d6e2584cfc9e9332e8b37255f5.png]**单看这个函数,他怎么知道此时需要返回t1,t2,还是t3的值呢?** 这时候就是需要this指针,代表当前对象的地址 ![请添加图片描述][9d44ca9119cc4bbd9162d172bc402261.png] this保证每个对象拥有自己的数据成员,但共享处理这些数据的代码,代码共享,空间私有 > **`这道题的答案是D`** -------------------- ### ?第二题 ### 有一个类B继承自类A,他们数据成员如下: class A { ... private: int a; }; class B : public A { ... private: int a; public: const int b; A &c; static const char* d; B* e; } 则构造函数中,成员变量一定要通过初始化列表来初始化的是\_\_\_\_。 A a b c B b c e C b c d e D c e E b d F b c **const常量和引用**只能通过初始化列表初始化 **静态成员**必须在类外初始化 > **`这道题的答案是F`** -------------------- ### ?第三题 ### 下面说法正确的是() A C++已有的任何运算符都可以重载 B const对象只能调用const类型成员函数 C 构造函数和析构函数都可以是虚函数 D 函数重载返回值类型必须相同 A 一共有五个运算符不可以重载 ![请添加图片描述][b9445bbdba1f4d6491c706a62cf77ae1.png]B const对象只能调用const类型成员函数 ![请添加图片描述][8bf71ac8b1154ced8493b18981e81196.png]常对象无法调动普通函数 C 构造函数不可以是虚函数 D 函数重载与返回值没有关系,需要通过参数列表 > **`这道题的答案是B`** -------------------- ### ?第四题 ### 下面说法正确的是() A 一个空类默认一定生成构造函数,拷贝构造函数,赋值操作符,引用操作符,析构函数 B 可以有多个析构函数 C 析构函数可以为virtual,可以被重载 D 类的构造函数如果都不是public访问属性,则类的实例无法创建 A 一个类会有默认的五个函数,构造函数,拷贝构造函数,赋值操作符,取地址符,析构函数 B 析构函数只可以有一个 C 析构函数只能有一个,所以不能被重载 D 在特殊情况下可以,不绝对,可以使用静态方法访问 ![请添加图片描述][60fb28e6a83f45bb9422dd8900e90e26.png] > **`这道题的答案是A`** -------------------- ### ?第五题 ### 面向对象设计中的继承和组合,下面说法错误的是?() A 继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复用,也称为白盒复用 B 组合的对象不需要关心各自的实现细节,之间的关系是在运行时候才确定的,是一种动态复用,也称为黑盒复用 C 优先使用继承,而不是组合,是面向对象设计的第二原则 D 继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封装性的表现 这道题我们需要了解继承和组合,继承表示属于其中的一种,属于包含关系。组合代表是其中的一部分。 继承和组合我们首选组合,继承会强调类和类之间的关系 我们在设计中强调的原则 ,《低耦合 高内聚》 C 优先使用组合,组合造成高内聚 > **`这道题的答案是C`** -------------------- ### ?第六题 ### 关于重载和多态正确的是 A 如果父类和子类都有相同的方法,参数个数不同,将子类对象赋给父类后,由于子类继承于父类,所以使用父类指针 调用父类方法时,实际调用的是子类的方法 B 选项全部都不正确 C 重载和多态在C++面向对象编程中经常用到的方法,都只在实现子类的方法时才会使用 D class A{ void test(float a){ cout<<"1";} }; class B:public A{ void test(int b){ cout<<"2";} }; A *a=new A; B *b=new B; a=b; a.test(1.1); 结果是1 A 需要注意看父类的方法是不是虚方法,如果是虚方法则不可能调用子类 C 重载跟子类没有任何关系 D a是指针,如果想调用必须要通过指向符号,这个无法调用 > **`这道题的答案是B`** -------------------- ### ?第七题 ### 以下程序的输出是() class Base { public: Base(int j): i(j) { } virtual~Base() { } void func1() { i *= 10; func2(); } int getValue() { return i; } protected: virtual void func2() { i++; } protected: int i; }; class Child: public Base { public: Child(int j): Base(j) { } void func1() { i *= 100; func2(); } protected: void func2() { i += 2; } }; int main() { Base * pb = new Child(1); pb->func1(); cout << pb->getValue() << endl; delete pb; } A 11 B 101 C 12 D 102 pb->func1() 永远只会调用父类中的fun1,所以i = 10; func2 是虚方法,所以会调用子类,所以+2 所以i = 12; > **`这道题的答案是C`** -------------------- ### ?第八题 ### 下面 C++ 代码的运行结果为() #include<iostream> #include<string> using namespace std; class B0 { public: virtual void display() { cout << "B0::display0" << endl; } }; class B1 :public B0 { public: void display() { cout << "B1::display0" << endl; } }; class D1 : public B1 { public: void display() { cout << "D1::display0" << endl; } }; void fun(B0 ptr) { ptr.display(); } int main() { B0 b0; B1 b1; D1 d1; fun(b0); fun(b1); fun(d1); } A B0::display0 B0::display0 B0::display0 B B0::display0 B0::display0 D1::display0 C B0::display0 B1::display0 D1::display0 D B0::display0 B1::display0 B1::display0 ![请添加图片描述][ceb26623de2841bb89eb312d0547de4f.png] > **`这道题的答案是A`** -------------------- ### ?第九题 ### 下列哪种函数可以定义为虚函数() A 构造函数 B 析构函数 C 内联成员函数 D 静态成员函数 A 构造函数 对象都没构造出来,不可能形成多态 B 析构函数可以定义成虚函数 C 内联函数会展开,最终没有地址,无法存放到虚表 D 内态成员函数没有this指针,调动虚函数需要用到this > **`这道题的答案是B`** -------------------- ### ?第十题 ### 下面 C++ 程序的运行结果为() #include<iostream> using namespace std; class A { public: A(const char* s) { cout << s << endl; } ~A() { } }; class B : virtual public A { public: B(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; } }; class C : virtual public A { public: C(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; } }; class D : public B, public C { public: D(const char* s1, const char* s2, const char* s3, const char* s4) :B(s1, s2), C(s1, s3), A(s1) { cout << s4 << endl; } }; int main() { D* p = new D("class A", "class B", "class C", "class D"); delete p; return 0; } A class A class B class C class D B class D class B class C class A C class D class C class B class A D class A class C class B class D 这道题是一个菱形继承 这道题的构造顺序是ABCD,所以打印顺序也会是ABCD > **`这道题的答案是A`** -------------------- ## 编程题 ## ### ?第一题 ### 链接:[计算日期到天数转换][Link 2] ![请添加图片描述][c7f3dd4cc5ef42e4a886ae7bfb1de8bc.png] * 解题思路 用一个数组存放每月的累积天数 输入的日期天数= 当月的天数 + 当月之前的累积天数 如果包含二月,再去判断是否为闰年,如果是闰年,再加1天即可 * 代码演示 #include <iostream> using namespace std; //判断闰年 bool isLeap(int year) { return ((year%4==0&&year%100!=0)||(year%400==0)); } //根据年月获取相应月份的天数 int getDaysmonth(int year ,int month) { int days[13] = { 29,31,28,31,30,31,30,31,31,30,31,30,31}; if(month == 2 && isLeap(year)) month = 0; return days[month]; } //根据年月日获取这是一年的第几天 int getDays(int year , int month ,int day) { int days = 0; for(int i = 1;i < month;++i) { days += getDaysmonth(year, i); } days += day; return days; } int main() { int year,month,day; int days = 0; while(cin >> year >> month >> day) { days = getDays(year,month,day); cout << days << endl; } return 0; } -------------------- ### ?第二题 ### 链接:[幸运的袋子][Link 3] ![在这里插入图片描述][1afb89464c11485d91c4f786183a1617.png_pic_center] * 解题思路 每次从全集中选择若干元素(小球)组成子集(袋子)。对于任意两个正整数a,b如果满足 a+b>ab,则必有一个数为1.可用数论证明:设a=1+x,b=1+y,则1+x+1+y>(1+x)(1+y),—> 1>xy,则x,y必有一个为0,即a,b有一个为1.推广到任意k个正整数,假设a1,a2,…ak,如果不满足给定条件,即和sum小于等于积pi。如果此时再选择一个数b,能使其满足sum+b > pib,则,b必然为1,且为必要非充分条件。反之,如果选择的b>1,则sum+b <= pi\*b,即a1,a2,…,ak,b不满足给定条件。 因此,将球按标号升序排序。每次从小到大选择,当选择到a1,a2,…,ak-1时满足给定条件,而再增加选择ak时不满足条件(ak必然大于等于max(a1,a2,…,ak-1)),继续向后选择更大的数,必然无法满足!此时不必再继续向后搜索。如果有多个1,即当k=1时,sum(1)>pi(1)不满足,但下一个元素仍为1,则可以满足1+1>1\*1, 所以要判断当前ak是否等于1,如果等于1,虽然不能满足,组合的个数不能增加,但是继续向后搜索,仍然有满足条件的可能.对于重复数字,组合只能算一个,要去重。 * 代码演示 #include <iostream> #include <vector> #include <algorithm> using namespace std; int getLucky(vector<int> &x ,int n ,int pos,int sum,int mul) { int count = 0; for(int i = pos;i < n;++i) { sum += x[i]; mul *= x[i]; //判断幸运与否 if(sum > mul) { count += 1 + getLucky(x,n,i+1,sum,mul); } else if(x[i] == 1) count += getLucky(x,n,i+1,sum,mul); else break;//回溯 sum -= x[i]; mul /= x[i]; //去重 while(i < n-1 && x[i] == x[i+1]) ++i; } return count; } int main() { int n; while(cin >> n) { vector<int> x(n); for(int i = 0;i < n;++i) { cin >> x[i]; } sort(x.begin(),x.end()); cout << getLucky(x,n,0,0,1) << endl; } return 0; } -------------------- [Link 1]: https://blog.csdn.net/m0_60338933?type=blog [047d8ad26e314dc7bc7aa19a6ce9ccb0.jpeg_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/5e38aeaf684649ba8948f2e4f1396f92.jpeg [335e48d6e2584cfc9e9332e8b37255f5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/6511fa67ac004291b4b90b7fd62be381.png [9d44ca9119cc4bbd9162d172bc402261.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/7431857a2b4745e6b137484d03cce25e.png [b9445bbdba1f4d6491c706a62cf77ae1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/c7f7d9e924d145c3bf78854aeaef0b05.png [8bf71ac8b1154ced8493b18981e81196.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/0f9fbdb5b73a43a0af8a2b1fa743d2c0.png [60fb28e6a83f45bb9422dd8900e90e26.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/afe5fdb8ece944879efe5036e0acddef.png [ceb26623de2841bb89eb312d0547de4f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/7df38f66401648ecacee35479196e7ba.png [Link 2]: https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded?tpId=37&&tqId=21296&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking [c7f3dd4cc5ef42e4a886ae7bfb1de8bc.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/8d252123a16b412c930a8e158793e1d5.png [Link 3]: https://www.nowcoder.com/practice/a5190a7c3ec045ce9273beebdfe029ee?tpId=85&&tqId=29839&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking [1afb89464c11485d91c4f786183a1617.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/20/4aaa62b22cf344edb967ff0f8ebd64a0.png
还没有评论,来说两句吧...