前面对于复制构造函数和赋值运算符进行了简单介绍,下面在此基础上简单的扩展一下。
在原来的C风格之中,是使用NULL来表示空指针,以此来区分0和空指针的区别,使用’\0’来区分空字符和0的区别。 现在的c++则使用nullptr去表示这是一个空指针。
在类的设计中中,无论是成员还是成员函数,如果想要成为静态的,则必须加关键字static 进行声明,然后在方法中进行定义时,不能加static。 注意:(1)不能通过对象调用静态成员函数 (2)静态成员函数不能使用this指针
重载赋值运算符如下: 作用:可以将已经存在的对象直接赋值初始化给新的对象,同时,不会造成类成员str指向同一内存的情况。
String &String:: operator=(const char *s) { delete [] str;//先释放原来str指向的内存 len = std::strlen(s);//然后计算当前字符串的长度 str = new char[len+1];//使用new创建一个新的内存地址来指向str std::strcpy(str,s);//将字符串s 拷贝给str return *this;//返回this,即返回指向str的地址的内容 }(1)构造函数使用new,则对应的析构函数必须使用delete,且new和delete要相互对应 (2)应定义一个复制构造函数,通过深度复制将一个对象初始化为另一个对象
String::String(const String &st) { num_strings++; len = st.len; str = new char[len+1]; std::strcpy(str, st.str); }(3)应定义一个赋值运算符,通过深度复制将一个对象初始化为另一个对象
String & String::opertor=(const String & st) { if(this == &st) return *this; delete [] str; len = std::strlen(st);//然后计算当前字符串的长度 str = new char[len+1];//使用new创建一个新的内存地址来指向str std::strcpy(str,st.str);//将字符串s 拷贝给str return *this;//返回this,即返回指向str的地址的内容 }上面的两种方式都是为了
成员函数或者独立的函数返回对象时,共有下面三种方式: (1)返回指向const对象的引用
Vector force(50.60); Vector force(10,70); Vector Max; max = Max(force1,force2); const Vector & Max(const Vector & v1, const Vector & v2) { if(v1.magval()>v2.magval()) return v1; else return v2; }说明:返回对象将调用复制构造函数,而返回引用不会; 引用指向的对象应该在调用函数执行时存在; v1和v2都被声明为const引用,则返回类型也必须为const引用;
(2)返回指向非const对象的引用 重载赋值运算符和重载与cout一起使用的<<运算符
(3)返回对象
Vector Vector::operator+(const Vector & b) const { return Vector(x+b.x, y+b.y); }(4)返回const对象
可以使用new或者不使用new来创建内存空间管理。 如果使用new的话,要注意释放对象。 初始化的时候,可以初始化为已有的对象,也可以使用new和类构造函数进行初始化。
String * first = &sayings[0]; String * gleep = new String(......);//构造函数可以自选,根据特征进行匹配