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;}

     

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

     

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

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

    进一步重载赋值运算符

  • 相关阅读:
    一个简单的加载动画,js实现
    banner无缝滚动动画,支持左右按钮和小点
    自动检测ie低版本,并显示升级浏览器的自定义页面,当用f12再把浏览器版本提高的时候,又会自动显示正常的页面。
    banner轮播无缝滚动 jq代码
    css 实现背景图片不跟着滚动条滚动而滚动
    截取字符串指定内容,并用*号代替
    日历获取当前月份的月数与当前月份第一天离第一个格子的位置。
    MUI 自定义从底部弹出的弹出框
    textarea 字体限制,超出部分不显示并及时显示还剩字体个数
    清除ul li里面的浮动并让ul自适应高度的一个好办法
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10493515.html
Copyright © 2011-2022 走看看