2014之C++学习笔记(四)关于C++函数的传说_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 2014之C++学习笔记(四)关于C++函数的传说

2014之C++学习笔记(四)关于C++函数的传说

 2014/10/27 20:59:41  Etwo  程序员俱乐部  我要评论(0)
  • 摘要:一转眼也过去有俩月了,本以为还是坚持不了,博客的力量总是有的,看着自己以前写的博客,现在也需要重新拾起来,当然所谓的公司有新的功能系统需要开发,也肯定早就完成了,为啥时间都过去将近这么久了才重新拾起,原因也是最近etwo显得有些颓废了。虽然博客写的不怎样,但是总会有些收获的,不是吗?坚持学习某样东西都要写好日志记录,加油!要充满正能量!1、1、什么是函数函数由函数名以及一组操作数类型唯一地表示。函数的操作数,也即形参,在一对圆括号中声明,形参与形参之间以逗号分隔
  • 标签:笔记 学习 C++学习笔记 函数 c++ 学习笔记

class="MsoNormal" style="margin: 0cm 0cm 0pt;">一转眼也过去有俩月了,本以为还是坚持不了,博客的力量总是有的,看着自己以前写的博客,现在也需要重新拾起来,当然所谓的公司有新的功能系统需要开发,也肯定早就完成了,为啥时间都过去将近这么久了才重新拾起,原因也是最近etwo显得有些颓废了。虽然博客写的不怎样,但是总会有些收获的,不是吗?坚持学习某样东西都要写好日志记录,加油!要充满正能量!

1、? 1、什么是函数

函数由函数名以及一组操作数类型唯一地表示。函数的操作数,也即形参,在一对圆括号中声明,形参与形参之间以逗号分隔。函数执行的运算在一个称为函数体的块语句中定义。每一个函数都有一个相关联的返回类型。

?

2、? 2、形参与实参的区别:

形参在函数定义的形参表中进行定义,是一个变量,其作用域为整个函数。而实参出现在函数调用中,是一个表达式。进行函数调用时,用传递给函数的实参对形参进行初始化。

3、? 3、一个code

// TestC++0824_001.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//返回x的y次幂
int power(int x, int y) {
	int result = 1;
	for (int i = 1; i <= y; ++i) {
		result *= x;
	}
	return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int xval, yval;

	cout << "Enter two integers(the second one should be equal to or bigger than 0)" << endl;

	cin >> xval >> yval;

	if (0 > yval) {
		cout << "The second integer must be equal to or bigger than 0" << endl;
	}

	cout << "Result of raising " << xval << " to the power of " << yval
		<< " is " << power(xval, yval) << endl;

	system("PAUSE");
	return 0;
}

?

?

?

指针形参:

函数的形参可以是指针,此时将复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。如果函数形参是非 const 类型的指针,则函数可通过指针实现赋值,修改指针所指向对象的值。

?

利用const 引用避免复制

?

数组形参

数组有两个特殊的性质,影响我们定义和使用作用在数组上的函数:

一是不能复制数组;

二是使用数组名字时,数组名会自动转化为指向其第一个元素的指针。因为数组不能复制,所以无法编写使用数组类型形参的函数。因为数组会被自动转化为指针,所以处理数组的函数通常通过操纵指向数组中的元素的指针来处理数组。

?

数组实参

和其他类型一样,数组形参可定义为引用或非引用类型。大部分情况下,数

组以普通的非引用类型传递,此时数组会悄悄地转换为指针。

?

Code

// TestC++0920_001.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//传递指向数组第一个和最后一个元素的下一位置的指针来计算数组和
int sum1(const int *begin, const int *end) {
	int sum = 0;
	while (begin != end) {
		sum += *begin++;
	}
	return sum;
}

//传递数组和大小来计算数组和
int sum2(const int ia[], size_t size) {
	int sum = 0;
	for (size_t ix = 0; ix != size; ++ix) {
		sum += ia[ix];
	}
	return sum;
}

//传递指向数组第一个元素的指针和数组大小来计算数组和
int sum3(int *begin, size_t size) {
	int sum = 0;
	int *p = begin;
	while (p != begin + size) {
		sum += *p++;
	}
	return sum;	
}

int _tmain(int argc, _TCHAR* argv[])
{
	int ia[] = {1, 2, 3, 4, 5};

	//三种不同方式计算数组元素
	cout << "Summation from sum1(): " << sum1(ia, ia + 4) << endl;
	cout << "Summation from sum2(): " << sum2(ia, 4) << endl;
	cout << "Summation from sum3(): " << sum3(ia, 4) << endl;

	system("PAUSE");
	return 0;
}

?

内联函数(函数避免函数调用的开销)

注意:调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作;调用前要先保存寄存器,并在返回时恢复;复制实参;程序还必须转向一个新位置执行。

?

一般来说,内联机制适用于优化小的、只有几行的而且经常被调用的函数。大多数的编译器都不支持递归函数的内联。一个 1200 行的函数也不太可能在调用点内联展开。内联函数应该在头文件中定义,这一点不同于其他函数。

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

?

Code

?

// inline version: find longer of two strings
inline const string &shorterString(const string &s1, const string &s2) {
	return s1.size() < s2.size() ? s1 : s2;
}

?

构造函数

构造函数是特殊的成员函数,与其他成员函数不同,构造函数和类同名,而且没有返回类型。而与其他成员函数相同的是,构造函数也有形参表(可能为空)和函数体。一个类可以有多个构造函数,每个构造函数必须有与其他构造函数不同数目或类型的形参。

重载函数

出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数

候选函数

函数重载确定的第一步是确定该调用所考虑的重载函数集合,该集合中的函数称为候选函数。候选函数是与被调函数同名的函数,并且在调用点上,它的声明可见

可行函数

指从候选函数中选出来的函数。必须满足两个条件:第一,函数的形参个数与该调用的实参个数相同;第二,每一个实参的类型必须与对应形参的类型匹配,或者可被隐式转换为对应的形参类型。

指向函数的指针

函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。

code

?

?

?

bool (*pf)(const string &, const string &);
//这个语句将 pf 声明为指向函数的指针,它所指向的函数带有两个 const //string& 类型的形参和 bool 类型的返回值。
//*pf 两侧的圆括号是必需的

?

上一篇: DataSet转化为实体集合类 下一篇: 没有下一篇了!
发表评论
用户名: 匿名