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;
}
posted @   Fancele  阅读(999)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示