1.函数应该在头文件中声明,并在源文件中定义。(定义函数的源文件应包含声明该函数的头文件)将提供函数声明的头文件包含在定义该函数的源文件中,可使编译器能检查该函数的定义和声明是否一致。

2.既可以在函数声明也可以在函数定义中指定默认参数。但是,在一个文件中,只能为一个形参指定默认实参一次。下面的例子是错误的:

//ff.h

int ff ( int i=0 );

//ff.c

#include "ff.h"

int ff( int i= 0 ){ /* ......*/ }  //error

通常,应在函数声明中指定默认实参,并将该声明放在合适的头文件中。

如果在函数定义的形参表中提供默认实参,那么只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的。

3.内联函数应该在头文件中定义,这一点不同于其他函数。

内联函数能要在程序中定义不止一次,只要内联函数的定义在某个源文件中只出现一次,而且在所有源文件中,其定义必须是完全相同的。把内联函数的定义放在头文件中,可以确保在调用函数所使用的定义是相同的,并且保证在调用点该函数的定义对编译器可见。

在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译。


4.编译器隐式的将在类内定义的成员函数当作内联函数。

5.const对象,指向const对象的指针或引用只能用于调用其const成员函数,如果尝试用它们调用非const成员函数,则是错误的。

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

合成的默认构造函数一般适用于仅包含类类型成员的类。而对于含有内置类型或复合类类型成员的类,则通常应该定义他们自己的默认构造函数初始化这些成员。

7.如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复声明。如果两个函数的形参表完全相同, 但返回类型不同,则第二个声明视错误的。

在同一类中,对于函数名相同的const函数和非const函数能够构成重载,同时它们被调用的时机为:如果定义的对象时常对象,则调用的是const成员函数,如果定义的对象非常对象,则调用的重载的非const成员函数。

重载函数的条件:

(1)相同的作用域

(2)函数名相同

(3)函数的形参表不同

(4)与函数的返回值无关

对于重载注意:

(1)形参与const形参的等价性仅适用于非引用形参;

(2)有const引用形参的函数与有非const引用形参的函数是不同;

(3)函数带有指向const类型的指针形参与带有指向相同类型的非const对象的指针形参的函数不相同。

8.函数指针只能通过同类型的函数(同类型包括参数和返回值)或函数指针或0值常量表达式进行初始化或赋值。(注意:指向不同函数类型的指针之间不存在转换)

9.C++语言允许 使用函数指针指向重载的函数。(注意:指针的类型必须与重载函数的一个版本精确匹配(精确匹配,包括参数和返回值,隐形转换都不行的)。如果没有精确匹配的函数,则对该指针的初始化或赋值都将导致编译错误)

C++ Primer 有感(函数)的更多相关文章

  1. C++ Primer 有感(命名空间)

    1.命名空间定义以关键字namespace开始,后接命名空间的名字. 2.命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义. 3.定义在命名空间中的实体称为命名空间的成员.像任意 ...

  2. C++ Primer 有感(异常处理)

    1.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 2.执行throw的时候,不会执行跟在throw后面的语句 ...

  3. C++Primer学习——函数

    编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...

  4. C++ Primer 有感(管理类的指针成员)

    C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理. 我现在分析一下为什么要管理指针成员. 有如下Student类,Student.h如下: [cpp] view ...

  5. C++ Primer 有感(标准库pair)

    与关联容器相关的模板类型,包含两个数据成员,在utility头文件中定义. pair类型提供的操作: pair<T1,T2> p1; pair<T1,T2> p1(v1,v2) ...

  6. C++ Primer 有感(标准库vector及迭代器)

    vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...

  7. C++ Primer 有感(标准库map类型)

    map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样.而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取. 1.map对 ...

  8. C++ Primer 有感(异常处理)(四)

    查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常. 异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或 ...

  9. C++ Primer 有感(异常处理)(三)

    先看下面的代码: [cpp] view plaincopy int main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; ...

随机推荐

  1. JavaScript 注释

    JavaScript 注释可用于提高代码的可读性. JavaScript 注释 JavaScript 不会执行注释. 我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性. 单行 ...

  2. 简单将sublime text 配置为lua或c#一键编译运行环境

    lua { "cmd": "luajit $file", "selector":"source.lua" } C { & ...

  3. 在安卓代码中dp 和 sp 换算px

    /** * 单位转换工具 * * @author carrey * */ public class DisplayUtil { /** * 将px值转换为dip或dp值,保证尺寸大小不变 * * @p ...

  4. Switch控件详解

    Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...

  5. Android开发学习之路--逆向分析反编译

      一般情况下我们想要了解别人的app怎么实现这个动画,这个效果的时候,总是会想到反编译一下,看下布局,看下代码实现.对,这对于有经验的玩家确实手到擒来了,但是初学者,根本就不知道怎么反编译,怎么看代 ...

  6. nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解

    1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...

  7. static修饰符详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  8. Hibernate之综合问题

    n + 1问题 query.iterate()方式返回迭代查询会开始发出一条语句:查询所有记录ID语句 Hibernate: select student0_.id ascol_0_0_from t_ ...

  9. activiti 任务节点 处理人设置

    1.1.1. 前言 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 我们在使用activiti 工作流引擎的时候, ...

  10. mysql-workbench工具update(更新)失败的解决办法

    是因为安全模式的保护,所以我们需要设置一下: 如下:windows下是edit–>preferences–>SQL Editor 把右边的最后一行,"safe update&qu ...