zoukankan      html  css  js  c++  java
  • C++_类和动态内存分配2-改进后的String类

    添加前面介绍过的复制构造函数和赋值运算符,使类能够正确管理类对象使用的内存。

    知道对象何时被创建和释放。

    ===================================

    修订后的默认构造函数

    String::String()

    {

           len = 0;

           str = new char[1];  //这是为了和类析构函数兼容;

           str[0]=’’;

    }

     

    delete[ ]与使用new[ ]初始化的指针和空指针都兼容。

    以其他方式初始化的指针,使用delete[]时,结果将是不确定的。

     

    C++11空指针:

    nullptr 关键字表示空指针;

    还可以使用就标准C++98中的方式:0

    ====================================

    比较成员函数

    friend bool operator == (const String &st1, const String &st2);

    将比较函数作为友元,有助于将String类对象与常规的C字符串进行比较。

    if (“love” == answer)

    将被转换为

    if (operator==(“love”,answer));

    然后编译器将使用某个构造函数将代码转换为:

    if (operator==(String(“love”), answer));

    ====================================

    使用中括号表示法访问字符

    String opera(“The Magic Flute”);

    对于表达式opera[4],C++将查找名称与特征标与此相同的方法;

    String::operator[](int i)

    如果找到匹配的原型,编译器将使用下面的函数调用来替代表达式opera[4]:

    opera.operator[ ](4)

    opera对象调用该方法,数组下标4成为该函数的参数。

     

    有了上述定义:

    cout <<opera[4];

    被转换为:

    cout <<opera.operator[4];

    返回值将是opera.str[4]。由此公有方法可以访问私有数据。

    将返回类型声明为char &,便可以给特定元素赋值。

    String means(“might”);

    means[0] = ‘r’;

    第二条语句被转换为一个重载运算符函数调用:

    means.operator[](0)=’r’;

    这里将r赋给方法的返回值,上述代码等同于:

    means.str[0] = ‘r’;

     

    但在重载时,C++将区分常量和非常量函数的特征标,因此可以提供另一个仅供const String对象使用的operator[]()版本。

    =======================================

    静态类成员函数

    可以将成员函数声明为静态的,函数声明必须包含关键字static。

    但如果函数定义是独立的,则其中不能包含关键字static,这样做有两个重要的后果。

     

    首先,不能通过对象调用静态成员函数 ,实际上,静态成员函数甚至不能使用this指针。

    如果静态成员函数时再公有部分声明的,则可以使用类名和作用域运算符来调用它。

     

    例如:可以给String类添加一个名为HowMany()的静态成员函数,方法是在类声明中添加如下原型定义:

    static int HowMany() {return num_strings;}

     

    由于静态成员函数不与特定的对象相关联,只能使用静态数据成员。

     

    可以使用静态成员函数设置类级标记,以控制某些类接口的行为,例如:类级标记可以控制显示类内容的方法所使用的格式。

    ======================================

    进一步重载赋值运算符

  • 相关阅读:
    安装和配置SQL
    自定义中间件封装为模块
    留言板
    Spring Factories机制
    JVM参数配置
    全链路监控的方案概述与比较
    Lombok注解-@SneakyThrows
    @FeignClient注解 中属性 contextId使用
    @validate或@valid注解进行数据校验的解决方案
    maven的settings.xml标签详解
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10493515.html
Copyright © 2011-2022 走看看