C++学习笔记——函数提高

1.函数默认参数

1. 如果某个位置参数有默认值,那么从这个位置往后(从左向右)必须都要有默认值
2. 如果函数声明有默认值,函数实现的时候就不能有默认参数(默认参数不能重定义,声明和实现只能一个有默认参数)

3.采用默认参数后,使用时可以不必传输对应位置的参数,直接使用默认参数

//语法
返回值类型 函数名 (参数= 默认值){}

int func(int a, int b = 10, int c = 10) {
    return a + b + c;
}

//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数(默认参数重定义)
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
    return a + b;
}

2.函数占位参数

//语法
返回值类型 函数名 (数据类型){
    ...
}

(在运算符重载中有使用到:用于区别前置++和后置++)

//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
    cout << "this is func" << endl;
}

int main() {

    func(10,10); //占位参数必须填补

    system("pause");

    return 0;
}

3.函数重载

3.1.函数重载的概述

1.条件:

(1)同一个作用域下(可以是全局作用域)

(2)函数名称相同

(3)函数参数类型不同/个数不同/顺序不同(通过你给的参数的类型/个数/顺序,程序自动帮你找原函数是哪个)

(使得编译器调用函数时,并不会产生歧义,可以唯一指定调用的函数

2.目的:提高复用性

3.函数的返回值不可以作为函数重载的条件(例如:返回值是void/int并不是函数重载的条件,返回值可以不指定变量接受,此时并不能通过返回值类型唯一指定函数,产生歧义)

//函数重载需要函数都在同一个作用域下
void func()
{
    cout << "func 的调用!" << endl;
}
void func(int a)
{
    cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
    cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
    cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
    cout << "func (double a ,int b)的调用!" << endl;
}

//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
//    cout << "func (double a ,int b)的调用!" << endl;
//}

3.2.函数重载的注意事项

1.func(const int &a)与func(int &a):

(1)const int &a不允许对a进行修改(只读)

(2)int &a允许对a进行修改

因此,当传入参数为a时(a为变量),因变量允许被修改,两个函数都可以被调用,但是相比之下,更加符合int &a可以被修改的特性,更不符合const不允许修改的特性,故优先调用int &a

当传入参数为10(10为常量),因常量不允许被修改,因此不满足int &a中a可被修改的要求,故只能调用const

(因为引用不能是常量,引用必须指向一片地址空间,即int &a = 10是错误的)

2.func2(int a)和func2(int a, int b = 10)

(1)如果只传入一个参数,编译器将会无法识别应该调用哪个函数,产生歧义(因为此时这两个func2都只需一个参数即可调用)

(2)如果传入两个参数,则不会产生歧义,编译器将会调用func(int a, int b = 10)

这就导致,在这种情况下func(int a)将无法被调用,因此,使用函数重载时,应避免使用默认参数

//函数重载注意事项
//1、引用作为重载条件

void func(int &a)
{
    cout << "func (int &a) 调用 " << endl;
}

void func(const int &a)
{
    cout << "func (const int &a) 调用 " << endl;
}


//2、函数重载碰到函数默认参数

void func2(int a, int b = 10)
{
    cout << "func2(int a, int b = 10) 调用" << endl;
}

void func2(int a)
{
    cout << "func2(int a) 调用" << endl;
}

int main() {

    int a = 10;
    func(a); //调用无const
    func(10);//调用有const


    //func2(10); //碰到默认参数产生歧义,需要避免

    system("pause");

    return 0;
}

你可能感兴趣的:(C/C++,c++,学习,算法)