class Table{
Name * p;
size_t sz;
publish:
Table(size_t s = 15){p = new Name[sz=s];}
~Table(){delete[]p ;}
......
}
void h()
{
Table t1;
Table t2 = t1;
Table t3;
t3 = t2;
}
在h()结束时,默认构造函数调用了2次,而析构函数被调用了3次,为何?
Table t1; 调用1次默认构造函数
Table t2 = t1;默认的对象的赋值操作,按成员赋值,其中关于指针p,仅仅是将t1.p赋值给t2.p,即t2.p = t1.p,并无内存分配。对象t1和t2的p指针均指向同一块内存。
Table t3; 调用1次默认构造函数
t3 = t2; 原t3.p指针被t2.p覆盖,此时t3.p同样指向对象t1和t2的p指针的同一块内存。注意:t3原分配给p的内存由于没有指针指向,无法利用,造成存储浪费。
h()结束,对象t1,t2,t3的析构函数调用,此时对t1,t2,t3的指针p所指的同一块存储进行了三次删除,非常危险,导致的结果是无发预料的,很可能灾难性的。
因此明确定义类的复制构造函数(拷贝构造函数)和赋值预算可避免这样的错误。
Table::Table (const Table &t)
{
p = new Name[sz=t.sz];
for(int i=0;i<sz;i++) p[i]=t.p[i];
}
Table & Table::operator=(const Table &t)
{
if(this!=&t){
delete []p;
p = new Name[sz=t.sz];
for(int i=0;i<sz;i++) p[i]=t.p[i];
}
return *this;
}
详见《C++程序设计语言-特别版》page 219
分享到:
相关推荐
在深入探讨C++对象模型之前,我们先来明确一个概念——什么是C++对象模型?它包括两个层面的理解:第一层面是C++语言本身提供的面向对象编程的支持,这部分可以从诸如《C++ Primer》这样的教材中学习到;第二层面则...
- **组合**:组合是指在一个类中使用另一个类的对象作为成员,从而实现代码的复用。 #### 十二、其他编程经验 - **使用const提高健壮性**:通过将变量声明为const,可以在一定程度上避免错误的修改。 - **提高程序...
### C++课程设计案例——字符串操作 #### 一、引言 在计算机科学领域,字符串是极其重要的数据类型之一,广泛应用于各种编程场景之中。在本篇内容中,我们将通过一个具体的C++课程设计案例来深入理解如何进行字符串...
20. C++中的友元函数允许非成员函数访问类的私有成员,它们是类的外部函数,但是拥有访问类成员的特权。 21. 类的继承特性允许一个类继承另一个类的成员,这是面向对象编程中代码重用的基础。 22. 多态是面向对象...
C++对象模型是理解C++的关键,它涉及到类、对象、继承、多态等核心概念。首先,C++中的对象是由其类定义的,类是一种蓝图,描述了对象的属性(数据成员)和行为(成员函数)。当创建一个类的对象时,实际上是为这个...
第十章“类与对象”是面向对象编程的基础,讲解了类的定义、对象的创建,构造函数和析构函数的作用,复制构造函数,类的作用域,const成员函数,静态成员,以及友元的概念,为后续的面向对象编程打下基础。...
实验三旨在深入理解C++中的类和对象的概念,特别是构造函数、析构函数、数据成员的访问控制、对象的赋值与复制、以及静态成员的相关知识。实验内容包括以下几个部分: 1. **类的定义与实现**: 首先,我们需要定义...
本次实验旨在深化对C++类和对象的理解,特别是类的定义、封装性以及对象的创建与成员使用方法。此外,实验还聚焦于拷贝构造函数的两种类型——浅拷贝和深拷贝的区别及其在实践中的应用。 ### 类的定义 类是C++中...
` 这行代码实际上是在复制 `Apple` 类的对象,而不是复制指针。这可能会引发深拷贝和浅拷贝的问题。 #### 四、解决方案 为了解决上述问题,我们可以采用以下几种方法: 1. **动态分配内存**:可以通过 `new` ...
4. **常量正确性**:为了保证代码安全,常量成员函数应该不能修改对象的状态,而const成员函数的指针也不能改变。 5. **大小调整**:string类应有一个方法来调整容量,以便在需要更多空间时自动增长。 6. **字符串...
《C++面向对象程序设计》实验报告主要涵盖了C++中的核心概念——面向对象编程的关键要素,包括类、对象、构造函数、对象数组、对象指针、对象引用以及成员函数的使用。以下是这些知识点的详细说明: 1. **类与对象*...
虚函数使得基类指针或引用可以调用派生类的成员函数,实现动态绑定。理解如何正确地设计和使用虚函数,以及何时使用纯虚函数来定义抽象基类,对于构建复杂软件架构至关重要。 智能指针,如std::unique_ptr、std::...
其次,C++对象模型涉及类的成员变量和成员函数。成员变量存储对象的状态信息,而成员函数(方法)定义对象的行为。C++支持虚函数,这使得多态性成为可能。虚函数表(VMT,Virtual Method Table)是实现动态绑定的...
本实验主要涵盖了C++中的核心概念——类和对象,以及相关的构造函数、析构函数、对象数组、对象指针、string类、对象引用、静态数据成员、静态成员函数和友元等知识。通过一系列的实践操作,帮助学生深入理解和掌握...
5. **析构函数中对指针成员调用DELETE**:确保在对象析构时正确释放动态分配的资源,遵循“谁创建谁销毁”的原则。 6. **预先准备内存不足的情况**:在进行动态内存分配时,考虑异常安全性和内存不足的处理,避免...
### C++教程:类与对象——自定义类中的运算符 在C++编程语言中,类和对象是面向对象编程的核心概念。通过类可以定义出具有特定属性(数据成员)和行为(成员函数)的对象。此外,C++还提供了一种机制来重载运算符...
在本课程"VC++ 2005系列课程(5):指针与对象模型"中,我们将深入探讨C++编程中的核心概念——指针及其与对象模型的关系。C++是一种面向对象的编程语言,而指针是其强大的工具之一,能够让我们更灵活地操控内存和对象...
4. 功能对象(函数对象):也称为仿函数,它们是具有操作符重载的类,可以作为函数参数传递,实现自定义操作。常见的函数对象包括`less`、`greater`、`equal_to`等比较操作,以及`plus`、`minus`、`multiplies`等...
C++还提供了拷贝构造函数和移动构造函数来处理对象的复制和移动。 6. **友元**:友元函数或友元类可以访问其他类的私有和受保护成员,打破了封装的界限,但需谨慎使用以避免设计上的问题。 7. **模板**:C++的模板...
2. 类是面向对象编程的基础,它定义了一组特性和行为,这些特性和行为共同构成了类的实例——对象。类可以看作是创建对象的蓝图。 3. 对象的两个主要特征是静态特征(数据成员)和动态特征(成员函数)。静态特征...