当前位置: 首页 > C/C++, cpp > 正文

C++ 编程模块

C++ 编程模块

C++函数,函数定义的必须元素:
1.提供函数定义
2.提供函数原型
3.调用函数

为什么需要函数原型?

这个问题很奇怪啊,平时也没考虑过这个问题。
原型描述了函数到编译器的接口,也就是说,它将函数返回值以及参数类型和数量告诉编译器。原型的功能,编译器能正确处理返回值,检查使用的参数数目是否正确,检查参数类型是否正确。
在编译阶段进行的原型被称为静态类型检查。静态类型检查可捕获许多运行阶段非常难以捕获的错误。

const 的一些说明:

int sloth = 3;
const int * ps = &sloth;
int * const finger = &sloth;

第一个声明不允许使用ps来修改sloth 的值,但是允许将ps指向另一个位置,第二个声明,使得finger只能指向sloth,但是允许finger来修改sloth的值。简单来说,finger 和 *ps 是const 属性的,而*finger 和 ps 不是。

内联函数:

内联函数其实就是宏的一种简单实现,注意内联函数不能递归。如果使用了C语言的宏执行了类似函数的功能,应考虑它们替换为C++内联函数。
引用变量:

引用这个东西,经过初步查资料发现,这个和编译器的实现有关,有的编译器就是封装了指针。如果你学过C语言那么引用你就能很快理解。按值传递导致被调用函数使用调用程序的拷贝。

何时使用引用参数:

使用引用参数的原因:
程序员能够修改调用函数中的数据对象,减少传参时候使用指针,容易犯错, 更重要的是引用是为传递类这种数据结构专门设计的。
通过传递引用而不是整个数据对象,可以提高程序的运行速度。当数据比较大的时候,这是有道理的,因为引用参数实际上是基于指针的代码的另一个接口。
对与传递值而不作修改的函数:
如果数据很小,内置数据类型,小型结构,按照值传递
如果数据对象是数组,则使用指针,唯一选择不解释,建议尽量使用const
如果数据对象是较大的结构则使用const 指针或者const 引用,提高程序效率,这样可以节省复制数据结构所需的时间和空间
如果数据对象是类对象,则使用const 引用。类设计的语义常常要求使用引用,这是C++新增的特性,因此传递类对象的标准方式就是按引用传递
如果数据对象是内置数据类型则使用指针。
如果数据对象是结构则使用指针或者引用均可
如果数据对象是类对象则使用引用

存储持续性,作用域,和链接性

自动存储持续性:
在函数定义内声明的变量的存储持续性是自动的,就是栈上的变量。
静态存储持续性:
在函数定义外定义的变量和关键字 static 定义的变量的存储持续性都为静态,C++ 有三种存储持续性为静态的变量
动态存储持续性:
用new 操作符分配的内存将一直存在,直到使用delete删除这个空间,其实就是堆上的空间,也称为自由存储。

三种静态持续变量

创建链接性为外部的静态持续变量,必须在代码块的外面声明它;
创建链接性为内部的静态变量,必须在代码块外边声明它,并使用static
创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static

所有静态持续变量都有下面的特征:

未被初始化的静态变量的所有位置都被设置为0.
只能使用常量表达式来初始化静态变量。

5种变量存储方式
存储描述 持续性 作用域 链接性 如何声明
自动 自动 代码块 无 在代码块中auto
寄存器 自动 代码块 无 在代码块中register
静态,无链接性 静态 代码块 无 在代码块中static
静态,外部链接性 静态 文件 外部 函数外边
静态,内部链接性 静态 文件 内部 函数外边,使用关键字static

如果定义了于外部变量同名的自动变量,当程序执行其所属函数时,该字自动变量会隐藏同名的外部变量。
将static 限定符用于作用域为整个文件的变量时,该变量的链接性将变成内部的,在多文件程序中,内部链接性和外部链接性之间的差别很有意义。链接性为内部的变量只能在其所属的文件中使用,但是常规的外部变量都具有外部链接性。

语言链接性

每一个函数都有自己的名字,但是在C++中支持重载,所以对于同样的函数名,C++会对函数起别的名字,当然是在内部的。可是如果有C 的程序已经预编译好的,我们可以通过如下方法解决。
extern “C” void swap(…….)
extern “C++” void swap(…….)

名称空间及其前途

使用已命名的名称空间中的声明变量,而不是使用外部全局变量
使用在已命名的名称空间中声明的变量,而不是使用静态局部变量
如果已经开发了函数库或者类库,将其放在一个名称空间中.
仅仅将using 作为一种将就代码转换为使用名称的权宜之计
不要再头文件中使用using
对与using声明,首选将其作用域设置为局部而不是全局
2016年01月29日 星期五 00时37分28秒

本文固定链接: http://zmrlinux.com/2016/01/29/c-%e7%bc%96%e7%a8%8b%e6%a8%a1%e5%9d%97/ | Kernel & Me

该日志由 root 于2016年01月29日发表在 C/C++, cpp 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C++ 编程模块 | Kernel & Me