一,概念
1)静态存储方式:指在程序运行期间分配固定的存储空间的方式。外部变量和静态变量属于此种存储方式
2)静态成员变量:为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见。无论创建多少对象,程序都只创建一个静态变量副本。
3)静态成员特点:静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员。
4)不能在类声明中初始化静态成员变量,因为声明描述了如何分配内存,但并不分配内存。
5)delete/new
new char[ ]/delete [ ] 成对出现
6)new 创建对象后,再用delete
删除对象可以释放对象本身占用的内存。但并不能自动释放属于对象成员的指针指向的内存。
输出:二,构造函数
1)默认构造函数:显示定义构造函数即无参数构造函数,如果有参数构造函数所有参数都有默认值
2)复制构造函数:当用户没有定义自已的复制构造函数时系统将生成一个默认的复制构造函数。当按值传递对象时,就会创建一个形参的临时对象,然后调用复制构造函数把临时对象的值复制给实参。
功能:将一个对象的非静态成员的值逐个复制给另一个对象,注意复制的是成员的值,这种复制方式也称为浅复制。因为静态成员属于整个类,而不属于某个对象,所以调用复制构造函数时静态成员不会受到影响。
何时使用:按值传递对象,函数返回对象,用一个对象初始化另一个对象即复制初始化时,根据元素初始化列表初始化数组元素。这四种情况都将调用复制构造函数。记住,复制构造函数只能用于初始化,不能用于赋值,赋值时不会调用复制构造函数,而是使用赋值操作符。
3)解析复制构造函数:s1=s2;
s1.str=s2.str;//这里s1复制的不是字符串而是指向字符串的指针
s1.len=s2.len;
当s2的析构函数被调用时,释放str指向的内存delete
[ ]s2.str。则s1出现问题
解决办法:深度复制
StringBad::StringBad(const
StringBad &st)
{
len=st.len;
str=new
char[len +1 ]; //关键使用new 动态申请存放字符串的内存
strcpy(str,st.str)
}
4)理解赋值与复制初始化的区别(重点):赋值是在两个已存在的对象间进行的,也就是用一个已存在的对象去改变另一个已存在对象的值。赋值将调用赋值操作符对对象进行操作,赋值操作符将在操作符重载中讲解。比如有类hyong,有语句hyong
x(1);hyong y(1,2)则x=y;这就是赋值,因为对象x和y是已经存在的对象,而语句hyong x=y;则是复制初始化,是用一个已存在的对象y去创建一个新对象x,所以是复制初始化。
三,改进string
1)strcmp(const char *s1,const char * s2)
当s1<s2时,返回值<0
当s1=s2时,返回值=0 当s1>s2时,返回值>0
2)静态方法:静态方法与静态变量一样,属于类本身,而不属于那个类的一个对象。要想调用一个被定义为static的方法,必须在它前面加上这个类的名称。
使用规则:静态方法只能访问类的静态成员,不能访问类的非静态成员;
非静态方法可以访问类的静态成员,也可以访问类的非静态成员;
静态方法不能使用实例来调用,只能使用类名来调用。
3)布局new操作符:在分配内存时 指定已存在的内存位置。在已知数组中再申请适当大小区域
char *buffer=new
char[512];
p1 = new (buffer)JustTesting;
p2 = new (buffer
+ sizeof(JustTesting))JustTesting("tian",5);
delete [ ] buffer;不调用p1,p2析构函数
delete p1; 释放buffer而不是
p1
p1->~JustTesting();
分享到:
相关推荐
第十二章“类和数据抽象”介绍了面向对象编程的基础,如封装、继承和多态。习题解答将涉及类的设计、对象的创建和使用,以及虚函数和抽象类的应用。 第十三章“复制控制”讲解了构造函数、析构函数、拷贝构造函数和...
5. **动态内存管理**:包括动态分配和释放内存,如使用`new`和`delete`关键字。理解内存管理是防止内存泄漏的关键。 6. **指针与引用**:C++中的指针是变量的地址,引用则是变量的别名。两者都是访问内存的重要工具...
在本资源中,我们主要关注的是"C++ Primer Plus"这本书的第12章编程练习的源码工程。这本书是C++初学者的经典教材,由Stephen Prata撰写,它深入浅出地介绍了C++语言的基础和高级特性。第12章通常会涉及C++中的类、...
8. **动态内存管理**:虽然没有特定的文件名,但第五章通常会讲解动态内存分配(new和delete操作),以及如何避免内存泄漏。 9. **异常处理**:在ex5_25.cpp中,可能会涉及到异常处理,通过try、catch和throw关键字...
第12章 动态内存 399 12.1 动态内存与智能指针 400 12.1.1 shared_ptr类 400 12.1.2 直接管理内存 407 12.1.3 shared_ptr和new结合使用 412 12.1.4 智能指针和异常 415 12.1.5 unique_ptr 417 ...
《C++ Primer 第四版》是C++编程领域的一本经典教材,它的第十章主要涵盖了类的高级特性,包括继承、多态、虚函数、模板等核心概念。这些习题源码是针对这一章节深入理解和实践的重要资源,适用于VC++6.0编译环境,...
6. **内存管理**:C++允许直接控制内存,包括动态分配和释放。掌握堆和栈的区别,以及如何正确使用new和delete,是避免内存泄漏的关键。 7. **输入/输出流**:C++的I/O流库使得读写文件变得简单。习题将教你如何...
8. **动态内存管理**:使用new和delete操作符进行动态内存分配和释放,理解智能指针的使用。 9. **STL(标准模板库)**:学习容器(如vector、list、set)、迭代器、算法和函数对象,这是C++高效编程的重要工具。 ...
本章习题介绍了指针的概念,以及如何使用new和delete关键字进行动态内存分配和释放。通过实践,读者可以理解指针在C++中的作用,以及如何安全地管理动态分配的内存。 ### 第9章:字符串 #### PE9-1至PE9-4 这部分...
6. **动态内存管理**:通过new和delete操作符,程序员可以直接控制内存的分配和释放,理解这部分内容能避免内存泄漏和悬挂指针问题。 7. **STL(标准模板库)**:STL是C++的一个重要组成部分,包括容器(如vector、...
第十二章 类和数据抽象:阐述面向对象编程的基础,包括类的定义、封装、继承和多态。 第十三章 复制控制:讲解构造函数、析构函数、拷贝构造函数和赋值运算符,以及深拷贝和浅拷贝的概念。 这些章节的习题旨在帮助...
5. **STL(标准模板库)**:第十二章至第十三章介绍了C++的标准模板库,包括容器(如vector、list、set、map等)、迭代器、算法(如排序、查找)以及函数对象。源码会展示如何高效地利用STL进行数据处理。 6. **...
3. **指针与引用**:深入学习指针的使用,包括动态内存分配和释放,以及引用作为安全的别名。 4. **函数**:函数的定义、调用、参数传递,以及函数模板的使用。 5. **运算符重载**:如何自定义运算符的行为以适应...
第十二章:异常处理 异常处理是C++中处理程序运行时错误的一种机制。本章介绍了try、catch和throw关键字,以及异常类层次结构。理解异常处理有助于编写健壮的代码,确保程序在遇到问题时能够优雅地失败。 第十三章...
**第十二章 类和数据抽象** 类是面向对象编程的基础,本章讨论类的定义、对象的创建和成员访问控制。习题涉及封装、继承和多态的概念,以及构造函数和析构函数的使用。 **第十三章 复制控制** 复制控制涉及到对象的...
7. **动态内存管理**:通过`new`和`delete`操作符,我们可以动态地分配和释放内存,这是理解C++内存管理的关键。 8. **数组与向量**:C++标准库中的`std::vector`是动态大小的数组,提供了便利的容器功能,而原始数...
第12章 动态内存 399 12.1 动态内存与智能指针 400 12.1.1 shared_ptr类 400 12.1.2 直接管理内存 407 12.1.3 shared_ptr和new结合使用 412 12.1.4 智能指针和异常 415 12.1.5 unique_ptr 417 ...
6. **动态内存管理**:通过`new`和`delete`关键字,程序员可以手动控制内存的分配和释放,理解内存管理有助于避免内存泄漏等问题。 7. **模板**:模板是C++的泛型编程工具,可用于创建函数和类,使得代码更具通用性...
3. **动态内存管理**:使用new和delete操作符动态分配和释放内存,了解内存泄漏问题及其预防。 4. **输入/输出流**:使用iostream库进行标准输入输出,如cin和cout,以及文件输入输出。 5. **指针与引用**:深入...