第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分.注意:静态成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或枚举型const,则可以在类声明中初始化. 2.当使用一个对象来初始化另一个新建对象时,编译器将自动生成一个复制构造函数,因为它创建对象的一个副本.复制构造函数的…
第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化. P426-P427类静态成员的声明和初始化 //strnbad.h class StringBad { private: static int num_strings; - }; //strnbad.cpp int StringBad::num_strings = 0; 不能在类声明中初始化静态…
如果在构造函数中使用new来初始化对象的指针成员时必须特别小心. 1 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete. 2 new和delete必须相互兼容.new对应于delete,new[ ]对应于delete[ ]. 2      如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带.因为只有一个析构函数,所有的构造函数都必须与它兼容.可以再一个构造函数中使用new初始化指针,也可以在另一个构造函数中使指针为空. 3      应定义一…
一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.对于静态成员,可以在类声明之外使用单独的语句来进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分.请注意,初始化语句指出了类型,并使用了作用域运算符,但没有使用关键字static. 2)静态类成员初始化是在方法文件中,而…
静态成员函数 声明时包含关键字static.注意以下两点: 1.使用静态成员函数时不能通过对象或者this指针来调用,只能使用类名+作用域解析符来调用. 2.静态成员函数只能使用静态成员. new操作符 在使用 #include <new> 之后,new操作符可以在分配内存时指定内存位置.例如: //创建一个512字节的内存缓冲区 ]; ClassName *ptr1, *ptr2; //在buffer缓冲区中创建一个类对象 ptr1 = new (buffer) ClassName; //在…
创建类时编译器自动生成以下成员函数(如果用户没有定义): 1.默认构造函数 2.拷贝构造函数 3.赋值操作符 4.默认析构函数 5.地址操作符 以下一一说明: 构造函数 构造函数在创建对象时被调用. 在用户没有提供构造函数时,编译器将创建一个默认构造函数,这个构造函数不接受任何参数,也不执行任何操作,使类的值在初始化的时候是未知的. 用户创建的构造函数在所有参数都有默认值的情况下也是默认构造函数. 只有在构造函数上才能使用初始化列表,可以用初始化列表初始化const常量成员的值. 拷贝构造函数…
本章介绍了定义和使用类的许多重要方面.其中的一些方面是非常微妙甚至很难理解的概念.如果其中的某些概念对于您来说过于复杂,也不用害怕——这些问题对于大多数C++的初学者来说都是很难的.通常,对于诸如复制构造函数等概念,都是在由于忽略它们而遇到了麻烦之后逐步理解的.本章介绍的一些内容乍看起来难以理解,但是随着经验越来越丰富,对其理解也将越透彻.在类构造函数中,可以使用new为数据分配内存,然后将内存地址赋给类成员.这样,类便可以处理长度不同的字符串,而不用在类设计时提前固定数组的长度.在类构造函数中…
12.6.1 重载<<运算符要重新定义<<运算符,以便将它和cout一起用来显示对象的内容,请定义下面的友元运算符函数:ostream & operator<<(ostream & os, const c_name & obj){    os << ...;  // display object contents    return os;}其中,c_name是类名.如果该类提供了能够返回所需内容的公有方法,则可在运算符函数中使用这些…
知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一种后进先出的结构,队列是先进先出的. 问题:Heather银行要在Food Hea超市门口开设一个ATM机.Food Heap需要了解ATM对超市交通可能造成的影响.Heather银行希望对顾客排队等待的时间进行评估,编写一个程序模拟这种情况. 设计:设计一个队列类,队列中的项目是顾客.设计一个表示…
再探new和delete new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的: 析构函数使用delete来释放这些内存. 字符串是一个字符数组,所以析构函数使用的是带中括号的delete. 使用new来为整个对象分配内存: String * favorite = new String(saying[choice]); 这不是为要存储的字符串分配内存,而是为对象分配内存:也就是说,为保存字符串地址的str指针和len成员分配内存. 指针和对象小结 使用常规表示法来声明指向对象…