c++primer 第五、六章 - 语句、函数



1 范围for:

c++primer 第五、六章 - 语句、函数_第1张图片


例:

vector v={0,1,2,3,4,5,7,8}; 

for(auto &r : v)

      r*=2;


范围for来源于:

for(auto beg=v.begin(),end=v.end();beg!=end;++beg)

   {

     auto &r=*beg;

     r*=2;

   }


因为范围for中使用了 v.end() ,所以范围for不可以用于给vector添加值;


2 分离式编译

文件为:factMain.cc、fact.cc、Chapter6.h

注意包含关系;main.cc、fact.cc分别包含fact.h文件;( Main.cc  <--  Chapter.h---->fact.c)

编译过程:g++ factMain.c  fact.cc   -o main  //得到可执行文件 main


//factMain.cc

#include "Chapter6.h"
#include 

int main()
{
    std::cout << "5! is " << fact(5) << std::endl; 
    std::cout << func() << std::endl; 
    std::cout << abs(-9.78) << std::endl;
}



//Chapter6.h

int fact(int val);
int func();

template  
T abs(T i)
{
    return i >= 0 ? i : -i;
}



//fact.cc

#include "Chapter6.h"
#include 

int fact(int val)
{
    if (val == 0 || val == 1) return 1;
    else return val * fact(val-1);
}

int func()
{
    int n, ret = 1;
    std::cout << "input a number: ";
    std::cin >> n;
    while (n > 1) ret *= n--;
    return ret;
}



3 参数传递

调用函数时,子函数用传入的实参初始化形参;相等于 (int 形参=实参;)

问题;(形参=实参)形式的调用,会导致实参、形参失联;及形参值的改变不影响实参;

解决方法:

1 子函数用 return 返回所需值;

2 引用调用(推荐使用),及子函数这样定义(void fact(int &a,int &d));如此一来,(int &形参=实参;);该过程只是给原有的实参生命了别名,省内存;

3 指针形参,及子函数这样定义(void fact(int *a,int *d));如此一来,(int *形参=实参;),所以传入的实参也要是指针。该过程是产生新的指针,占用内存;


3.1 数组形参

c++primer 第五、六章 - 语句、函数_第2张图片

c++primer 第五、六章 - 语句、函数_第3张图片


3.2 main:处理命令行选项

main()函数位于 可执行文件prog之内;
int main(int argc,char *argv[])   {  ...   }
int main (int argc, char **argv)  {   ...   }
第一个参数 argc:表示数字中字符串的个数;
第二个参数argv:是一个数组,指向c风格字符串的指针;
执行可执行文件prog的命令:prog infile outfile 
argc=3;
argv[0]="prog";
argv[1]="infile";
argv[2]="outfile";

4 内联函数

将函数指定为内联函数,可以使函数,在调用点展开;避免了非内联函数函数调用时的额外开销,适用于调用频繁的函数;

在子函数的返回值类型上,加上关键字inline,就可将它声明为内联函数:

如:

c++primer 第五、六章 - 语句、函数_第4张图片















你可能感兴趣的:(c++,primer,学习笔记)