C++ Primer Plus 12章(二)
前面对于复制构造函数和赋值运算符进行了简单介绍,下面在此基础上简单的扩展一下。
1.C++空指针的关键字:nullptr
在原来的C风格之中,是使用NULL来表示空指针,以此来区分0和空指针的区别,使用’\0’来区分空字符和0的区别。
现在的c++则使用nullptr去表示这是一个空指针。
2.静态类成员函数和重载赋值运算符
在类的设计中中,无论是成员还是成员函数,如果想要成为静态的,则必须加关键字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的地址的内容
}
3.在构造函数中使用new
(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的地址的内容
}
上面的两种方式都是为了
能够更好的管理在构造函数中使用了new来初始化对象的指针成员。
4.有关返回对象的说明
成员函数或者独立的函数返回对象时,共有下面三种方式:
(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对象
总结:如果方法或者函数要返回局部对象,则应返回对象,而不是指向对象的引用;如果方法或者函数要返回一个没有公有复制构造函数的类的对象,它必须返回一个指向这种对象的引用;如果函数既可以返回对象,又可以返回引用,此时应选择引用,效率更高。
5.指向对象的指针
可以使用new或者不使用new来创建内存空间管理。
如果使用new的话,要注意释放对象。
初始化的时候,可以初始化为已有的对象,也可以使用new和类构造函数进行初始化。
String * first = &sayings[0];
String * gleep = new String(......);//构造函数可以自选,根据特征进行匹配