C++实现用户自定义类
2017-04-03 01:41
239 查看
本例以自定义类 MyString 为例子,可以说,这是说接触C++以来第一次觉得这语言好玩有趣的地方,感觉非常有微妙性!!!
题目:
25 统计字符串个数
作者: Turbo时间限制: 1S章节: OO:类
问题描述 :
实验目的:静态成员、构造函数、析构函数、等于号的使用。
实验内容:
实现一个自己的字符串类MyString,要求包含以下函数:
构造函数:
MyString(unsigned n,char c):将字符c重复n次得到字符串
MyString(char *p):根据传入的字符数组得到字符串
根据需要,还需要设计默认构造函数、拷贝构造函数等其它函数。
其中,MyString类需要提供一个静态方法GetCount,功能为获取到本程序在运行的过程中某时刻有多少个MyString的对象。
本次实验提供了部分代码,请使用以下代码调用MyString类的功能完成输入、处理、输出操作:
void fun1(int n)
{
MyString strArr
;
MyString *pStr;
cout<<strArr[0].GetCount()<<endl;
}
void fun2(int n)
{
MyString *pStr=new MyString
;
cout<<MyString::GetCount()<<endl;
}
void fun3(MyString &s1, MyString s2)
{
MyString s3;
s3=s1=s2;
cout<<MyString::GetCount()<<endl;
s3.ShowStr();
cout<<endl;
}
int main( )
{
MyString s1;
MyString s2;
int n;
char charArr[20];
int op;
while (cin >> op)
{
switch (op)
{
case 1:
{
cin>>n;
fun1(n);
break;
}
case 2:
{
cin>>n;
fun2(n);
break;
}
case 3:
{
int m;
char ch;
cin>>m>>ch;
s2=MyString(m,ch);
fun3(s1,s2);
s1.ShowStr();
cout<<endl;
break;
}
case 4:
{
cin >> charArr;
s1=MyString(charArr);
cout<<MyString::GetCount()<<endl;
s1.ShowStr();
cout<<endl;
break;
}
}
}
return 0;
}
输入说明 :
可输入多组测试数据,每组测试数据包含两行:
第一行输入一个操作的种类,
第二行输入所需要的参数:
对于第1个操作和第2个操作,第二行输入一个整数。
对于第3个操作,第二行输入一个整数及一个字符。
对于第4个操作,第二行输入一个字符串。
输出说明 :
具体输出见函数中的输出语句及输出范例。
输入样例
1
3
2
3
1
3
3
10 *
4
abcd
对应输出样例
5
5
8
7
**********
**********
5
abcd
本大侠另外有话要说,既然是用户自定义的类,就少用或者不要用到库函数,有人解答本题进入借助了 库函数里的<String>类,,,呵呵,这么改头换面自己到头来啥都没学到,AC了又有个JB用。。。 我也是查了很多资料,看了些算法书、网站上也找了相应知识点,写成的代码贴上:
自己顺带练习的
运算符重载 ,待更。
题目:
25 统计字符串个数
作者: Turbo时间限制: 1S章节: OO:类
问题描述 :
实验目的:静态成员、构造函数、析构函数、等于号的使用。
实验内容:
实现一个自己的字符串类MyString,要求包含以下函数:
构造函数:
MyString(unsigned n,char c):将字符c重复n次得到字符串
MyString(char *p):根据传入的字符数组得到字符串
根据需要,还需要设计默认构造函数、拷贝构造函数等其它函数。
其中,MyString类需要提供一个静态方法GetCount,功能为获取到本程序在运行的过程中某时刻有多少个MyString的对象。
本次实验提供了部分代码,请使用以下代码调用MyString类的功能完成输入、处理、输出操作:
void fun1(int n)
{
MyString strArr
;
MyString *pStr;
cout<<strArr[0].GetCount()<<endl;
}
void fun2(int n)
{
MyString *pStr=new MyString
;
cout<<MyString::GetCount()<<endl;
}
void fun3(MyString &s1, MyString s2)
{
MyString s3;
s3=s1=s2;
cout<<MyString::GetCount()<<endl;
s3.ShowStr();
cout<<endl;
}
int main( )
{
MyString s1;
MyString s2;
int n;
char charArr[20];
int op;
while (cin >> op)
{
switch (op)
{
case 1:
{
cin>>n;
fun1(n);
break;
}
case 2:
{
cin>>n;
fun2(n);
break;
}
case 3:
{
int m;
char ch;
cin>>m>>ch;
s2=MyString(m,ch);
fun3(s1,s2);
s1.ShowStr();
cout<<endl;
break;
}
case 4:
{
cin >> charArr;
s1=MyString(charArr);
cout<<MyString::GetCount()<<endl;
s1.ShowStr();
cout<<endl;
break;
}
}
}
return 0;
}
输入说明 :
可输入多组测试数据,每组测试数据包含两行:
第一行输入一个操作的种类,
第二行输入所需要的参数:
对于第1个操作和第2个操作,第二行输入一个整数。
对于第3个操作,第二行输入一个整数及一个字符。
对于第4个操作,第二行输入一个字符串。
输出说明 :
具体输出见函数中的输出语句及输出范例。
输入样例
1
3
2
3
1
3
3
10 *
4
abcd
对应输出样例
5
5
8
7
**********
**********
5
abcd
本大侠另外有话要说,既然是用户自定义的类,就少用或者不要用到库函数,有人解答本题进入借助了 库函数里的<String>类,,,呵呵,这么改头换面自己到头来啥都没学到,AC了又有个JB用。。。 我也是查了很多资料,看了些算法书、网站上也找了相应知识点,写成的代码贴上:
// 2017.04.02 T25. 好题目,训练!! //自定义类和内存自动分配...尽可能的不要借助任何库函数! //School ~ DongHua University //Turbo Test System , Test 25 -- Record ~ // Codes created by the rebuilt boy ManTruer //Student ID : 151340112 //Class : Xin'an 1501 //Date : 2017.04.03 #include <iostream> #include <cstring> using namespace std; class MyString{//使用内存分配new出自定义的类MyString... private: char *p_str; //pointer to string ... int len; //string.size() static int CountObj; //number of objects public: static int GetCountObj(); void ShowStr(){ cout<<p_str; } MyString(); MyString(int ,char ); MyString(const char * ); MyString( const MyString &); ~MyString(); MyString & operator=(const MyString &);//重载赋值运算符,字符串赋值 MyString & operator=(const char*); //单个字符赋值 char &operator[]( int ); //定义元素索引标识 const char & operator[]( int ) const ; friend bool operator==(const MyString &, const MyString &);//重载判等运算符 friend bool operator<(const MyString &, const MyString &); //小于号 friend bool operator>(const MyString &st1, const MyString &); //大于号 friend ostream & operator<<(ostream &,const MyString &);//重载输出运算符 friend MyString & operator+(MyString &, MyString &) ;//加法,相连接 }; int MyString::CountObj = 0; int MyString::GetCountObj(){ return CountObj ; } MyString::MyString(){ ++CountObj; //object +1 // cout<<"加11!"<<endl; //用于追踪程序。。。 len = 0 ; p_str = new char[ 1 ] ;//为了与 delete对应必须也在此 new... p_str[ 0 ] = '\0' ; } MyString::MyString(int n,char c){ ++CountObj; //object +1 // cout<<"加22!"<<endl; //程序线程跟踪 len = n ; p_str = new char[ len+1]; for( int i=0; i<len; ++i ) p_str[ i ] = c ; p_str[ len ] = '\0' ; //此处不能再用 i 作为索引,因为 i 生命周期已过... } MyString::MyString(const char *str ){ ++CountObj; //object +1 // cout<<"加33!"<<endl; //程序线程跟踪 len = strlen( str ); p_str = new char[ len+1 ]; strcpy( p_str, str ); } MyString::MyString(const MyString&other){ ++CountObj; // cout<<"加44!"<<endl; //程序线程跟踪 len = other.len; p_str = new char[ len+1 ]; strcpy( p_str, other.p_str ) ; } MyString::~MyString(){ --CountObj; delete[] p_str; // cout<<"减咯~!"<<endl; //程序线程跟踪 } MyString & MyString::operator=(const MyString &myStr){ if( this->p_str == myStr.p_str ) return *this ; if( p_str ) delete [] p_str;//必须先清空,先释放当前对象的堆内存 len = myStr.len; p_str = new char[ len + 1 ] ; strcpy( p_str , myStr.p_str ) ; return *this; } MyString & MyString::operator=(const char* s ){ delete [] p_str; len = strlen( s ); p_str = new char[ len+ 1 ] ; strcpy( p_str, s ); return *this ; } char & MyString::operator[](int i ){ return p_str[ i ] ; } const char & MyString::operator[](int i ) const { return p_str[ i ] ; } bool operator==(const MyString &str, const MyString &s ) { return 0 == strcmp( str.p_str, s.p_str) ; } bool operator<(const MyString &str, const MyString &s){ return strcmp( str.p_str, s.p_str )<0 ; } bool operator>(const MyString &str, const MyString &s){ return strcmp( str.p_str, s.p_str )>0 ; } ostream & operator <<(ostream &os, const MyString &myStr){ os<<myStr.p_str; return os ; } MyString & operator+( MyString & left, MyString & right ){ MyString *pStr = new MyString(" ") ; pStr->p_str = new char[ strlen(left.p_str) + strlen(right.p_str) ] ; strcpy( pStr->p_str, left.p_str ) ; strcpy( pStr->p_str, right.p_str ); return *pStr ; } void fun1(int n){ MyString strArr ; MyString *pStr; cout<<strArr[0].GetCountObj()<<endl; } void fun2(int n){ MyString *pStr=new MyString ; cout<<MyString::GetCountObj()<<endl; } void fun3(MyS 4000 tring &s1, MyString s2){ MyString s3; s3=s1=s2; cout<<MyString::GetCountObj()<<endl; s3.ShowStr(); cout<<endl; } int main( ){ MyString s1; MyString s2; int n; char charArr[20]; int op; while (cin >> op && op){ switch (op){ case 1:{ cin>>n; fun1(n); break; } case 2:{ cin>>n; fun2(n); break; } case 3:{ int m; char ch; cin>>m>>ch; s2=MyString(m,ch); fun3(s1,s2); s1.ShowStr(); cout<<endl; break; } case 4:{ cin >> charArr; s1=MyString(charArr); cout<<MyString::GetCountObj()<<endl; s1.ShowStr(); cout<<endl; break; } } } return 0; }
自己顺带练习的
运算符重载 ,待更。
相关文章推荐
- Win2000中用户自定义IP头的实现及OicqSend完整实例源程序
- Win2000中用户自定义IP头的实现及OicqSend完整实例源程序
- 使用委托在用户自定义控件中实现事件响应
- C++ GUI Programming with Qt 4 - 10.3 实现自定义模型
- arcengine cliasic code(转)基于ArcGIS Engine + C#实现用户自定义动态电力符号
- 使用委托在用户自定义控件中实现事件响应
- 使用委托在用户自定义控件中实现事件响应
- 基于ArcGIS Engine + C#实现用户自定义动态电力符号(转载 华立电网北京研发中心 阿文 )
- Win2000中用户自定义IP头的实现及OicqSend完整实例源程序
- C++ GUI Programming with Qt 4 - 10.3 实现自定义模型
- 利用IFRAME 让每个页面都继承菜单控 不是用户自定义控件来实现的
- ActiveReports工作总结12——用Designer控件实现用户自定义报表印刷
- VS2005下自定义用户控件 如何实现属性及方法的相关智能提示
- ActiveReports工作总结12——用Designer控件实现用户自定义报表印刷
- Win2000中用户自定义IP头的实现及OicqSend完整实例源程序
- 在C++中用虚函数及模版实现委托(支持自定义参数)
- VS2005下自定义用户控件 如何实现属性及方法的相关智能提示
- VS2005下自定义用户控件 如何实现属性及方法的相关智能提示
- 实现Sbo系统与用户菜单自定义
- C++ GUI Programming with Qt 4 - 10.4 实现自定义代理(delegate)