C++_day05 作业
C++Day5
一、选择题
1、关于对象概念的描述中,(A )是错误的。
A.对象就是C语言中的结构体 B.对象是状态和操作的封装体
C.对象之间的信息传递是通过消息进行的 D.对象是某个类的一个实例
2、下列说法中正确的是( B )
A.类定义中只能说明函数成员的函数头,不能定义函数体
B.类中的成员函数可以在类体中定义,也可以在类体外定义
C.类中的函数成员在类体外定义时必须要与类声明在同一文件中
D.在类体之外定义的函数成员不能操作该类的私有数据成员
3、有关析构函数的说法不正确的是__________。( C)
A.析构函数有且只有一个
B.析构函数无任何函数类型
C.析构函数和构造函数一样可以有形参
D.析构函数的作用是在对象被撤销时收回先前分配的内存空间
4、定义析构函数时,应该注意(C )
A.其名与类名完全相同 B.返回类型是void类型
C.无形参,也不可重载 D.函数体中必须有delete语句
5、每个类( C )构造函数。
A.只能有一个 B.只可有公有的
C.可以有多个 D.只可有缺省的
6、在类中说明的成员可以使用关键字( AD )进行修饰。(多选题)
A.private B.extern C.auto D.public E.register
7、下列关于对象数组的描述中,那个是错的。( D )
A.对象数组的下标是从0开始的
B.对象数组的数组名是一个常量指针//按照这个理解,应该是指针常量,所以这里也有问题
C.对象数组的每个元素是同一个类的对象
D.对象数组的只能赋初值,而不能被赋值
8、对类的构造函数和析构函数描述正确的是( A)。
A. 构造函数可以重载,析构函数不能重载
B. 构造函数不能重载,析构函数可以重载
C. 构造函数可以重载,析构函数也可以重载
D. 构造函数不能重载,析构函数也不能重载
9、假设Base为一个类,则该类的拷贝初始化构造函数的声明语句为(C )。
A.Base(const Base rhs); B.Base &(const Base rhs);
C.Base(const Base &rhs);D.Base (const Base *rhs);
10、有关类的说法不正确的是_________。( D)
A.类是一种用户自定义的数据类型
B.只有类中的成员函数才能存取类中的私有数据
C.在类中,如果不作特别说明,所有的数据均为私有类型
D.在类中,如果不作特别说明,所有的成员函数均为公有类型
11、以下关于this指针的叙述中正确的是:( D )
A.任何与类相关的函数都有this指针 B.类的成员函数都有this指针
C.类的友员函数都有this指针 D.类的非静态成员函数才有this指针
12、this指针存在的目的是:( B)
A.保证基类公有成员在子类中可以被访问
B.保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码
C.保证基类保护成员在子类中可以被访问
D.保证基类私有成员在子类中可以被访问
13、下面对静态数据成员的描述中,正确的是( B )。
A.静态数据成员可以在类体内进行初始化
B.静态数据成员不可以在类体内进行初始化
C.静态数据成员不能受private控制符的作用
D.静态数据成员可以直接用类名调用
14、下面对静态数据成员的描述中,正确的是( A )。
A.静态数据成员是类的所有对象共享的数据
B.类的每一个对象都有自己的静态数据成员
C.类的不同对象有不同的静态数据成员值
D.静态数据成员不能通过类的对象调用
15、关于静态成员的描述中,( B )是错误的。
A.静态成员可分为静态数据成员和静态成员函数
B.静态数据成员定义后必须在类体内进行初始化
C.静态数据成员初始化不使用其构造函数
D.静态数据成员函数中不能直接引用非静态成员
16、已知:print()函数是一个类的常成员函数,它无返回值,下列表示中,是正确的。( A )
A.void print() const; B.const void print();
C.void const print(); D.void print(const);
17、下面有关类的静态成员和非静态成员,说法错误的是?(C )
A.静态成员存在于内存,非静态成员需要实例化才会分配内存
B.非静态成员可以直接访问类中静态的成员
C.静态成员能访问非静态的成员
D.非静态成员的生存期决定于该类的生存期,而静态成员生存期则与程序生命期相同
二、编程题P
1、实现上课时候的单例模式的代码
#include<bits/stdc++.h>
using namespace std;
class Singleton{
private:
static Singleton *instance;//类的私有静态指针变量
int _data;
private:
Singleton()
:_data(100)
{}
~Singleton(){
cout<<"~Singleton()"<<endl;
}
public:
static Singleton* getInstance(){
if(instance==nullptr){
instance=new Singleton();
}
return instance;
}
static void destroy(){
if(instance){
delete instance;
instance=nullptr;
}
}
void print()const{
cout<<"i come:"<<_data<<endl;
}
};
Singleton* Singleton::instance=nullptr;
void test0(){
Singleton::getInstance()->print();
Singleton::destroy();
}
int main(){
test0();
return 0;
}
jing@jing:~/code/2022-3-31$ ./Singleton
i come:100
~Singleton()
2、上课的时候,单例模式的代码中,对象是放在堆上的,大家可以看看除了堆还有什么地方可以存放这个唯一的对象,并实现相应的代码。
#include<bits/stdc++.h>
using namespace std;
class Singleton{
private:
static Singleton *instance;//类的私有静态指针变量
int _data;
private:
Singleton()
:_data(100)
{}
~Singleton(){
cout<<"~Singleton()"<<endl;
}
public:
static Singleton* getInstance(){
static Singleton instance;
return &instance;
}
static void destroy(){
if(instance){
delete instance;
instance=nullptr;
}
}
void print()const{
cout<<"i come:"<<_data<<endl;
}
};
Singleton* Singleton::instance=nullptr;
void test0(){
Singleton *s1=Singleton::getInstance();
Singleton *s2=s1;
Singleton *s3=Singleton::getInstance();
cout<<s1<<endl<<s2<<endl<<s3<<endl;
s1->print();
}
int main(){
test0();
return 0;
}
jing@jing:~/code/2022-3-31$ ./Singleton_stack_1
0x56334dec2144
0x56334dec2144
0x56334dec2144
i come:100
~Singleton()
3、分别实现new/delete表达式中只能生成栈对象的代码和只能生成堆对象的代码。
//heap.cc
#include<bits/stdc++.h>
using namespace std;
class Student{
private:
int _id;
char *_name;
public:
Student(int id,const char* name)
:_id(id)
,_name(new char[strlen(name)+1]())
{
cout<<"Student()"<<endl;
strcpy(_name,name);
}
void print() const{
cout<<"id:"<<_id<<endl
<<"name:"<<_name<<endl;
}
void destroy(){
delete this;
}
private:
~Student(){
if(_name){
delete[] _name;
_name=nullptr;
}
cout<<"~Student"<<endl;
}
public:
//空间申请
void * operator new(size_t sz){
cout<<"void* operator new (size_t)"<<endl;
void * pret=malloc(sz);
return pret;
}
//回收
void operator delete(void *pret){
cout<<"void operator delete(void*)"<<endl;
free(pret);
}
};
void test0(){
//堆
Student *ps1=new Student(1001,"czj");
ps1->print();
ps1->destroy();
}
int main(){
cout<<sizeof(Student)<<endl;
test0();
return 0;
}
jing@jing:~/code/2022-3-31$ ./Singleton_heap
16
void* operator new (size_t)
Student()
id:1001
name:czj
~Student
void operator delete(void*)
stack.cc
#include<bits/stdc++.h>
using namespace std;
class Student{
private:
int _id;
char *_name;
public:
Student(int id,const char* name)
:_id(id)
,_name(new char[strlen(name)+1]())
{
cout<<"Student()"<<endl;
strcpy(_name,name);
}
void print() const{
cout<<"id:"<<_id<<endl
<<"name:"<<_name<<endl;
}
~Student(){
if(_name){
delete[] _name;
_name=nullptr;
}
cout<<"~Student"<<endl;
}
public:
//空间申请
void * operator new(size_t sz){
cout<<"void* operator new (size_t)"<<endl;
void * pret=malloc(sz);
return pret;
}
//回收
void operator delete(void *pret){
cout<<"void operator delete(void*)"<<endl;
free(pret);
}
};
void test0(){
Student s2(1001,"czj");
s2.print();
}
int main(){
cout<<sizeof(Student)<<endl;
test0();
return 0;
}
jing@jing:~/code/2022-3-31$ ./Singleton_stack
16
Student()
id:1001
name:czj
~Student
三、算法题(选做)
1、题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int len=s.size();
string s1;
int x;
for(int i=0;i<s.size();i++){
x=s[i]-'0';
if(x%2==1){
s1+=s[i];
s[i]='\0';
}
}
for(int i=0;i<s.size();i++){
if(s[i]!='\0'){
s1+=s[i];
}
}
cout<<s1;
return 0;
}
jing@jing:~/code/2022-3-31$ ./1
12345
13524
2、题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int flag1,flag2;
flag1=flag2=1;
while(cin>>s){
for(int i=0;i<s.size();i++){
if((s[0]=='-'||s[0]=='+')&&flag1==1){//处理一开始的符号,如果是+或-,则跳到下一个
flag1=0;
continue;
}
else if((s[i]=='-'||s[i]=='+')&& flag1==0){
cout<<"no"<<endl;
break;
}
else{
if(s[i]!='.'&&s[i]!='e'&&s[i]!='E'){
if(i==s.size()-1){
cout<<"yes"<<endl;
}
}else if((s[i]=='.')&&flag2==1){
flag2=0;
continue;
}else if((s[i]=='.')&&flag2==0){
cout<<"no"<<endl;
break;
}else if((s[i]=='e')&&(i==s.size()-1)){
cout<<"no"<<endl;
break;
}
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】