【C++】3:函数重载、内联函数和nullptr

目录

一、函数重载

二、内联函数

三、nullptr

一、函数重载

C++⽀持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态行为,使用更灵活。C语言是不⽀持支持同⼀作用域中出现同名函数的。

函数重载可以使函数名相同,提高复用性。

函数重载的条件:

  1. 在同一个作用域下
  2. 函数名称相同
  3. 函数的参数类型不同参数个数不同参数顺序不同

参数类型不同如下所示:

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}
double Add(double left, double right)
{
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}
int main()
{
    Add(10, 20);
    Add(10.1, 20.2);
    return 0;
}

参数个数不同如下所示:

#include<iostream>
using namespace std;

// 2、参数个数不同
void f()
{
    cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}
int main()
{
    f();
    f(10);
    return 0;
}

参数顺序不同如下所示:

#include<iostream>
using namespace std;
// 3、参数类型顺序不同
void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}
int main()
{
    f(10, 'a');
    f('a', 10);
    return 0;
}

注意1:当函数重载碰到默认参数时,有时会报错

#include<iostream>
using namespace std;
void f1() {
	cout << "f1()" << endl;
}
void f1(int a = 10) {
	cout << "f1(int a = 10)" << endl;
}
int main() {
	f1();
	return 0;
}

上述两个函数构成函数重载,但是调用这个函数会报错,因为不知道调用哪一个函数。

所有我们应该尽量避免写一个无参函数和一个全缺省函数。这种情况在类和对象的构造函数经常出现。

注意2:函数是否返回值不能作为函数重载的条件。

二、内联函数

  •  ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调⽤内联函数就不需要建立栈帧了,就可以提高效率。
  • inline对于编译器而言只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调用的短小函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
  • C语言实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不方便调试,C++设计了inline目的就是替代C的宏函数。

  • vs编译器 debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置⼀下以下两个地方。

  • inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。

三、nullptr

NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:

#ifndef NULL

        #ifdef __cplusplus

                #define NULL 0

        #else

                #define NULL ((void *)0)

        #endif

#endif

  • C++中NULL可能被定义为字面常量0,或者C中被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调用指针版本的 f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL); 调用会报错。
  • C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型。
#include<iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);
	// 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(inx),因此与程序的初衷相悖。
	f(NULL);
	f((int*)NULL);
	// 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型
	// f((void*)NULL);
	f(nullptr);
	return 0;

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值