每一个类中必须要有构造函数,析构函数,复制赋值运算符函数
构造函数和析构函数
构造函数的名字和类名相同,构造函数没有返回类型。
析构函数的名字由"~"+"类名"构成。
类接口定义
class STRING{char* pstr;
public:STRING(const char* s="");~STRING();
};
//构造函数
Person(int _age, int _height) : age(_age), height(_height){};//构造函数
STRING(const char* s = ""){if(s == nullptr) //不特判是否是空指针也可,有些题也可以过{this->pstr = new char[1];this->pstr[1] = '/0';}this->pstr = new char[strlen(s) + 1];strcpy(this->pstr, s);}//析构函数
STRING :: ~STRING()
{delete[] pstr;
}
复制构造函数(拷贝构造函数)
用已经存在的对象初始化新定义的对象要用复制构造函数
如果一个构造函数的第一个参数是自身类类型的引用,且其他参数都有默认值,则此构造函数就是复制构造函数
class STRING{char* pstr;
public:STRING(const char* s=""); //构造函数STRING(const STRING& s); //复制构造函数
};
例:
类接口及定义
class STRING{char* pstr;
public:STRING(const char* s="");//已实现 ~STRING();//已实现 STRING(const STRING& s);friend ostream& operator<<(ostream& os, const STRING& s);//已实现
};
构造函数与复制构造函数
//构造函数
STRING::STRING(const char* s){if(s == NULL){pstr = new char[1];pstr[0] = 0;}else{pstr = new char[strlen(s) + 1];strcpy(pstr, s);}
}//复制构造函数
STRING :: STRING(const STRING& s)
{pstr = new char[strlen(s.pstr) + 1];strcpy(pstr, s.pstr);
}
复制赋值运算符函数
1、自我赋值检测
2、清理旧数据
3、更新对象的大小
4、分配新内存并赋值数据
类接口及定义
class Polynomial{
private:double *coefficients; //动态数组,用来存储多项式各项系数int size; //多项式的大小,项数,最高次项的幂为size-1
public:Polynomial(int size=1); //已实现Polynomial(double* coets, int size);//已实现friend ostream& operator<<(ostream& os, const Polynomial& p); //已实现~Polynomial(); //已实现Polynomial(const Polynomial &poly); //已实现Polynomial& operator=(const Polynomial& p);
};
Polynomial& Polynomial :: operator=(const Polynomial& p)
{if(this == &p) //自我赋值检测return *this;delete[] this->coefficients; //清理旧数据this->size = p.size;//更新对象的大小this->coefficients = new double[this->size]; //分配新内存for(int i = 0; i < this->size; i ++ )this->coefficients[i] = p.coefficients[i]; //复制数据return *this;
}