#include <iostream.h>#include"string.h"class string{private: char *rep;public: string(); string (const char *); void print();};string::string(){ rep=new char[10]; rep=NULL;}string::string (const char *p){ rep=new char[strlen(p)+1]; for(int i=0;i<(strlen(p)+1);i++) *rep++=*p++;}void string::print(){ cout<<rep;}void main(){ char a[10]; cout<<"请输入数据:"<<endl; cin>>a; string str_(a); str_.print();}在有参构造函数中对P指向的a数组进行赋值,给rep指针指向的新开辟的内存空间时有错误,谢谢高手解决,,,不需要C语言中的赋值函数,,谢谢..
你犯了几个错误:1)*rep++=*p++;p指针在变,你的for还用strlen(p)做循环条件。p每增一次,strlen(p)少1,所以循环的次数肯定不对。对策:增加临时变量保存strlen(p)2)*rep++=*p++;你想用rep来存字符串,但是你不停的改变rep的地址值,就算你正确的将p字符串存入rep。当for循环结束时,rep的指针已经指向了字符串的结束处,直接打印rep当然打的是空的。对策:用临时指针来遍历rep3)new内存一定要释放!内存泄露是很严重的事对策:增加一个析构函数来释放内存4)写程序要注意效率。你用strlen(p)来做循环条件,假如p的长度为10000,那么你循环10000次,就调用strlen 10000。你知道strlen怎么实现的吗?也是遍历了整个字符串才计算到的长度。如果p长度10000,你相当于遍历了10000+10000+9999+9998+...+1)个字符。对策:对于耗性能的操作,执行一次然后用变量保存起来。修改后的程序:#include <iostream.h>#include"string.h"class string{private: char *rep;public: string(); string (const char *); ~string(); void print();};string::string(){ //rep=new char[10]; rep=NULL;}string::~string(){ if(NULL != rep) delete [] rep;}string::string (const char *p){ int sLen = strlen(p); rep=new char[sLen+1]; char * ptmp = rep; for(int i=0;i<sLen+1;i++) *ptmp++=*p++;}void string::print(){ cout<<rep<<endl;}void main(){ char a[10]; cout<<"请输入数据:"<<endl; cin>>a; string str_(a); str_.print();}额。。 写完才发现没分。。算是做好事了
string::string (const char *p){ rep=new char[strlen(p)+1]; for(int i=0;i<(strlen(p)+1);i++) *(rep+i)=*(p+i);//这里你对rep指针进行操作了,导致乱码,还有最好添加析构函数释放内存}