# C++ Primer Plus 12章(二)

    技术2022-07-10  157

    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(......);//构造函数可以自选,根据特征进行匹配
    Processed: 0.014, SQL: 9