类内带有指针,在将一个类的实例化copy给另一个实例化的对象的时候,指针会指向同一块内存,不是我们想要的。这时最好开辟一块堆内存,需要重写赋值=操作运算符。构造函数也要写,因为当实例化一个对象时,可能会对数据成员赋初值,也可能不赋初值,这时,构造涵是可以合写成一个。另外,在参数列表里赋初值时,字面值常量会保存在常量区,指针指向常量区不太安全,最好指向堆区。这时需要开辟堆内存。代码如下:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
class MyString{
public:
MyString(char* cstr = nullptr){
//存在堆区,如果直接在构造函数赋值的话,就会存放在字面值常量区,会有warning
if (cstr){
m_date = new char[strlen(cstr)+1];
strcpy_s(m_date, strlen(cstr) + 1, cstr);
//m_date[strlen(cstr)] = '\0';
}
else{
m_date = new char[1];
*m_date = '\0';
}
}
void operator=(MyString str){
this->m_date = new char[strlen(str.m_date) + 1];
strcpy_s(this->m_date, strlen(str.m_date) + 1, str.m_date);
}
void out(){
cout << m_date << endl;
}
void set(char* str){
//m_date = str;
delete []m_date;
if (str){
m_date = new char[strlen(str) + 1];
strcpy_s(m_date, strlen(str) + 1, str);
//m_date[strlen(cstr)] = '\0';
}
else{
m_date = new char[1];
*m_date = '\0';
}
}
private:
char* m_date;
};
int main(){
MyString str1("hello");
MyString str2;
str2 = str1;
str1.set("world");
cout << "str1 = ";
str1.out();
cout << "str2 = ";
str2.out();
system("pause");
return 0;
}