【ThinkingInC++】38、选择重载还是默认参数

头文件

/**
* 书本:【ThinkingInC++】
* 功能:选择重载还是默认参数,头文件
* 时间:2014年9月6日14:54:28
* 作者:cutter_point
*/
#ifndef  MEM_H_INCLUDED
#define  MEM_H_INCLUDED

typedef unsigned char byte;

class Mem
{
    byte* mem;
    int size;
    void ensureMinSize(int minSize);    //成员函数来增加内存块的大小
public:
    Mem();
    Mem(int sz);    //第二个构造函数确保Mem对象中有sz大小的存储区
    ~Mem();         //析构函数释放空间
    int msize();    //告诉我们当前Mem对象中还有多少字节
    byte* pointer();
    byte* pointer(int minSize); //将一个指针指向一块内存。该内存至少有minSize大
};

#endif // MEM_H_INCLUDED

定义文件

/**
* 书本:【ThinkingInC++】
* 功能:选择重载还是默认参数,声明文件
* 时间:2014年9月6日14:54:58
* 作者:cutter_point
*/

#include"Mem.h"
#include<cstring>

using namespace std;

/*
class Mem
{
    byte* mem;
    int size;
    void ensureMinSize(int minSize);    //成员函数来增加内存块的大小
public:
    Mem();
    Mem(int sz);    //第二个构造函数确保Mem对象中有sz大小的存储区
    ~Mem();         //析构函数释放空间
    int msize();    //告诉我们当前Mem对象中还有多少字节
    byte* pointer();
    byte* pointer(int minSize); //将一个指针指向一块内存。该内存至少有minSize大
};
*/

//    void ensureMinSize(int minSize);    //成员函数来增加内存块的大小
void Mem::ensureMinSize(int minSize)
{
    if(size < minSize)  //判定,只有给的最小大小比原来的大才重新申请空间
    {
        byte* newmem=new byte[minSize];     //申请新的空间
    /*
        今天做题卡在MEMSET函数的使用上了,
        本来以为int a[100]; memset(a, MAX,sizeof(a));
        就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,
        一般用于对字符型变量的初值进行赋值.
    */
        //从newmem+size开始,一共minSize-size个全部重置为0
        memset(newmem+size, 0, minSize-size);
        //memcpy提供了一般内存的复制。
        //即memcpy对于需要复制的内容没有限制,因此用途更广。
        memcpy(newmem, mem, size);  //吧mem里面的内容复制到newmem中,长度是size

        //回收空间内存
        delete []mem;
        mem=newmem; //吧新的地址赋值给对象
        size=minSize;   //吧新的size给对象
    }
}

//Mem();
Mem::Mem()
{
    mem=0;
    size=0;
}

//Mem(int sz);    //第二个构造函数确保Mem对象中有sz大小的存储区
Mem::Mem(int sz)
{
    mem=0;
    size=0;
    ensureMinSize(sz);  //吧初始空间设置为sz个长度
}

//~Mem();         //析构函数释放空间
Mem::~Mem()
{
    delete []mem;
}

//int msize();    //告诉我们当前Mem对象中还有多少字节
int Mem::msize()
{
    return size;
}

//byte* pointer();  //将一个指针指向一块内存。该内存至少有minSize大
byte* Mem::pointer()
{
    return mem;
}

//byte* pointer(int minSize);
byte* Mem::pointer(int minSize)
{
    ensureMinSize(minSize);
    return mem;
}

测试主函数

/**
* 书本:【ThinkingInC++】
* 功能:选择重载还是默认参数,测试文件,创建一个string类
*      作为其他类的一种工具,以简化他们的内存管理(例如,它还可以隐藏由操作系统
*       提供的更复杂的内存管理细节)
* 时间:2014年9月6日14:55:32
* 作者:cutter_point
*/

/*
class Mem
{
    byte* mem;
    int size;
    void ensureMinSize(int minSize);    //成员函数来增加内存块的大小
public:
    Mem();
    Mem(int sz);    //第二个构造函数确保Mem对象中有sz大小的存储区
    ~Mem();         //析构函数释放空间
    int msize();    //告诉我们当前Mem对象中还有多少字节
    byte* pointer();
    byte* pointer(int minSize); //将一个指针指向一块内存。该内存至少有minSize大
};
*/

#include"Mem.cpp"
#include<cstring>
#include<iostream>

using namespace std;

class MyString
{
    Mem* buf;   //简化内存管理
public:
    MyString();
    MyString(char* str);    //重载
    ~MyString();
    //链接两个string
    void concat(char* str);
    void print(ostream& os);
};

//MyString();
MyString::MyString()
{
    buf=0;
}

//MyString(char* str);    //重载
MyString::MyString(char* str)   //用str构造一个string类型
{
    buf=new Mem(strlen(str)+1); //为str创建内存空间
    //用str构造一个string类型
    strcpy((char*)buf->pointer(), str); //拷贝过去
}

//~MyString();
MyString::~MyString()
{
    delete buf; //回收空间内存
}

//链接两个string
//void concat(char* str);
void MyString::concat(char* str)
{
    if(!buf)    //如果buf(指向mem的指针)内存为0的话,创建一个内存空间给他
        buf=new Mem;
    //横向链接字符串,pointer返回一个指针,指向至少有buf->mszie()+strlen(str)+1的内存块
    strcat((char*)buf->pointer(buf->msize()+strlen(str)+1), str);
}

//void print(ostream& os);
void MyString::print(ostream& os)
{
    if(!buf)
        return; //当buf=0的时候,直接结束
    os<<buf->pointer()<<endl;   //不为0,那么就输出内容
}

int main()
{
    MyString s("My test string");
    s.print(cout);
    s.concat(" this is cutter_point");
    s.print(cout);
    MyString s2;
    s2.concat("use default construct by cutter_point");
    s2.print(cout);

    return 0;
}
时间: 2024-10-24 08:00:02

【ThinkingInC++】38、选择重载还是默认参数的相关文章

C/C++(C++重载,默认参数,引用)

C++重载详解 重载就是同名而非同义,具体意义根据上下文的语境而言. 重载规则: 1,函数名相同. 2,参数个数不同,参数的类型不同,参数顺序不同,均可构成重载. 3,返回值类型不同则不可以构成重载. 函数重载(静多态) void print(int a) { //... } void print(int a,char b) { //... } void print(char a,int a) { //... } //根据参数的数序,个数执行上下文. 匹配原则: 1,严格匹配,找到则调用. 2,

函数重载和默认参数

区别一是参数类型不同,二是参数个数不同 仅有函数返回值不同也是区分不了重载函数的 1 #include <iostream> 2 using namespace std; 3 4 void go(int i, double db)//参数的个数,参数的类型不同,顺序不同,与返回值无关 5 { 6 7 } 8 9 void go(double db, int i) 10 { 11 12 } 13 14 void main() 15 { 16 17 system("pause"

面向对象程序设计-C++_课时17函数重载和默认参数

函数重载,区别一是参数类型不同,二是参数个数不同. 默认参数可以多于1个,但必须放在参数序列的后部. 尽量不要用默认参数,会影响阅读 error C2668: “f”: 对重载函数的调用不明确 1 #include <iostream> 2 using namespace std; 3 4 void f(int i, int j = 0)//默认参数 5 { 6 std::cout << i << " " << j << st

c++-内联函数和函数重载和默认参数和函数指针

内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数. 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义.如果已定义的函数多于一行,编译器会忽略 inline 限定符. 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说

重载函数和默认参数的函数

代码说事 重载的参数匹配 1 /// *重载的匹配顺序 1: 严格匹配 2: 转换匹配 2 /// *重申 : 重载的判断依据 !形参的! 个数 类型 位置 3 /// * 返回值类型不作为重载依据 4 /// * 默认参数 不能用于区分重载函数 5 6 #include <bits/stdc++.h> 7 using namespace std; 8 9 /// 转换 的匹配 10 double b; 11 void print(int a); 12 void print(char c);

默认参数与函数重载

一.默认参数在C++中,可以为参数指定默认值.在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数. 默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值.这就是默认参数:(2)在函数调用时,省略部分或全部参数.这时可以用默认参数来代替. 注意:(1)默认参数只可在函数声明中设定一次.只有在无函数声明时,才可以在函数定义中设定.(2)默认参数定义的顺序为自右到左.即如果一个参数设定了缺省值时,其左边的参数都要有缺省值.如:int mal(int a, int b=3, int

&lt;C++&gt; 函数默认参数 函数重载 引用

一.函数默认参数 1.缺省参数:就是在声明函数的某个参数的时候 给他一个默认值 1 #include<iostream> 2 using namespace std; 3 4 void Show(int a = 1,int b = 2,int c = 3) 5 { 6 cout << a << endl; 7 cout << b << endl; 8 cout << c << endl; 9 } 10 11 int mai

【C/C++学院】0813-C与CPP不同以及命名空间简介/函数重载与函数默认参数/泛型auto/Newdelete

C与CPP不同以及命名空间简介 命名空间在软件设计中的作用就是为了实现迭代式开发. 命名空间的别名 #include <iostream> namespace runrunrunrun { int a(10); char *str("gogogo"); namespace run //命名空间的嵌套 { int a(9); } } namespace runrunrunrun //命名空间的拓展 { int y(5); //int a(15);重定义错误 } namespa

C++:构造函数的默认参数知识拓展

和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. 例9.3的问题也可以使用包含默认参数的构造函数来处理. [例9.4]将例9.3程序中的构造函数改用含默认值的参数,长.宽.高的默认值均为10. #include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参