`
v5browser
  • 浏览: 1139067 次
社区版块
存档分类
最新评论

C++成员是指针的处理(一)

 
阅读更多
//
//  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++带有指针成员的类处理方式详解

    在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在&lt;&lt;c&gt;&gt; 中写到,如果一个类需要我们自己...

    新手学习C++入门资料

    主体:(一)&lt;C++与C语言的区别&gt; 一、C++概述 (一) 发展历史 1980年,Bjarne Stroustrup博士开始着手创建一种模拟语言,能够具有面向对象的程序设计特色。在当时,面向对象编程还是一个比较新的理念,Stroustrup...

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之三十一(数组、指针和字符串:对象指 针) 鸡啄米:C++编程入门系列之三十二(数组、指针和字符串:动态内存 分配和释放) 鸡啄米:C++编程入门系列之三十三(数组、指针和字符串:用...

    C++智能指针:auto-ptr详解.pdf

    C++智能指针:auto_ptr详解 指针,相信⼤家并不陌⽣。⽆论是我们在进⾏查看内存还是在修改字符串,我们都会⽤到指针。 最常见的情况则是我们使⽤malloc或者new申请到了⼀块内存,然后⽤⼀个指针来保存起来。我们都...

    C++基础教程完整版

    3. 出错处理 Exception handling 4. 类型转换高级 Advacned Class Type-casting 5. 预处理指令 Preprocessor Directives 7. C++ 标准函数库 C++ Standard Library 1. 文件的输入输出 Input/Output with ...

    C++面试题基础知识回顾

    如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 除了这两点,class和struct基本...

    现代C++程序设计

    《现代C++程序设计(原书第2版)》图文并茂,通俗易懂,真正做到寓教于乐,是一本难得的C++面向对象设计入门教材。 出版者的话 译者序 前言 第1章 C++概述与软件开发 1.1 什么是C语言和C++ 1.1.1 C和C++历史回顾 1.1.2...

    C++ 大学自学教程 C++ 大学教程 第7版 2

    第一部分 C++语言 1,C++程序设计概述 2,编写简单的C++程序 3,函数 4,程序流程控制 5,C++数据类型结构 6,结构和联合 7,C++数据进阶 8,指针、地址和动态存储器 9,引用变量 10,递归 11,预处理器 12,函数...

    c++大学自学教程 c++大学教程 第七版1

    第一部分 C++语言 1,C++程序设计概述 2,编写简单的C++程序 3,函数 4,程序流程控制 5,C++数据类型结构 6,结构和联合 7,C++数据进阶 8,指针、地址和动态存储器 9,引用变量 10,递归 11,预处理器 12,函数...

    C++ Primer第四版【中文高清扫描版】.pdf

    本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助...

    c++大学自学教程 c++大学教程 第七版 4

    第一部分 C++语言 1,C++程序设计概述 2,编写简单的C++程序 3,函数 4,程序流程控制 5,C++数据类型结构 6,结构和联合 7,C++数据进阶 8,指针、地址和动态存储器 9,引用变量 10,递归 11,预处理器 12,函数...

    学好C++编程语言需要注意的七大细节:用C++开发亲子小游戏代码的步骤分析.docx

    STL是C++标准模板库的缩写,是C++程序员必须掌握的一个重要库。它提供了许多容器、算法和函数对象等实用工具,可以让我们更加高效地编写程序。 3. 掌握类与对象的理论知识。C++是一种面向对象的编程语言,因此要学好...

    C++大学教程,一本适合初学者的入门教材(part1)

    21.11 类成员指针(.和—&gt;) 21.12 多重继承与virtual基类 21.13 结束语 小结 术语 自测练习 自测练习答案 练习 附录A 运算符的优先级与结台律 附录B ASCII字符集 附录C 数值系统 附录D 有关C++的Internet与Web...

    C++笔试题(很全的)

    很辛苦的找到的,比较全 表示已有答案 表示没有处理 表示答案不确定 C++笔试题 1.多态类中的虚函数表是...而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.

    C++编程思想 例子和叙述讲解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 1.2.1 较好的C 3 ...10.4 指向成员的指针

    C++编程思想 编程

    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++ 中文版

    Effective C++中文版(第3版改善程序与设计的55个具体做法)》一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理...

Global site tag (gtag.js) - Google Analytics