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

第六章函数

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.形参种类

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

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

形参有,变量赋值型,引用型,指针型,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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值