首页 > 编程语言 >C++学习笔记2——函数重载

C++学习笔记2——函数重载

时间:2024-10-24 18:49:42浏览次数:3  
标签:函数 int 笔记 char print C++ str 重载

1. 函数重载

1.1 默认参数

C++新增的默认参数指的是函数调用省略实参时自动调用的一个值。

通过函数原型设置函数的默认参数,函数定义与没有默认参数时完全相同。如以下函数原型:

char * left(const char * str, int n = 1);

调用时如果省略参数n,则它的值将为1;否则传入的值将覆盖默认值。

对于带参数列表的函数,必须从左到右添加默认值,即要为某个参数设置默认值,必须为它右边的所有参数提供默认值。

int harpo(int n, int m = 4, int j =5); // 正确
int chico(int n, int m = 6, int j); // 错误
int groucho(int k = 1, int m = 2, int n = 3); // 正确

调用时,实参从左到右的顺序依次赋值给相应的形参,不能跳过任何参数。如以下调用错误:

beeps = harpo(3, ,8);

默认参数只是提供了一种便捷方法,在定义类时可以减少需要定义的析构函数、方法以及方法重载的数量。

以下程序使用了默认参数。

#include <iostream>

const int ArSize = 80;
char * left(const char * str, int n = 1);

int main()
{
    using namespace std;
    char sample[ArSize];
    cout << "Enter a string:\n";
    cin.get(sample, ArSize);
    char * ps = left(sample, 4);
    cout << ps << endl;
    delete [] ps;
    ps = left(sample);
    cout << ps << endl;
    delete [] ps;
    return 0;
}

// 返回一个新的字符串,包含原字符串的前n个字符
char * left(const char * str, int n)
{
    if(n < 0)
        n = 0;
    char * p = new char[n+1];
    int i;
    for(i = 0; i < n && str[i]; i++)
    {
        p[i] = str[i];
    }
    while (i <= n)
    {
        p[i++] = '\0';
    }
    return p;
}

其中left函数用于返回传入字符串的前n个字符的新字符串。left函数中使用了new分配的内存,因此在调用完毕后需要使用delete进行释放。
在这里插入图片描述

1.2 函数重载

函数重载是指设计一类函数名相同,但使用不同参数列表的函数,C++根据上下文确定使用的重载函数版本。

函数重载的关键是参数列表,也称为特征标。如果两个函数的参数数目与类型相同,排列顺序也相同,则它们的特征标相同,与变量名无关。

C++允许定义同名但特征标不同的函数。(与C语言不同)

如定义一组原型如下的print函数:

void print(const char * str, int width); 	// #1
void print(double d, int width); 				// #2
void print(long l, int width);						// #3
void print(int i, int width);						// #4
void print(ocnst char* str);							// #5

使用print函数时,编译器根据用法选择具有相应特征标的原型:

print("Pancakes", 15);									// 使用#1
print("Syrup");												// 使用#5
print(1999.0, 10);											// 使用#2
print(1999, 12);												// 使用#4
print(1999L, 12);											// 使用#3

如果编译器找不到匹配的特征标,会尝试进行强制转换以匹配函数原型。

例如以下调用:

unsigned int year = 3210;
print(year, 6);

如果#2为print函数唯一的原型,则函数调用会将year转换为double类型。但由于上面有3种函数原型将数字作为第一个参数,有3种可能的转换方式,这种情况下C++会报错。

编译器在检查函数特征标时,将类型引用和类型本身视为同一个特征标。如以下两个原型:

double cube(double x);
double cube(double & x);

对于重载函数,特征标必须不同。如以下函数声明是互斥的:

long gronk(int n, float m);
double gronk(float n, float m);

C++不允许这样进行重载。返回类型可以不同,但特征标必须不同。

以下的代码中使用了重载函数left。重载的left函数参数为数字,返回数字的前几位。使用n /= 10的方式来计算传入参数的位数,同样也可以用来去掉数字的后几位。

#include <iostream>
unsigned long left(unsigned long num, unsigned ct);
char * left(const char * str, int n = 1);


int main()
{
    using namespace std;
    char * trip = "Hawaii!!";
    unsigned long n = 12345678;
    int i;
    char * temp;

    for(i = 1; i < 10; i ++)
    {
        cout << left(n, i) << endl;
        temp = left(trip, i);
        cout << temp << endl;
        delete [] temp;
    }
    return 0;
}

unsigned long left(unsigned long num, unsigned ct)
{
    unsigned digits = 1;
    unsigned long n = num;

    if(ct == 0 || num == 0)
    {
        return 0;
    }
    while(n /= 10)
    {
        digits ++;
    }
    if(digits > ct)
    {
        ct = digits - ct;
        while(ct --)
        {
            num /= 10;
        }
        return num;
    }
    else
    {
        return num;
    }
}

char * left(const char * str, int n)
{
    if(n < 0)
    {
        n = 0;
    }
    char * p = new char[n+1];
    int i;
    for(i = 0; i < n && str[i]; i++)
    {
        p[i] = str[i];
    }
    while(i <= n)
    {
        p[i++] = '\0';
    }
    return p;
}

运行结果:
在这里插入图片描述

标签:函数,int,笔记,char,print,C++,str,重载
From: https://blog.csdn.net/Ocean1994/article/details/143165263

相关文章

  • C++ 双端队列实现
    #include<iostream>usingnamespacestd;#defineullisize_ttemplate<classT>classDualStack{private: structNode{ Tdata; Node*next; }; Node*head,*tail; Node*p; ullilength;public: DualStack(){ head=NULL; length=0......
  • C++ STL queue 的实现
    求点赞,求关注,求评论求点赞,求关注,求评论求点赞,求关注,求评论求点赞,求关注,求评论求点赞,求关注,求评论求点赞,求关注,求评论求点赞,求关注,求评论这篇文章很短,直接给代码:#include<iostream>usingnamespacestd;template<classT>classQueue{protected: structnode......
  • SpringBoot学习笔记(3)
    一.ORM基本介绍         1.  ORM(ObjectRelationalMapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。ORM通过使用描述对象和数据库之间映射的元数据讲程序中的对象自动持久化到关系数据库中,即ORM能帮助我们完成对象到数据库表......
  • CDQ 分治学习笔记
    鲜花开新坑。早该卷卷了。集训队论文自认为写的很清晰。感觉对于一道自己进集训队时的国赛题能发明一种新做法很牛啊!简述CDQ分治是一种离线分治做法。CDQ分治并没有很固定的模板,这是一种分治思想的延伸。对于一道带修的数据结构问题,我们可以将每个查询视作其之前修改对......
  • C++学习路线(二十二)
    构造函数构造函数作用在创建一个新的对象时,自动调用的函数,用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。构造函数特点1.自动调用(在创建新对象时,自动调用)2.构造函数的函数名,和类名相同3.构造函数没有返回类型4.可以有多个构造函数(即函数重载形式)构......
  • 计算机毕业设计项目推荐:大学生实习成绩评价系统的设计与实现38147(开题答辩+程序定制+
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对大学生实习成绩......
  • 【C++】红黑树万字详解(一文彻底搞懂红黑树的底层逻辑)
    目录00.引入01.红黑树的性质02.红黑树的定义03.红黑树的插入1.按照二叉搜索树的规则插入新节点2.检测新节点插入后,是否满足红黑树的性质1.uncle节点存在且为红色2.uncle节点不存在3.uncle节点存在且为黑色 04.验证红黑树00.引入和AVL树一样,红黑树也是一种自平......
  • 计算机毕业设计项目推荐,个人知识管理系统 79004(开题答辩+程序定制+全套文案 )上万套实
    摘 要尽管我们每天面临的信息越来越多,信息过载与信息噪音越来越严重,但只要我们能充分利用个人知识管理技能,借助有效的个人知识管理软件相信战胜海量信息不再是困难。本课题在分析了个人知识管理现状以及对现有的个人知识管理网站进行研究比较的基础上,针对网络交流互助的特......
  • vue3 学习笔记(不断更新中...)
    组合式APIsetup()11响应式APIrefref用于创建响应式数据(通常用来定义基本类型数据)在JavaScript代码中,需要使用.value来操作数据letcount=ref(1)console.log(count.value)//1count.value++console.log(count.value)//2在Template模板中不需要<scriptse......
  • 2024/10/24日 日志 --》关于Mybatis的学习笔记整理 - 环境与性质
    步入了Mybatis的学习之中,以下为其相关内容的细化笔记整理点击查看代码--MyBatis--·MyBatis是一款优秀的持久层框架,用于简化JDBC开发--·官网:https://mybatis.net.cn/ --持久层:--·负责将数据保存到数据库的那一层代码--JavaEE三层架构:表现层、业务层、持久层分......