//
// A.h
// Memory
//
// Created by xiangchenyu on 13-3-10.
// Copyright (c) 2013年 xiangchenyu. All rights reserved.
//
#ifndef Memory_A_h
#define Memory_A_h
class A
{
public:
A(int size):size(0),pStr(0)
{
this->size = size;
this->pStr = new int(size);
}
~A()
{
if(this->pStr)
delete []pStr;
}
void setValue(int index,const int& value)
{
if(index<this->size)
pStr[index] = value;
}
int getValue(int index) const
{
if(index<this->size)
return pStr[index];
else
return int();
}
public:
//拷贝构造函数
A(const A& a):size(a.size),pStr(0)
{
if(pStr)
{
delete []pStr;
pStr = NULL;
}
if (size)
{
pStr = new int[size];
for (int i = 0; i <size; ++i)
{
setValue(i,a.getValue(i));
}
}
}
//赋值函数
const A& operator=(const A& a)
{
if(this == &a)
return *this;
this->size = a.size;
if(pStr)
{
delete []pStr;
pStr = NULL;
}
if (size)
{
pStr = new int[size];
for (int i = 0; i <size; ++i)
{
setValue(i,a.getValue(i));
}
}
return *this;
};
private:
int size;
int* pStr;
};
#endif
调用的时候:
A a(10);
a.setValue(0, 555);
A a1 = a;
NSLog(@"a1-->%d",a1.getValue(0));
输出结果:555
C++的指针成员如果没有NEW,后果不看设想,如下所示
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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次,为何?
Tablet1; 调用1次默认构造函数
Tablet2=t1;默认的对象的赋值操作,按成员赋值,其中关于指针p,仅仅是将t1.p赋值给t2.p,即t2.p = t1.p,并无内存分配。对象t1和t2的p指针均指向同一块内存。
Tablet3; 调用1次默认构造函数
t3=t2;原t3.p指针被t2.p覆盖,此时t3.p同样指向对象t1和t2的p指针的同一块内存。注意:t3原分配给p的内存由于没有指针指向,无法利用,造成存储浪费。
h()结束,对象t1,t2,t3的析构函数调用,此时对t1,t2,t3的指针p所指的同一块存储进行了三次删除,非常危险,导致的结果是无发预料的,很可能灾难性的。
因此明确定义类的复制构造函数(拷贝构造函数)和赋值预算可避免这样的错误。
分享到:
相关推荐
已经调试可用的代码,欢迎大家下载使用。 已经调试可用的代码,欢迎大家下载使用。
在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在<<c>> 中写到,如果一个类需要我们自己...
主体:(一)<C++与C语言的区别> 一、C++概述 (一) 发展历史 1980年,Bjarne Stroustrup博士开始着手创建一种模拟语言,能够具有面向对象的程序设计特色。在当时,面向对象编程还是一个比较新的理念,Stroustrup...
鸡啄米:C++编程入门系列之三十一(数组、指针和字符串:对象指 针) 鸡啄米:C++编程入门系列之三十二(数组、指针和字符串:动态内存 分配和释放) 鸡啄米:C++编程入门系列之三十三(数组、指针和字符串:用...
C++智能指针:auto_ptr详解 指针,相信⼤家并不陌⽣。⽆论是我们在进⾏查看内存还是在修改字符串,我们都会⽤到指针。 最常见的情况则是我们使⽤malloc或者new申请到了⼀块内存,然后⽤⼀个指针来保存起来。我们都...
3. 出错处理 Exception handling 4. 类型转换高级 Advacned Class Type-casting 5. 预处理指令 Preprocessor Directives 7. C++ 标准函数库 C++ Standard Library 1. 文件的输入输出 Input/Output with ...
如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 除了这两点,class和struct基本...
《现代C++程序设计(原书第2版)》图文并茂,通俗易懂,真正做到寓教于乐,是一本难得的C++面向对象设计入门教材。 出版者的话 译者序 前言 第1章 C++概述与软件开发 1.1 什么是C语言和C++ 1.1.1 C和C++历史回顾 1.1.2...
第一部分 C++语言 1,C++程序设计概述 2,编写简单的C++程序 3,函数 4,程序流程控制 5,C++数据类型结构 6,结构和联合 7,C++数据进阶 8,指针、地址和动态存储器 9,引用变量 10,递归 11,预处理器 12,函数...
第一部分 C++语言 1,C++程序设计概述 2,编写简单的C++程序 3,函数 4,程序流程控制 5,C++数据类型结构 6,结构和联合 7,C++数据进阶 8,指针、地址和动态存储器 9,引用变量 10,递归 11,预处理器 12,函数...
本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助...
第一部分 C++语言 1,C++程序设计概述 2,编写简单的C++程序 3,函数 4,程序流程控制 5,C++数据类型结构 6,结构和联合 7,C++数据进阶 8,指针、地址和动态存储器 9,引用变量 10,递归 11,预处理器 12,函数...
STL是C++标准模板库的缩写,是C++程序员必须掌握的一个重要库。它提供了许多容器、算法和函数对象等实用工具,可以让我们更加高效地编写程序。 3. 掌握类与对象的理论知识。C++是一种面向对象的编程语言,因此要学好...
21.11 类成员指针(.和—>) 21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web...
很辛苦的找到的,比较全 表示已有答案 表示没有处理 表示答案不确定 C++笔试题 1.多态类中的虚函数表是...而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.
第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 ...10.4 指向成员的指针
C++编程思想,目 录 译者序 前言 第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3...10.4 指向成员的指针
Effective C++中文版(第3版改善程序与设计的55个具体做法)》一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理...