您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 学习笔记(第六章)

2017-11-13 20:20 274 查看

第六章函数

1.基础知识

①作用域:

名字的作用域是程序文本的一部分,名字在其中可见。

②生命周期:

在规定范围内(作用域内)有效,超过范围即自动销毁。

③自动对象:

把只存在于块内执行期间的对象称为自动对象,当块内的执行结束后,块中创建的自动对象的值就变成未定义的了。

④局部静态对象:

       在程序执行路径第一次经过对象定义语句时初始化,并且直到程序终止时才会被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。

int run1()
{ static size_t ctr = 0;
//static静态局部变量,初始化之后不会再被初始化,但是可以改变值的大小
return ctr++; }
int main()
{ for (size_t i = 0; i != 10;i++) //size_t是无符号整形
std::cout<< run1() << endl;
cout<< "请输入任意键退出程序" << endl;
getchar();
return 0; }⑤void和int函数
void函数是为了和C语言做接口才使用的;

在C++中,都要使用int或其他类型的函数,即便没有参数传入,也要使用这种表达形式。

 

2.函数声明

函数声明又被称作函数原型。函数声明与变量一样,可以声明多次,但是只能定义一次。

 

3.求最大公约数

int gcd(int v1,int v2)
{
int a;
while (v2)
{
int temp = v2; //两个数的最大公约数算法
v2 = v1%v2;
a= temp;
}
return a ;
}

4.实参和形参
实参:实在参数,调用函数过程中,传递出去的参数。实参用来初始化形参。

形参:函数中需要被初始化的参数(形参必须要有类型,但是可以省掉变量名称)。

 int a = gcd(15,123); 
//主函数中的实参

 int gcd(int
v1,int
v2)  //被初始化的形参

{        }

①实参和形参的型号可以不一致,但是必须要可以兼容!

②实参和形参的数量必须一致!

 

5.形参种类

函数不可以返还一个数组,但是可以返还数组指针;

不可以返还函数,但是可以返还函数指针。

形参有,
4000
变量赋值型,引用型,指针型,vector型等等。

 

6.引用形参

引用形参是函数中较常用的一种用法。可以避免将数据传送到函数中,大大提升运行速度。

主函数中:

int a = 1; //引用形参
cout<< "未增加3之前:" << a << endl;
Addone(a);
cout<< "增加3之后:" << a << endl;

函数:
void Addone(int &x)  //相当于int &x=a
{
x = x + 3;
}

7.向量容器函数

向量容器也可以放在函数中使用,通常有三种传递方式:复制,引用,迭代器

复制:效率最低,需要把数据复制到函数中

引用:效率高但是不常用

迭代器:最常用的使用方式

主函数:
  vector<double> dvec; dvec.push_back(1.1);
dvec.push_back(2.2);
dvec.push_back(3.3);
print_1(dvec); //复制信息
print_2(dvec); //传递引用
print_3(dvec.begin(),dvec.end());//传递迭代器
复制:

void print_1(vector<double> v)
{
vector<double>::iterator begin=v.begin();
while(begin!=v.end())
{
cout<<*begin<<endl;
begin++;
}
}引用:
void print_2(vector<double> &v)
{
vector<double>::iterator begin=v.begin();
while(begin!=v.end())
{
cout<<*begin<<endl;
begin++;
}
}迭代器:
void print_3(vector<double>::const_iterator beg,
vector<double>::const_iteratorend)
{
while(beg!=end)
cout<<*beg++<<endl; //*beg=devc(1.2.3...)
}
8.指针形参

指针形参也是常用的形参之一。

主函数:
int b = 2;
cout<< "未增加3之前:" << b << endl;
AddTwo(&b); //指针形参,传地址
cout<< "增加3之后:" << b << endl;
函数:
void AddTwo(int *p) //相当于int *p=&b
{
*p = *p + 3;
}
9.const参数传递

在函数中,const型实参可以传递到非const的形参中,同理,非const实参也可以传递到const形参中,但是凡是const部分都不可以发生更改。

主函数:
void AddTwo(int *p) //相当于int *p=&b{
*p = *p + 3;
}

函数:
intconst_add(const int x, const int y)
{
return x + y;
}
10.函数名称

C++语言中可以将函数的名称设置成一样的,但是要求函数的形参必须要有区别。

void fun(float a) { }
void fun(int a) { }
void fun(double a) { }
11.bool型函数

bool型函数最终的返还值为0或1。

主函数:
string s1("one");
string s2("one11");
if (isShooter(s1, s2))
cout<< "s1更短" << endl;
else
cout<< "s2更短" << endl;
函数:
bool isShooter(string &a1, string &a2)
{   return a1.size() < a2.size(); }

12.*&a形参

这个不是很懂,交换指针的例子如下:

主函数:
    int i = 10, j = 20;
    int *p1 = &i, *p2 =&j;
    cout<<
"交换之前:" << i
<< "和"
<< j <<endl;
    swap(p1,p2);
    cout<< "交换之后:"
<< *p1 <<
"和" << *p2
<< endl;

函数:
void swap(int *&v1,int *&v2)
{
    int *tmp =
v2;
    v2 =
v1;
    v1 = tmp;
}

这样可以交换两个指针指向的值。

 

13.数组形参

数组为了保证其速度和内存,通常会采用指针的方式进行,注意数组不是字符串string。

一维数组的传递:

主函数:
int arr[] = { 2, 1, 4,5, 6, 3, 9, 8, 7, 0 };
printValues_1(arr,10); //最推荐使用指针
printValues_2(arr,10);
printValues_3(arr,10); //传引用的方式不灵活,基本都是传的指针函数:void printValues_1(int *x,size_t size) //指向数组的第一个值
{
for (size_t i = 0; i != size; i++)
cout<< x[i] << " ";
cout<< endl;
}
void printValues_2(int x[],size_t size)
{
for (size_t i = 0; i != size; i++)
cout<< x[i] << " ";
cout<< endl;
}
void printValues_3(int x[10], size_t size)
{
for (size_t i = 0; i != size; i++)
cout<< x[i] << " ";
cout<< endl;
}

二维数组:

主函数:
int m[][10]=
{
{1,2,3,4,5,6,7,8,9,0},
{2,3,4,5,6,7,8,9,0,1},
{3,4,5,6,7,8,9,0,1,2}
};
printValues_4(m,3);
函数:
//x是指针,指向一个有很多行的数组的第一行,每一行是10个数,一共有rowSize行
voidprintValues_4(int(*x)[10], int rowSize)
{
for (int i = 0; i != rowSize; i++)
{
for (int j = 0; j != 10;j++)
{
cout<< x[i][j] << " ";
}
cout<< endl;
}
}
14.函数声明

一般情况下,主函数中会引用一个头文件,之后在头文件中声明自己写的所有函数,保证程序可以顺利执行。

//函数声明
int run1();

void main()
{
run1();
}

int run1()
{
/////123
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: