c++基础二(函数)

c++基础二(函数),第1张

函数:

C++ 程序都至少有一个函数,即主函数 main() 

主函数的位置:任意位置

函数也称 方法

格式:

返回值类型  函数名(形参)
{
     内容;
}

形参可以0个和多个
无返回值 void

一般来形参不可以修改实参

void text()
{
	cout << "pp" << endl;
}
int text2(int a)
{
	return a;
}
函数声明:函数声明会告诉编译器函数名称及如何调用函数

格式: 返回值类型  函数名(形参);

void text();//让编译器提前知道text()函数
int main()
{
	text();
	system("pause");
	return 0;
}
void text()
{
	cout << "pp" << endl;
}
函数的重载:

前提条件:函数名相同

  • 参数个数不同
  • 参数顺序不同
  • 参数类型不同

返回值不同不算函数重载

void text()
{
	cout << "pp" << endl;
}
void text(int a)//个数不同
{
	cout << "pp" << endl;
}
void text(double a)//类型不同
{
	cout << "pp" << endl;
}
//顺序不同
void text(int a,double b)
{
	cout << "pp" << endl;
}
void text(double a,int a)
{
	cout << "pp" << endl;
}
函数参数:
值传递修改函数内的形式参数对实际参数没有影响。

引用传递

把实参地址给形参,使得形参可以修改实参
指针传递参数的引用复制给形式参数,使得形参可以修改实参
 引用:相当于起别名   类型一定要一致
  • 格式:  &新名=旧名
  • 本质:  指针常量
  • 使用时一定要初始化 不能为空
  •  别名不可以改变指向  但别名的值可以赋值给其他变量
基本用法: 
    
    int a = 10;
	int &b = a;//必须初始化,且类型要相同
    //改变b 可以改变a
	b = 20;//可以改变值,因为a,b指向同一块地址 b改变 a也改变

    int a = 10;
	int c = 10;
	int &b = a;
	//不可以改变指向  会报错
	&b = c;
	//但可以进行赋值 把b的值赋给c
	c = b;
做函数参数:
void swap(int &a, int&b)
{
	int p = a;
	a = b;
	b = p;
}
int main()
{
	int a = 10;
	int b = 20;
	cout << "原a:" << a << "  " << "原b:" <
引用做返回值:
  • 不能返回局部变量
  • 返回值可以做左值

int& text()
{
	//局部变量
	int a= 10;
	return a;//引用做返回值时不能返回局部变量
}
	//接受局部变量
	int &b = text();
	cout << "b的值:" << b << endl;//编译器保留了一次值 输出正确
	cout << "b的值:" << b << endl;//输出错误

int a = 10;
int& text2()
{
	return a;
}

	//可以作为左值
	text()=100;
    cout << text() << endl;
常量引用: 主要用来修饰形参:防止形参修改实参 
void text(const int &a, const int &b)
{

	int p = a;
//会发生报错  因为a和b不可以被改变
	a = b;
	b = p;
}
const int&b = 10;//相当于 int ppp=10; const int &b=10;ppp是系统生成的临时变量
 指针传递:
void swap(int *a, int*b)
{
	int *p = *a;
	*a = *b;
	*b = *p;
}
int main()
{
	int a = 10;
	int b = 20;
	cout << "原a:" << a << "  " << "原b:" <
注意事项:
void swap(int *a, int *b)
{
	int *temp;
	temp= a;
	a = b;
	b = temp;
}
    int a = 10;
	int b = 20;
	swap(&a, &b);
//swap函数只交换了形参的地址,没有改变实参
重点:引用和指针的区别
  1. 引用是别名,指针是地址
  2. 引用定义时必须初始化,指针可以不用
  3. 引用的大小为引用对象的大小,指针大小为固定的与位数有关,32位 4个字节 64位 8个字节
  4. 引用不可以为NULL,指针可以
  5. 引用不存在多级,指针存在  char **a,char ***a
函数的参数类型:
  1. 普通参数
  2. 默认参数
  3. 占位参数
普通参数:
//普通参数
int text(int a,int b)
{
	return a + b;
}
int text(int &a,int &b)
{
	return a + b;
}
int text(int *a,int *b)
{
	return a + b;
}
 默认参数:
  1. 函数有默认参数,调用时可以不给值,给了值就是用自己给出的值
  2. 如果你没给默认参数值,那么将使用默认参数的值
  3. 第一个默认参数后应该都为默认参数
int text(int a,int b=20)
{
	return a + b;
}

text(10);//结果为30
text(10, 30);//结果为40


//第一个默认参数后面全为默认参数 //不然报错
int text(int a,int b=20,int c=30)
{
	return a + b;
}
 占位参数:
  • 占位参数只有参数类型声明,而没有参数名声明
  • 一般情况下,在函数体内部无法使用占位参数
  • 但调用时必须填补这个参数
int text(int a,int )
{
	return a ;
}

text(10,1);//必须填补

 

c++11开始有匿名函数: Lambda 函数与表达式

lambda表达式的格式:

[捕获列表] (参数) ->返回类型 {函数体};

  • 返回类型可以省略(自动类型推导)
  • 指名返回类型
//指明返回类型
auto  P=[](int a,int b)->int {return a+b};
//自动类型推导
auto  P=[](int a,int b){return a+b};

在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为

  • []:默认不捕获任何变量;
  • [=]:任何被使用到的外部变量都隐式地以传值方式加以引用
  • [&]: 任何被使用到的外部变量都隐式地以引用方式加以引用
  • [x]:仅以值捕获x,其它变量不捕获;
  • [&x]:仅以引用捕获x,其它变量不捕获;
  • [=, &x]:默认以值捕获所有变量,但是x是例外,通过引用捕获;
  • [&, x]:默认以引用捕获所有变量,但是x是例外,通过值捕获;
  • [this]:通过引用捕获当前对象(其实是复制指针);
  • [*this]:通过传值方式捕获当前对象;
lambda表达式的用法注意事项:
  1. 对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入
  2. 当值捕获时,想要改变值,需要使用mutable来修改,对于引用捕获的话可以直接修改
  3. lambda表达式是不能被赋值的
int a=10;
auto int b=[a](int a){return a*10};//不能直接修改,a为临时值 const属性
auto int b=[a](int a)mutable{return a*10};//直接修改,mutable可以修改const属性值
auto int b=[&a](int a){return a*10};//直接修改,a为数值的引用
内置函数:

头文件:#include

cos(x)余弦
sin(x)正弦
tan(x)正切
log(x)返回自然对数
pow(x,y)x的y次方
hypot(x,y)返回两个参数的平方根总和的平方根
sqrt(x)平方根
abs(x)(整形)绝对值
fabs(x)(浮点型)绝对值
floor(x)向下取整
C++ 随机数:

生成的随机数并不是真正的随机数,也是一种算法。

srand()生成随机数种子  ,一般用time()生成

srand((unsigned )time(NULL))

rand(),只会生成伪随机数,使用前先调用srand()

rand()限制生成数:

  • 先用%限制 
  • 再从后面加 n
  •  生成[m,n] 的限制为 rand()%(n-m+1)+m
#include
#include
using namespace std;
int main()
{
	srand((unsigned)time(NULL));
	int b = rand() % 100 + 1;
	cout << b << endl;
	system("pause");
	return 0;
}

 参考文献:

C++教程_编程入门教程_牛客网 (nowcoder.com)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1325635.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)