#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; //等号运算符的重载 class Array { public: //int strlen(char *) Array(char *t1) { this->length=strlen(t1); this->p = new char [length +1]; strcpy(p,t1); } Array(const Array &t2) { this->length=t2.length; this->p = new char [length +1]; strcpy(p,t2.p); } Array& operator=(Array &obj1) { //先释放旧的内存 if (this->p != NULL) { delete[] p; length = 0; } //2 根据obj1分配内存大小 this->length = obj1.length; this->p = new char [length+1]; //把obj1赋值 strcpy(p, obj1.p); return *this; } ~Array() { if(*p !=NULL) { delete [] p; length=0; } } void printf() { cout<<this->p; } private: int length; char *p; protected: }; int main() { Array a1("dasfsf"); Array a2=a1;//调用赋值构造函数,必须重新定义,要不然是浅拷贝,出错 a2.printf(); cout<<endl; Array a4("dasda"); a4=a1;//浅拷贝,需重新定义等号。 a4.printf(); cout<<endl; system("pause"); return 0; }
上图这样子是对的,但是为什么给形参默认值的时候,就会出错?
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; //等号运算符的重载 class Array { public: //int strlen(char *) Array(char *t1=0) { this->length=strlen(t1); this->p = new char [length +1]; strcpy(p,t1); } Array(const Array &t2) { this->length=t2.length; this->p = new char [length +1]; strcpy(p,t2.p); } Array& operator=(Array &obj1) { //先释放旧的内存 if (this->p != NULL) { delete[] p; length = 0; } //2 根据obj1分配内存大小 this->length = obj1.length; this->p = new char [length+1]; //把obj1赋值 strcpy(p, obj1.p); return *this; } ~Array() { if(*p !=NULL) { delete [] p; length=0; } } void printf() { cout<<this->p; } private: int length; char *p; protected: }; int main() { Array a1("dasfsf"); Array a2=a1;//调用赋值构造函数,必须重新定义,要不然是浅拷贝,出错 a2.printf(); cout<<endl; Array a4("dasda"); Array a3; a3=a4;//浅拷贝,需重新定义等号。 a3.printf(); cout<<endl; system("pause"); return 0; }
运行没有错误,但是编译不出来
我的天啊,在大大神的帮忙下,终于解决了,原因是Strlen不能应用于NULL指针。
遇见问题要一步一步分析精确到一行,我的天啊,感觉自己还有差距