C++入门基础

Posted 可乐不解渴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++入门基础相关的知识,希望对你有一定的参考价值。

缺省参数

前言

在C语言中,函数没有指定参数列表时,默认可以接收任意多个参数; 在C++中,因为有严格的参数类型检测,所以,函数没有参数列表时,默认为void,不接收任何参数。
以下是例子:
在C语言中

#include<stdio.h>
void test()
{

}
int main()
{
	//函数没有指定参数列表时,默认可以接收任意多个参数
	test("Hello world","zhangsan","10");
	system("pause");
	return 0;
}

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

在C++中

#include<iostream>
using  namespace std;
void test()
{

}
int main()
{
	test("Hello world","zhangsan","10");
	system("pause");
	return 0;
}

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

缺省参数概念

(1) 缺省参数是声明或定义函数时为函数的参数指定一个默认值。
(2)在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。

示例

#include<iostream>
void Test(int x=10)
{
	std::cout << x << std::endl;
}

int main()
{
	Test();		//没有传参数时,使用参数默认值,则输出结果为10
	Test(100);	//当有传入参数时,使用给定的参数,则输出结果为100
	return 0;
}

缺省参数的分类

全缺省参数

(1)全缺省参数:函数的每个参数都有缺省值,传参时,可传任意多个参数,且参数的传参是从左依次往右进行。

#include<iostream>
void TestFunc(int a = 10, int b = 20, int c = 30)
{
    std::cout << "a = " << a<<" ";
    std::cout << "b = " << b << " ";
    std::cout << "c = " << c << std::endl << std::endl;
}
int main()
{
    TestFunc();		//不传参数则使用参数默认值 10,20,30
    TestFunc(1);	//只传一个参数,则第一个参数用传入的值 1,20,30
    TestFunc(1,2);	//传两个参数,则第一、第二个参数用传入的值 1,2,30
    TestFunc(1,2,3);//全部位置都传入参数,则使用我们传入的参数值 1,2,3
    return 0;
}
结果:

在这里插入图片描述

半缺省参数

(2)半缺省参数:函数的部分参数有缺省值,且缺省值要从右往左依次给。

#include<iostream>
void TestFunc(int a, int b = 20, int c = 30)
{
    std::cout << "a = " << a<<" ";
    std::cout << "b = " << b << " ";
    std::cout << "c = " << c << std::endl << std::endl;
}
int main()
{
    //TestFunc();     //error  编译时会出错,因为a没有缺省值,所以必须传参。
    TestFunc(1);
    TestFunc(1,2);
    TestFunc(1,2,3);
    return 0;
}

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

注意:

  1. C语言不支持(编译器不支持)。
  2. 缺省参数不能在函数声明和定义中同时出现。
  3. 缺省值必须是常量或者全局变量。
  4. 半缺省参数必须从右往左依次来给出,不能间隔着给。

函数重载

前言

在自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
为此,C++允许用一个函数名来表达这些功能相同、只是操作类型不相同的函数,即函数重载(overload)

函数重载的本质就是允许功能相同,但函数参数或函数类型不同的函数采用同一个函数名,从而在编译器的帮助下能够用一个函数名访问一组相关的函数。

函数重载概念

函数重载:就是指同一个函数名可以对应多个函数的实现,即这些函数名是相同的,但是它们的形参个数和类型却不同,编译器能够根据它们各自的实参和形参的类型以及参数的个数进行最佳匹配,自动决定调用哪一个函数体。

示例

在这里插入图片描述

#include<iostream>
int add(int x, int y)
{
	std::cout << "(int,int)\\t";
	return x + y;
}

double add(double x, double y)
{
	std::cout << "(double,double)\\t";
	return x + y;
}

int add(int x, double y)
{
	std::cout << "(int,double)\\t";
	return x + y;
}

double add(double x, int y)
{
	std::cout << "(double,int)\\t";
	return x + y;
}
int main()
{
	std::cout << add(9, 8) << std::endl;
	std::cout << add(9.0, 8.0) << std::endl;
	std::cout << add(9, 8.0) << std::endl;
	std::cout << add(9.0, 8) << std::endl;
	return 0;
}

结果:
在这里插入图片描述
注意:如果只是返回值类型不同,是不构成函数重载的。

但如果出现下面这种情况函数重载与缺省参数同时出现,还构不构成重载呢?

void fun(int a,int b,int c=10)
{

}

void fun(int a,int b)
{

}

同样它们还是满足重载的条件,所以它们是重载,但是我们在调用这这个函数只传入两个参数时,就会发生如下报错。
在这里插入图片描述
这是因为当传入两个参数时,编译器不清楚我们到底要调用那一个函数,导致出错。这里就提醒我们如果有缺省参数的函数尽量避免重载而发生错误。

内联函数

前言

使用函数有利于代码重用,可以提高开发效率,增强程序的可维护性,也有利于许多人一起分工协作开发。函数的调用过程显示,当调用一个函数时,程序要转到内存中函数的起始地址去执行,执行完函数的代码后再返回到调用点继续执行,这种转移操作要求再转移前保护现场以及保存返回后执行的地址,返回后要回复现场并按保存的地址继续执行,这一切都需要时间和空间方面的开销。C++引入内联函数,其目的是为了提高函数的执行效率,同时取代C语言中容易出错的带参数的宏代码,以加强类型安全检查,增加程序的安全性。

内联函数概念

inline翻译成“内联”,意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间)。因此,内敛函数实际上是一种用空间换取时间的方案。

内联函数的使用

内联函数应该定义在前,使用再后,定义时只需在函数定义的头前面加上关键字inline即可。内联函数的定义如下:
inline 函数类型 函数名 (形式参数表) { }
在内联函数扩展时进行了实参与形参结合的过程:先将实参名(而不是实参值)与函数体中的形参替换,然后搬到调用出。但从用户的角度看,调用内敛函数和一般函数没有任何区别。下面就是一个使用内敛函数的栗子。
在这里插入图片描述

示例

#include<iostream>

inline double CirAree(double radius)
{
	return 3.14 * radius * radius;
}

int main()
{
	double r1(1.0);
	double r2(2);
	std::cout << CirAree(r1) << std::endl;
	std::cout << CirAree(r1+r2) << std::endl;
	return 0;
}

注意

(1)如果仅在声明函数原型时加上关键字inline,并不能达到内敛效果。
(2)内敛函数的定义必须出现在对该函数的调用之前,这是因为编译器在对函数调用语句进行替换时必须事先知道替换该语句的代码是什么,这也是仅在表明函数原型时加上关键字inline并不能达到内敛效果的原因。与处理register变量相似,是否对一个内联函数进行扩展完全由编译器自行决定,编译器将根据函数的定义自动取消不得值的内敛操作,因此说明一个内联函数只是请求而不是命令编译器对它进行扩展。事实上,如果将一个较复杂的函数定义为内联函数,大多数编译器会自动地将其作为普通函数处理。

以下情况不宜使用内联函数

(1)如果函数体内的代码比较长,使用内联函数将导致内存消耗代价较高。
(2)在内联函数体内不宜出现循环。
(3)递归函数不能定义为内联函数。
(4)在内联函数体内 不宜含有复杂结果控制语句,例如switch等。

引用

引用的定义

从逻辑上理解,引用(reference)是已存在变量的别名(alias)。通过引用,我们可以间接访问变量,指针也能简介访问变量,但引用在使用上比指针更安全。引用的主要用途是描述函数的参数和返回值,特别是传递较大的数据变量。

定义一个引用型变量的语法格式如下:

数据类型 & 引用变量名 =变量名;
其中:
数据类型应与被引用变量的类型相同;
& 是引用运算符,在这里是二元操作符;
变量名为已定义的变量。

例如:

int x;
int & rx=x;

rx是一个引用型变量,它被初始化为整形变量x的引用。即给整形变量x起了一个别名rx,rx称为对x的引用,x称为rx的引用对象。rx与被引用变量x具有相同的地址,即rx与x使用的是同一块内存空间。对引用变量值的修改就是对被引用变量的修改,反之亦然。

引用与函数

1.引用作为函数的参数

以我们最常用的交换函数为例:

void Swap(int& x, int& y)
{
	int temp = x;
	x = y;
	y = temp;
}

引用与指针相比,引用作为函数参数具有下面两个优点:

(1)函数体的实现比指针简单。用指针作为形参,在函数体内新参要带着*参加运算;而引用作为新参,在函数体内参加运算的为形参变量。
(2)调用函数语法简单。用指针作为形参,实参需要取变量的地址;而引用作为形参,与简单传值调用一样,实参为变量。

2.引用作为函数的返回值

int& max(int array[], int n)
{
	int t = 0;
	for (int i = 0; i < n; i++)
	{
		if (array[i] > array[t])
		{
			t = i;
		}
	}
	return array[t];
}

注意:当函数返回类型是引用型时,返回变量不能是临时变量。
END...

以上是关于C++入门基础的主要内容,如果未能解决你的问题,请参考以下文章

C++ 解释器/控制台/片段编译器

C++ rapidjson 基础入门

C++基础入门丨1. 初识C++像极了C语言

C++基础入门丨1. 初识C++像极了C语言

给有C或C++基础的Python入门 :Python Crash Course 5 if语句

C入门C++ 基础笔记