总结一下,这一章讲的这件事:会使用new和delete对空间的分配。
day34实现了string类例子,来完成对整个章节的总结。
在类中不能确定字符串长度时,比如姓名,要定义一个指针,然后通过动态内存方式分配内存。在统计类中new的数量时,应该使用一个static静态变量,这样无论创建了多少次对象,程序只创建一个静态类变量。书中举了一个stringbad类的例子,说明了这些问题。
C++类自动提供了如下几种特殊成员函数:
- 默认构造函数
- 默认析构函数
- 复制构造函数(深拷贝)
string str1;
string str2(str1); // 调用复制构造
string str3 = str1; // 调用复制构造
string *str4 = new string(str1) // 调用复制构造 - 赋值运算符=
需要重载等号运算符
str2 = str1 ; 赋值=运算符 - 地址运算符
- C++11 新增的nullptr指针
以前C++语言中使用NULL和(void*)0来表示空指针,NULL是C定义的一个宏。C++11引入了nullptr指针。以后写代码就用nullptr指向空指针了。 - 关于类的静态成员和静态函数的描述:
静态成员不能使用this指针,因为静态成员存放在另一个内存区。静态方法可以访问静态成员(见day33每日编程,静态成员函数中使用静态变量)。
- 如果在new初始化指针成员,则在构造函数中使用delete。
- 使用类型要一样,要使用new [] , 也要使用delete[]。
- 在类中应该定义一个深度复制构造函数。
- 定义一个赋值运算符,深度复制。
返回指向const对象的引用。 下面是一个例子,说明了通过返回const 引用,程序更高效。如果返回引用,将调用了复制构造函数,而返回引用不会。
下面这行代码:
string * st = new string(“aaa”); 指针st指向了无名对象。
12.6 12.7 举了一个模拟对队列的例子
这个代码在每日编程day32,太长了,没理解完这个程序。
- 这里注意类的初始化方式:初始化列表
类的构造函数应该一共类成员的值。但是,如果类中定义的const成员,则不能在构造函数中直接通过赋值进行初始化,原因:调用构造函数时,对象将在括号中的代码执行之前被创建。因此,调用Queue(int qs)构造函数之前就给Queue类中的4个成员变量分配了内存,然后程序流程进入Queue(int qs)括号中,使用常规的赋值方式将值存在对应的内存中。因此对于const成员必须在执行构造函数之前对其进行初始化。C++提供了一种特殊的语法来完成上面const变量的初始化赋值,语法如下:
也可以对所有的变量使用这种方式初始化:
C++·11提供了类內初始化,如下图,这与初始化列表等价。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)