String 类的模拟实现

来源:互联网 发布:淘宝开放平台api 授权 编辑:程序博客网 时间:2024/05/21 07:59

String 类的模拟实现

一 .构造函数使用初始化列表的优点

      构造函数的执行分为两个阶段:初始化阶段和计算阶段,初始化阶段先于计算阶段(赋值语句)。

      在使用构造函数给数据成员进行初始化时通常有两种选择。一是在构造函数后加上冒号,并用初始化列表的方式对成员进行初始化。二是在构造函数体中用赋值语句完成对成员的初始化。这两者的细微差别在于,使用初始化列表的方式初始化成员时,成员在声明之后立即被赋予初值,不需要调用其他的赋值语句;而在函数体内对成员的的初始化是在声明变量之后使用赋值语句对变量进行赋值处理,从而达到初始化的目的。这两种初始化方式都能给成员赋值,但是在一些特殊情况下,只能选择初始化列表对成员进行初始化。

一般来说,有以下三种情况必须使用初始化列表的方式进行数据初始化

1. 当类的数据成员中含有引用成员时

2. 当类的数据成员中含有常量成员时

3. 类中含有另一个类的对象,而这个对象的类没有默认构造函数

对于1,2:引用和常量的自身性质决定了在构造函数只能使用初始化列表的方式对其进行初始化。

引用: 在声明引用时,必须同时对它进行初始化,不能声明完成之后再赋值。引用一旦初始化之后,不能再被改变。(建立引用的作用是为变量起另一个名字,其本质是变量的别名。不分配新的内存空间,和原变量使用同一个内存空间,对引用的改变就是对变量的改变。)

常量: 不接受声明之后的赋值,只能初始化,不能赋值。

对于3:

       若Test1类中没有默认构造函数,Test1类的对象是Test2类的成员,那么在Test2中定义无参对象时,系统会显示

       编译错误。这种情况下,需要使用初始化列表对其进行初始化,因为使用初始化列表初始化对象时,系统会跳过

       构造函数,直接进入拷贝构造函数。

使用初始化列表的优点: 减少调用构造函数的次数,能应对缺少默认构造函数的情况,以及适用于一些特定情况。


二 .const 常类型

原因: 程序中各种形式的数据共享在不同程度上破坏了数据的安全性。

目的: 为了既保证数据共享又防止数据在共享过程中被改变,C++引入了常类型。

优点: 使用常类型修饰的变量在程序运行期间的值是不可改变的,保证了数据的安全性。

使用分类:

1. 常引用(说明引用时用const修饰)

    const 类型 & 引用名;

    int a=5;

    const int & b=a;   //声明引用的同时对其初始化,b 是一个常引用,它所引用的对象不可更改。

  * 常引用做函数参数能够避免对实参的修改,保证了数据的安全。

2. const int *p ;   // 被指物是常量,不能改变被指地址内的内容,但能改变指针的指向。

3. int * const p ;  // 指针p为常量指针,不能改变指针的指向,但能改变指针指向地址内的内容。

4. const 和 define 的区别:define 为宏替换,只进行简单的替换操作,不进行相关的语法检查。

                                           const 进行语法检查。

5. 性能优点: 使用 const 只是给出了相应的内存地址,而 define 给出的是具体的数值。只在使用过程中进行一次

                       内存分配。避免了不必要的内存分配,节省了内存空间。


三. 引用作为返回值的优点

1. 对于普通函数来说,函数结束后,系统要生成返回值的副本(拷贝),而对于返回值为引用的函数来说,

    最终返回的是返回值的引用,系统没有生成副本,减少了资源浪费。

2. 引用作为返回值可以将函数调用放在赋值运算符的左边。

3. 引用作为函数返回值时,返回的对象不能是局部变量。因为局部变量在函数结束后就会被释放,此时的引用

    将无任何意义。