【ThinkingInC++】35、重载的例子

头文件

/**
* 书本:【ThinkingInC++】
* 功能:重载的例子
* 时间:2014年8月28日16:03:37
* 作者:cutter_point
*/
#ifndef STASH3_H_INCLUDED
#define STASH3_H_INCLUDED

class Stash
{
    int size;   //表示要保存的数据占用的字节个数
    int quantity;   //总的内存块数目
    int next;       //已经存放的对象个数,用来指示下一个空的地方在哪里
    //动态申请数组大小是字节
    unsigned char* storage;
    void inflate(int increase); //这个只被add函数调用,属于内部实现的部分,用来增加内存
public:
    Stash(int size);    //0的起始内存块数目
    Stash(int size, int initQuantity);  //函数重载
    ~Stash();
    int add(void* element);
    void* fetch(int index);
    int count();
};

#endif // STASH3_H_INCLUDED

定义文件

/**
* 书本:【ThinkingInC++】
* 功能:重载的例子,头文件的定义
* 时间:2014年8月28日16:03:42
* 作者:cutter_point
*/

#include"Stash3.h"
#include"../require.h"
#include<iostream>
#include<cassert>

using namespace std;

const int increment=100;    //每次增加的内存基本数目
/*
int size;   //表示一个对象占用的字节个数
int quantity;   //总的内存块数目
int next;       //已经存放的对象个数,用来指示下一个空的地方在哪里
//动态申请数组大小是字节
void inflate(int increase); //这个只被add函数调用,属于内部实现的部分,用来增加内存
公有部分:
Stash(int sz);    //0的起始内存块数目
Stash(int sz, int initQuantity);  //函数重载
~Stash();
int add(void* element);
void* fetch(int index);
int count();
*/

//void inflate(int increase);
//这个只被add函数调用,属于内部实现的部分,用来增加内存
void Stash::inflate(int increase)//increase内存大小,增加内存的分配大小
{
    assert(increase >= 0);
    if(increase == 0)
        return;

    int newQuantity=quantity+increase;  //这个是新的大小,旧的加要增加的
    int newBytes=newQuantity*size;  //字节数(内存块数*每块的大小)
    int oldBytes=quantity*size;
    unsigned char* b=new unsigned char[newBytes];   //newBytes字节数对应的空间
    //吧旧的空间数据放到新的上去
    for(int i=0 ; i < oldBytes ; ++i)
            b[i]=storage[i];
    //回收旧的空间
    delete [] storage;
    //吧storage指向新的空间位置,!!!!2014年8月12日23:18:33这里错了检查半天
    storage=b;
    //得到新的总的内存块数目
    quantity=newQuantity;
}

//Stash(int size);    //0的起始内存块数目
Stash::Stash(int sz)
{
    size=sz;
    quantity=0;
    next=0;
    storage=0;
}

//Stash(int sz, int initQuantity);  //函数重载
Stash::Stash(int sz, int initQuantity)
{
    size=sz;
    quantity=0; //这里还是0,因为还没有给他分配空间
    next=0;
    storage=0;
    //通过调用函数来分配空间
    inflate(initQuantity);
}

//~Stash();
Stash::~Stash()
{
    if(storage != 0)
    {
        cout<<"freeing storage"<<endl;
        delete []storage;
    }
}

//int add(void* element);
int Stash::add(void* element)
{

    if(next >= quantity) //起始空余的地方比总内存还要大
        inflate(increment); //增加内存

    int startBytes=next*size;   //全部已经占用的内存
    unsigned char* e=(unsigned char*)element;
    for(int i=0 ; i < size ; ++i)
    {
        storage[startBytes+i]=e[i]; //加到已经有的后面
    }

    next++; //表示第一个空内存的位置

    return (next-1);    //返回对象的个数
}

//void* fetch(int index);
void* Stash::fetch(int index)
{
    require(0 <= index, "Stash::fetch (-)index");
    if(index >= next)
        return 0;   //没有对应的值

    return &(storage[index*size]);  //返回第index个的对象
}

//int count();
int Stash::count()
{
    return next;    //内存数据的总数
}

测试文件

/**
* 书本:【ThinkingInC++】
* 功能:测试重载
* 时间:2014年8月28日16:03:48
* 作者:cutter_point
*/

#include"Stash3.cpp"
#include<fstream>
#include<string>

int main()
{
    Stash intStash(sizeof(int));
        //cout<<"!!"<<endl;
    for(int i=0 ; i < 100 ; ++i)
        intStash.add(&i);   //吧数据带入对象

    //void* Stash::fetch(int index)
    for(int j=0 ; j < intStash.count() ; ++j)
        cout<<"intStash.fetch("<<j<<")="
            <<*(int*)intStash.fetch(j)<<endl;

    const int bufsize=80;
    Stash stringStash(sizeof(char)*bufsize, 100);   //重载函数
    ifstream in("Stash3Test.cpp");
    assure(in, "Stash3Test.cpp");

    string line;
    while(getline(in, line))
        stringStash.add((char*)line.c_str());   //吧string类型转换成char*

    int k=0;
    char* cp;
    //void* Stash::fetch(int index)
    while((cp=(char*)stringStash.fetch(k++)) != 0)
        cout<<"stringStash.fetch("<<k<<")="
            <<cp<<endl;

    return 0;
}
时间: 2024-08-29 12:16:22

【ThinkingInC++】35、重载的例子的相关文章

C++运算符重载(成员函数方式)

一.运算符重载 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样的结果呢?编译器无法给出正常的结果,因为我们需要运算符重载,给运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为,增强了运算符的普适性. 运算符重载的实质是函数重载.在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型

c++中有些重载运算符为什么要返回引用

事实上,我们的重载运算符返回void.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进行连续赋值 防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率. 对于第二点原因:如果用”值传递“的方式,虽然功能任然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率

[019]转--C++ operator关键字(重载操作符)

原博客:http://www.cnblogs.com/speedmancs/archive/2011/06/09/2076873.html operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解: 一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的). 一.为什么使用操作符重载? 对于系统的所有操作符,一般

重载和重写的区别(详细)

ava中重载与重写的区别 首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,

java重载与覆写

很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参数不同的方法组.本质是对不同方法的称呼. override(覆写):存在继承关系的两个类之间,在子类中重新定义了父类中存在的方法.本质是针对同一个方法,给出不同的实现. 我们先来看重载的例子: public class OverloadParent{ public String getPerson(

重载与重写的区别

首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不

java中的方法——重载

重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同.无法以返回

java中重载与重写的区别

首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不

重载和重写的区别

java中重载与重写的区别 首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样