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

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

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

修订后的默认构造函数

String::String()

{

len = 0;

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

str[0]=’\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;}

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

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

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

进一步重载赋值运算符

C++_类和动态内存分配2-改进后的String类的更多相关文章

  1. C++ primer plus读书笔记——第12章 类和动态内存分配

    第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化 ...

  2. 《C++ Primer Plus》读书笔记之十—类和动态内存分配

    第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的 ...

  3. C++_类和动态内存分配3-构造函数中使用new的注意事项

    如果在构造函数中使用new来初始化对象的指针成员时必须特别小心. 1 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete. 2 new和delete必须相互兼容.new对应于 ...

  4. C++_类和动态内存分配6-复习各种技术及队列模拟

    知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...

  5. C++_类和动态内存分配1—动态内存和类

    静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...

  6. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  7. 《C++ Primer Plus》第12章 类和动态内存分配 学习笔记

    本章介绍了定义和使用类的许多重要方面.其中的一些方面是非常微妙甚至很难理解的概念.如果其中的某些概念对于您来说过于复杂,也不用害怕——这些问题对于大多数C++的初学者来说都是很难的.通常,对于诸如复制 ...

  8. 《C++ Primer Plus》12.6 复习各种(类和动态内存分配的)技术 笔记

    12.6.1 重载<<运算符要重新定义<<运算符,以便将它和cout一起用来显示对象的内容,请定义下面的友元运算符函数:ostream & operator<&l ...

  9. C++_类和动态内存分配5-使用指向对象的指针

    再探new和delete new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的: 析构函数使用delete来释放这些内存. 字符串是一个字符数组,所以析构函数使用的是带中括号的de ...

随机推荐

  1. ubuntu18.04 按住只能删除一个字符bug

    只需要打开重复按键就可以了

  2. 409. Longest Palindrome 最长对称串

    [抄题]: Given a string which consists of lowercase or uppercase letters, find the length of the longes ...

  3. Hibernate和Mybatis区别 详细 有用

    1.开发上手难度 hibernate的真正掌握(封装的功能和特性非常多)要比Mybatis来得难. 在真正产品级应用上要用Hibernate,不仅对开发人员的要求高,hibernate往往还不适合(多 ...

  4. Apache apxs命令

    一.简介 apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载 ...

  5. Part10-C语言环境初始化-一跃进入C大门lesson3

    1.跳转到c代码 因为内存中的代码来自于垫脚石SRAM,他们是相同的. 采用绝对跳转方式来完成. 因为我们是从汇编代码跳转到c语言的程序,所以我们要提前准备一个main.c文件. 修改makefile ...

  6. Office Web APP预览如何去掉顶部版权标志“Microsoft Office Web Apps”

    在Office Web APP的预览会涉及4中类型的文 件:Word.Excel.PowerPoint.PDF,不同的类型在预览时调用的文件是不一样的,其中Word和 PDF调用的是同一个文件.每个预 ...

  7. App测试从入门到精通之性能测试

    好了,上节我们介绍了关于APP测试的功能测试方面一些细节.这一篇我们来介绍一下,关于APP测试过程中的性能测试参考要点,我们需要思考的如下: 响应时间 1.APP安装卸载的响应时间 2.APP各种功能 ...

  8. Http中的身份传递

    IIS默认的身份验证方式 身份传递策略包括使用操作系统的委派功能或在应用程序级传递票证和/或凭证 为了阻止IIS的身份验证委派,可以在web.config加入如下设置, <system.web& ...

  9. (转)通过Javascript得到URL中的参数(query string)

    原文地址:http://www.cnblogs.com/season-huang/p/3322561.html 我们知道,"GET"请求中,通常把参数放在URL后面,比如这样htt ...

  10. MATLAB读取写入文本数据最佳方法 | Best Method for Loading & Saving Text Data Using MATLAB

    MATLAB读取文件有很多方法.然而笔者在过去进行数据处理中,由于函数太多,相互混杂,与C#,Python等语言相比,反而认为读取文本数据比较麻烦.C#和Python等高级语言中,对于大部分的文本数据 ...