C++启蒙笔记(5)---函数进阶

本篇目录

  • 一、引用
    • 1.功能
    • 2.按值传递、指针和引用
    • 3.引用实现
  • 二、函数特性
    • 1.默认参数
    • 2.函数重载
    • 3.函数模板

一、引用

1.功能

一种数据类型,相当于变量别名,共用变量内存块,称为指向变量的引用,必须在声明的同时赋值,常用于类与结构

2.按值传递、指针和引用

  • 函数不修改实参
    • 按值传递:数据对象很小的一类
    • 指针:数据对象为数组或结构,指针需要声明为常量指针
    • 引用:数据对象为类对象
  • 函数修改实参
    • 指针:小数据及数组
    • 引用:结构、类对象

3.引用实现

  • 变量引用
    int rat = {};
    int &cat = rat;						// 注意与取地址的区别(在等号的左边)
    
  • 函数结构引用
    #include 
    #include 
    using namespace std;
    
    struct product
    {
    	std::string name;
    	int bottle;
    };
    void display(const product & dis_good);
    product & good_add(product & good_sum, const product & good_from);
    /*****************************************************************************/
    int main()
    {
    	product one = { "啤酒:",8 };
    	product two = { "白酒:",3 };
    	product three = { "威士忌:",9 };
    	product total = { "累计:" };
    
    	display(good_add(total, one));				// 将one加到total里,返回total的引用给display
    	good_add(good_add(total, two), three);		// 连续调用(参照注释返回引用的函数)
    	display(total);
    }
    /*****************************************************************************/	
    // 功能:累加瓶数到good_sum
    product & good_add(product & good_sum, const product & good_from)	
    {
    	good_sum.bottle += good_from.bottle;		// 累计计算瓶子的数目
    	return good_sum;
    }
    // 功能:输出传入结构的名字:瓶数
    void display(const product & dis_good)								
    {
    	cout << dis_good.name << dis_good.bottle << endl;
    }
    
    • 注释
      • display函数:传入的参数均会被转化成const参数,尽量保证同类型的const和非const转化,避免非同类型转换
      • 返回引用的函数(good_add函数)
        • product good_add(…):返回的是good_sum的一个拷贝,返回值放在临时内存中,跟原函数无关
        • product & good_add(…):返回的是结构good_sum(return语句); product &表明返回的数据的数据类型为product类型引用;具体是谁的引用呢?函数内,good_sum为外部实参total的引用,所以,等价代换,返回的good_sum为total的引用;
        • 应避免返回指向临时变量的引用:方法为返回一个作为参数传递给函数的引用,否则函数将成为临时变量的引用,而临时变量在函数运行后将消失

二、函数特性

1.默认参数

  • 定义
    double fun(int x, int y = 3, int z = 4); 	// 函数声明
    
    • 顺序:默认参数放在参数表右侧
    • 位置:默认参数放在函数声明处,定义处不放

2.函数重载

  • 定义:C++中用一个函数名定义多个函数,并以形参类型和个数区分具体调用哪个函数
  • 适用范围:函数执行相同的任务,但使用不同形式的数据时,适用函数重载
  • 声明
    double fun(int);					// 根据1个形参,int类型区分
    double fun(int, double);			// 根据2个形参,int,double类型区分
    double fun(double, int);			// 根据2个形参,double,int类型区分
    
  • 调用
    fun(3);								// 选用第一个声明
    fun(3,2.3);							// 选用第二个声明
    fun(2.3,3);							// 选用第三个声明
    
  • 特例
    • 不以返回值区分:double fun();int fun();一样
    • 不以引用区分:x和&x一样
    • const区分:void fun(const char * pt){}接收的实参无限制,void fun(char * pt){}只接受非const实参,若此二者出现在一个重载函数里,非const实参给后者,const实参给前者

3.函数模板

  • 功能
    在C++里,通过函数模板和类模板来实现泛型编程
  • 简单示例
    #include 
    #include 
    using namespace std;
    
    template
    void c_swap(T &x, T &y);			// 声明
    
    int main()
    {
    	double a = 3;
    	double b = 4;
    	int c = 3;
    	int d = 4;
    	
    	c_swap(a, b);					// 调用1
    	c_swap(c, d);					// 调用2
    }
    
    template
    void c_swap(T &x, T &y)				// 定义
    {
    	T temp;
    	temp = x;
    	x = y;
    	y = temp;
    }
    
    类模板和泛型模板链接,后期补充

上一篇:C++启蒙笔记(4)—函数
下一篇:

你可能感兴趣的:(#,C++)