《C++ Primer》第7章函数

1.与操作符一样,函数可以重载,这意味着同样的函数名可以对应不同的函数

2.函数调用做了两件事情:用相应的实参初始化函数的形参,控制权交给被调用的函数

3.C++是一门强静态语言,每一次函数调用的时候,编译器会检查实参。好处:对于大程序,在编译时检查出接口的错误,减少调试时间

4.非引用形参:通过复制对应的实参实现初始化

5.const形参

调用函数时

  • 1.如果函数使用的是非引用非const形参,既可以给该函数传递const实参也可以是非const实参
  • 2.如果函数使用的是非引用const形参,既可以给该函数传递const实参也可以是非const实参
  • 3如果函数使用的是引用非const形参,不可以给函数传递非const对象(这样理解,当为引用的时候,与原先的值相互关联,不能用非const作为形参去接受const引用,改变const引用的值岂不是很滑稽)
  • 4.如果函数使用的是引用const形参,既可以给该函数传递const实参也可以是非const实参(提升限定符)

6.非const引用形参只能与完全同类型的非const对象关联

7.最佳实践:应该将不需要修改的引用形参定义为const引用(这样做的好处:1使函数运行的更快,应该是编译上导致的   2可以使用不可复制的类型,如IO类型)

8.对于vector这样的形参,从避免复制的角度出发,应将形参声明为引用类型。C++程序员倾向于通过传递容器中的迭代器来传递容器

9.数组形参:当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型与数组元素的类型是否匹配,而不会检查数组的长度

10.通过引用传递数组。如果形参是数组的引用,编译器不会将数组实参转换为指针,而是传递数组的引用本身,编译器会检查大小(此条需要注意,当形参为数组的引用的时候,不会将数组实参转换为指针,同样的可参见泛型编程中类型形参的实参转换的受限中的数组或函数到指针的转换)

多维数组的元素本身就是数组。除了第一维以外所有维的长度都是元素类型的一部分,必须确定。

11.任何处理数组的程序都要确保程序停留在数组的边界内。1.C风格的字符串,以NULL结尾  2.标准库规范(传递数组的第一个元素和最后一个元素) 3.显示传递数组大小的形参

12.主函数定义了两个形参int main(int argc , char  **argv[]),第二个参数是字符串数组,第一个形参是数组中字符串的个数(待亲测,已测)

含有可变形参的函数。void foo(parm_list,....)

13.小心:含有return语句的循环后不提供return语句很危险,大部分编译器检测不出来此项错误

14.main函数返回0表示运行成功,非0则各个机器有不同的意义.

15.如果返回类型是非引用,调用函数的地方会将函数的返回值复制给临时对象

16.返回时引用,不复制返回值,返回的是对象本身。例如:const string &shorterString ( const string &s1 , const string &s2)。

17.千万不要返回对局部对象的引用。同样不能返回局部对象的指针。

18.如果一个形参具有默认实参,那么它后面的所有形参都必须有默认参数。

string abc(int a = 0,string f = "!",int c)

19.在一个文件中,只能为形参指定默认实参一次。

20.名字的作用域是知道该名字的程序文本区。对象的生命周期则是程序执行过程中对象的存在时间。

21.自动对象在每次函数调用时创建和撤销。局部对象和形参都是自动对象。

22.静态局部对象:static。这种对象一旦被创建,在程序结束前都不会撤销

23.内联函数避免函数调用的开销,适用于优化小的只有几行的且经常被调用的函数,内联函数最好加入到头文件中。

24.类的成员函数(在类内中定义的):编译器将隐式当做内联函数

25.每一个成员函数(除了static以外)都有一个隐藏的的形参this,初始化为调用函数的对象的地址

26.const成员函数的引入:常量成员函数,const改变了隐含的this形参的属性,const成员函数不能修改调用函数的对象。

27.const对象和指向const对象的指针或引用只能调用const成员函数。

28.构造函数需要放在public中。默认构造函数的形参与函数体都为空。

29.如果没有为一个类显示定义任何构造函数,编译器将自动为这个类生成默认构造函数。

30.main函数不能重载。

31.如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的。

32.形参与const形参等价(仅适用于非引用的形参)仅当形参是引用或是指针时,形参是否为const才有影响

33.无法将整型值传递给枚举型的形参,但可以将枚举值传递给整形形参。

34.注意不能基于指针本身是否为const来重载,例子如下:

f(int *);

f(int *const);//重复声明

35.函数指针:函数类型由其返回类型以及形参表确定  bool (*pf)( cosnt string & ,  const string &);

36.直接引用函数名等效于在函数名上取地址符。

37.函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或是赋值。指向不同函数类型的指针之间不存在转换。

38.允许将形参定义为函数类型,但函数的返回类型必须是指向函数的指针,而不能是函数。具有函数类型的形参所对应的的实参将被自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换无法实现。















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值