C++ primer 第六章笔记

Chapter 6 函数

 

#函数基础

  • 声明:返回类型、函数名、形参列表、分号 
  • 定义:返回类型、函数名、形参列表、函数体
  • 调用:函数或函数指针,实参列表

 

#参数传递

1.形参是引用类型,它将绑定到对应的实参上.  否则,将实参的值拷贝后赋给形参;

2.C++,建议使用引用类型的形参代替指针;

//传引用参数
void reset(int &i){
        i = 0;    
}   

int j = 24;
reset(j);
cout << j << endl; //输出是0;

3.使用引用,避免拷贝. 若函数无须改变引用形参的值,最好将其声明成常量引用;

bool isShorter(const string &s1 , const string &s2){
    return s1.size() < s2.size();
}

4.数组形参

数组有两个特殊的性质

  • 不支持拷贝

  • 数组名通常会自动转化为指针

5.main:处理命令行选项;

  • int main( int argc, char **argv ) {}
  • 当使用 argv 中的实参时,一定要记得 可选的实参从 argv[1] 开始;argv[0]保持程序的名字,非用户输入

 

#返回类型与return语句

1.在含有return语句的循环后面应该也有一句return语句;

2.不要返回局部对象的引用或指针

3.引用返回左值: 如果函数返回的是引用类型的对象,可以直接对函数调用的结果进行赋值

getVal( s, 0 ) = 'A';

4.列表初始化返回值:

vector<string> process()  
{  
    return {"Hi", "bye"};  
}

5.返回数组指针

  • 数组不能被拷贝,所以不能返回数组, 不过函数可以返回 数组的指针 或引用;
  • 声明一个返回数组指针的函数:   
    //数组指针:指向数组的指针 int (*p)[10]; p即为指向数组的指针
    Type (*function (parameter_lst) [dimension]
    eg:
    int (*func(int i))[10];
    /*
      func( int i ) :表示调用func函数时需要一个int类型的实参;
    ( *func(int i) ) :意味着可以对函数调用结果执行 解引用 操作;
    ( *func(int i) ) [10] : 表示解引用func的调用将得到一个大小是10的数组;
    int ( *func(int i) ) [10] :表示数组中的元素是int类型;
    */
  • 这种写法难免有些复杂,而复杂容易产生错误,有三种方式简化 P206

    • 类型别名
    • 尾置返回类型  
      //func接受一个int类型的实参,返回一个指针,该指针指向含有10个整型的数组;
      auto func(int i) -> int (*)[10];
    • decltype:
      int odd[] = {1,3,5,7,9}; 
      int even[] = {0,2,4,6,8}; 
      decltype(odd) *arrPtr(int i){  //注: * 符号
        return (i%2) ? &odd : &even;
       }
      //decltype不负责把数组类型转换成对应的指针,所以要像表示arrPtr返回指针必须在声明时加一个 *符号;

       


6.函数重载

  • main函数不能重载 
  • 最佳匹配

 

#特殊同于语句特性

1.内联函数( inline ):                  

  • 可避免函数调用的开销 ;
    inline const string &
    shorterString( const string &s1,const string &s2){
            return s1.size() < s2.size();
    }

     

2.constexpr函数:

//补充

 

3.调试帮助

  • assert 预处理宏:首先对expr求值,若为false(0),assert输出信息并终止程序的执行 ;
    assert ( expr )

     

  • NDEBUG 预处理变量 :

 

4.函数指针:指向函数而非对象;

bool (*pf) (const string &s1,const string &s2); 
// *pf 两端的括号必不可少;

 

5.返回指向函数的指针;

int ( *f1(int ) )(int *, int );

//尾置 返回类型
auto f1(int ) -> int (*) (int * ,int );

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/chenjz1993/p/6750221.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值