0.前期准备
请安装Visual Studio
并学习基本的新建项目、新建CPP文件以及运行代码。
1.从Hello World 开始
1.1代码内容
函数功能:打印“Hello World”
#include<iostream>
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
1.2 相关知识点
1.函数构成
输入参数列表+函数名+返回类型+函数主体
如下图所示,但是main函数稍有特殊,其为cpp
现举一个简单函数的例子,z= 2x-3y+3,其中xy均为浮点型小数,取函数名为CalBinFun,函数输入列表应包括x、y,返回值类型为float,函数代码如下:
注意:return 返回的数据,其数据类型必须和函数定义的返回值类型一致,即如下代码第三行z的定义必须为float。
float CalBinFun(float x, float y)
{
float z = 2 * x - 3 * y + 3;
return z;
}
可以在如下主函数中对以上函数进行反复调用
int main()
{
std::cout << CalBinFun(1.1,3.5)<< std::endl;
std::cout << CalBinFun(2.9, 0.5) << std::endl;
return 0;
}
2. 形参列表详解
上文提到的函数输入参数列表,其名称为形参列表,在函数定义过程中,其有多种使用方法,现进行详细介绍
2.1 形参和实参
用于接收传递值的变量被称为形参;传递给函数的值被称为实参。
发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
如在上文函数CalBinFun中,float x, float y
为形参,在调用函数之前,我们不知道其具体数值,只知道其数据类型, CalBinFun(1.1,3.5)
中 1.1,3.5
为实参,我们知道其具体数值,当算法执行float z = 2 * x - 3 * y + 3;
时,其中形参x
和y
分别为1.1
和3.5
,因为调用函数时,将实参赋值给形参。
函数调用时,实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误
2.2 三种函数参数传入方式
2.2.1 原理及是否修改主函数中实参的值
2.2.1.1值传参
将主函数中w
的数值复制给PrWord01
中的word,两个变量地址不同,在PrWord
中改变Word的值不会影响主函数中w的值。
#include<iostream>
#include<string>
using namespace std;
//值传递
void PrWord01(int word)
{
cout << "First: " << word << endl;
cout << "Address fun: " << &word << endl;
word = 2;
cout << "Second: " << word << endl;
}
int main()
{
int w =20;
PrWord01(w);
cout << "After Print-> main: " << w << endl;
cout << "Address fun: " << &w << endl;
return 0;
}
2.2.1.2指针传参
:将主函数中w
的地址传递给函数PrWord02
的word指针,word指针存储值为w的地址,在函数PrWord02
中修改*word的值,即修改word存储的地址(也是主函数w地址上的值),所以指针传递方法修改形参的值,也就是修改了实参的值。
//指针传递
void PrWord02(int *word)
{
cout << "First: " << &word << endl;
cout << "First: " << word << endl;
cout << "First: " << *word << endl;
*word = 2;
cout << "Second: " <<*word << endl;
cout << "Second: " << word << endl;
}
int main()
{
int w =20;//002
PrWord02(&w);
cout << "After Print-> main: " << w << endl;
cout << "Address fun: " << &w << endl;
return 0;
}
2.2.1.3引用传参
引用的本质是别名,相当于子函数中word
是主函数中w
的别名,其地址一致,修改子函数中形参也会修改主函数中实参。
#include<iostream>
#include<string>
using namespace std;
//引用传递
void PrWord03(int &word)
{
cout << "First: " << &word << endl;
cout << "First: " << word << endl;
word = 2;
cout << "Second: " << word << endl;
}
int main()
{
int w =20;
PrWord03(w);
cout << "After Print-> main: " << w << endl;
cout << "Address fun: " << &w << endl;
return 0;
}
相比于前两者,引用传参是最省内存的方式,但是大多数情况,我们不想在子函数中修改主函数中的变量,只需在形参前加上关键字const
,这样便无法修改形参,如下图对word的修改已经标出错误。
2.2.2 Hello World
的三种传参方式(作业)
以下给出字符串打印函数的三种传参方式,作为读者的练习参考答案
2.2.2.1 字符串方式
void PrWord01(string word)
{
cout <<"First: "<< word << endl;
word = "changed";
cout << "Second: " << word << endl;
}
void PrWord02(string *word)
{
cout << "First: " << word << endl;//存储的地址
cout << "First: " << *word << endl;//解引用:* 表示其保存的地址上保存的值
*word = "changed";
cout << "Second: " << word << endl;
cout << "Second: " << *word << endl;
}
void PrWord03(string &word)//word 相当于取别名 word和w指向同一地址 保存相同的值 注意 一经引用&word不可以修改
{
cout << "First: " << word << endl;//word的值
cout << "First: " << &word << endl;//word的地址
word = "changed";
cout << "Second: " << word << endl;
cout << "Second: " << &word << endl;
}
void PrWord03(const string &word)//运行会报错 加了const word不可修改
{
cout << "First: " << word << endl;
cout << "First: " << &word << endl;
word = "changed";
cout << "Second: " << word << endl;
cout << "Second: " << &word << endl;
}
2.2.2.2 字符数组方式
#include<iostream>
#include<string>
#include<typeinfo>
using namespace std;
//值传参 数组传参没有值传递 所谓值传参就是传递指向数组首地址的指针参数,与指针传参等效
void PrWord01(char word[])
{
printf("01__________Address of word %x \n", &word);
printf("01__________Value of word %x \n", word);
printf("01__________Value of Value of word %s \n", word);
word[0] = 'h';
printf("01__________After changed Value of Value of word %s \n", word);
}
//指针传参
void PrWord02(char *word)
{
printf("02__________Address of word %x \n", &word);
printf("02__________Value of word %x \n", word);
printf("02__________Value of Value of word %s \n", word);
word[1] = 'E';
printf("02__________After changed Value of Value of word %s \n", word);
}
//引用传参
void PrWord03(char (&word)[12])//引用传递 必须输入数组长度 word是w的别名 其首地址和w首地址一致
// 如果不想修改主函数中w 写成 void PrWord03(const char (&word)[12])/
{
printf("03__________Address of word %x \n", &word);
printf("03__________Value of word %x \n", word);
printf("03__________Value of Value of word %s \n", word);
word[2] = 'L';
printf("03__________After changed Value of Value of word %s \n", word);
}
int main()
{
char w[] = "Hello world";
printf("Address of w %x \n", &w);
PrWord01(w);
printf("After PrWord01-> main: %s \n", w);
PrWord02(w);
printf("After PrWord02-> main: %s \n", w);
PrWord03(w);
printf("After PrWord03-> main: %s \n", w);
return 0;
}