C++从入门到放弃 第六章函数 [函数基础&返回类型&函数重载]

C++从入门到放弃 第六章函数 [函数基础&返回类型&函数重载]

第六章函数 函数基础&返回类型&函数重载

函数基础: 一个典型的函数定义包括以下几个部分:函数返回类型,形参列表,函数体。

// 求阶乘函数
int fact(int val)
{
  int ret = 1;
  while (val = 1)
    ret *=val--;
  return ret;
}

声明周期:

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

对象的生命周期是程序在执行过程中该对象存在的一段时间。

自动对象: 只存在块运行期间的对象。 局部静态对象:将局部变量定义为static类型获得的对象,在执行路径第一次经过时初始化,在程序运行结束后销毁。

size_t count_calls()
{
  static size_t ctr = 0;
  return ctr++;
}
int main()
{
  for(size_t i = 0;i != 10;++i)
    count  count_calls()  endl;
  return 0;
}
// 将输出 0,1,2 ……

参数传递: 参数传递包含引用传递和传值调用。 使用引用避免拷贝:

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

数组引用形参(区分引用的数组和数组的引用): f(int &arr10) ---f(int (&arr)10)

initializer_list形参: 使用条件函数实参数量未知但类型相同。和vector一样 initializer_list 也是模板类型。

void error_msg(initializer_list  ls)
{
  for (auto beg = ls.bengin();beg != il.end(); ++beg)
  {
    cout *beg"";
  }
}

//如果想往initializer_list形参内传递参数必须放到一对花括号内。

error_msg({"func1","func2"});

函数的返回值: 返回类型不为void时,必须显示return一个相同类型(main函数除外,编译器自动添加)。 不要反悔局部对象的引用和指针: 函数指向结束后内部对象将会被销毁,这时的返回值是不安全的。 列表返回初始化的值,我们可以这样改造err函数

vector  process()
{
  return{"func1"};
}

函数重载: 如果函数作用域内几个参数名字相同但形参列表不同,我们称之为重载函数。

Record lookup(const Account&);
Record lookup(const Phone&);
Account acct;
Phone phone;
Record r1 = lookup(acct);
Record r2 = lookup(phone);

重载和const形参: 拥有顶层const的形参无法和没有顶层const的形参区分开来。

Record lookup(const Phone);
Record look(Phone);         //二者是等价的

Record lookup (Phone* const);
Record look(Phone*);         //二者是等价的

调用重载的函数: 当我们通过不同的形参选择合理的函数进行关联,这个过程叫做函数匹配(function matching),也叫做重载确定(overload resolution); 当我们调用重载函数时编译器将产生下面三种结果: 1. 与实参匹配调用成功,2. 编译器无匹配警告, 3. 多个匹配,二义性警告(ambiguous call)。

重载与函数作用域: 当作用域内发现重载的名字将隐藏上层的函数声明。

禽兽一只:《C++ Primer》从入门到放弃zhuanlan.zhihu.com图标

编辑于 2018-06-29