C++ Primer Plus 第七章知识点总结

1、函数基本知识

声明函数:返回值类型 函数名 参数列表

函数定义:函数体

函数使用:在main函数中调用函数

2、函数原型与函数参数与按值传递

在函数原型中的定义,其实并不要求参数名,只需要有数据类型就行。

C++通常按值传递,将数值参数传递给函数,而函数会将其赋给一个新的变量。

用于接受传递参数的变量称为形参、传递给函数的值称为实参。C++中将形参称之为参量,实参称之为参数,按值传递的过程就是参量赋值给参数。

3.函数与数组

//定义一个函数
int arra(int array[],int num);

在上述语句中,array实际上代表的并不是一个数组,而是一个指针,该指针就指向改数组的第一个位置。

实际上上述语句是正确的,但是在C++中将数组名认定为是指针,因此在函数中实际上参数列表传递的是指针类型,而不是int类型。

//数组名实际上是一个地址
int arra(int* array,int num);

函数中的参数列表,两者都是正确的,都需要记住并理解。传递的之所以不是数组,而是数组的地址,就是为了节省复制数组的资源。

const保护数组

为了保护数组的内容不被函数所修改,可以在数组前加上const 是数组成为常量。

对于普通参数而言,我们的C++编译器在工作时,调用函数时,函数内会自动生成一个对应的副本,在函数体内的操作其实都是对该副本进行操作,而不是函数外的变量。但是,由于若是参数列表中的参数是数组名,那么实际上函数内部的操作实际上就是在对原体进行操作,很容易误操作数组,对其造成数据错误。

//在num_size中array数组是被当作常量,函数中是无法对其进行修改的。
int num_size(const int array[],int size);

但是在num_size函数外部,array数组并不是常量,只是在num_size内部是常量。

4、const与指针

const可以用两种不同的方式来修饰指针。

第一种:让指针指向一个常量对象,这样可以防止使用该指针来修改指针所指向的值。

第二种:将指针本身声明为常量,这样可以防止改变指针所指向的值。

//先声明一个指向常量的指针
int age = 33;
const int *pt = &age;

在上述语句中pt指向的是一个const int 即 常量,因此并不能用pt来修改age的值, 换句话来说*pt的值是一个常量。

但是pt的声明就并不意味着 age是一个常量,而是说: 对于 pt 而言 ,age是一个常量。

我们可以直接使用age变量来修改age的值,但是不能使用pt指针来修改age的值。

注意:C++禁止将const的地址赋给非const指针。

5、函数与C风格字符串

假设要将字符串作为参数传递给函数,则表示字符串的方式有三种。

1:char数组

2:用括号引起来的字符串常量

3:被设置为字符串的char指针

函数与结构

结构名就像普通变量一样,在使用函数时使用的是函数中所创建的结构的副本,结构名就只是结构的名称,如果要获得结构名的地址就必须使用地址运算符&。

另一个函数示例:将定义两个结构,来表示两种不同的描述位置的方法,然后再开发一个函数,将一个结构格式改为另一种结构格式。并显示结构

#include<iostream>
#include <cmath> 
using namespace std;
struct polar{
	double distance;
	double angle;
}; 

struct rect{
	double x;
	double y;
};

polar rect_to_polar(rect xypos);
void show_polar(polar dapos);

int main()
{
	rect rplace;
	polar pplace;
	
	cout << "Enter the x and y Values:";
	while (cin >> rplace.x >> rplace.y){
		pplace = rect_to_polar(rplace);
		show_polar(pplace);
		cout << "Next two numbers (q to quit)";
	}
	cout << "Done.\n";
	return 0;
}

polar rect_to_polar(rect xypos){
	polar answer;
	answer.distance = sqrt( xypos.x * xypos.x + xypos.y * xypos.y);
	answer.angle = atan2(xypos.y,xypos.x);
	return answer;
}

void show_polar(polar dapos){
	const double Rad_to_deg = 57.29577951;
	cout << "distance = " << dapos.distance;
	cout << ",angle = " << dapos.angle * Rad_to_deg;
	cout << "degree\n";
}

6、函数与array对象

#include<iostream>
#include<array>
using namespace std;
int main(){
    array<double,4> expensive;
    show(expensive,2);
    show(&expensive,2); 
}

其中show是一个函数,前一个函数采用的是按值传递,在函数中的是arrar对象的副本。

而后一个函数传递的是array对象地址,函数中的操作是对对象本体。

7、函数指针

   1、获取函数地址

获取函数的地址,函数的地址就是它的函数名,举例来说:think()是一个函数,那么think就是它的函数名,就是它的地址。要将函数作为参数传递,必须要传递函数名,一定要区分传递的是函数名还是函数的返回值。

show( think ); //传递的是函数名,就是函数地址
show( think());//传递的是函数的返回值

2 、声明函数指针

double pam(int);  //正常的函数声明
double (*pf) (int);//其中(*pf)就是函数指针
pf = pam;//在声明后,将函数名赋给它

3、使用指针来调用函数

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值