首页 > 代码库 > C++函数中的那些坑

C++函数中的那些坑

平时写程序时,我们可能或多或少对一些用法感到朦胧,下面我对一些易困惑大家,或者易用错的地方作点介绍。

一、函数的一些注意点

1.函数返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针。

2.如果一个函数永远不会被用到,那么可以只有声明没有定义。

3.C++中建议用引用类型的形参代替指针。

 

二、局部静态对象

使用static关键字可以令局部变量的生命周期贯穿函数调用及之后的时间。对象只在程序执行第一次经过对象定义语句时初始化,直到程序终止才被销毁。

举个例子——

size_t countNum(){	static size_t ctr = 0;	return ++ctr;}int main(){	for (size_t i = 0; i != 10; ++i)	{		cout << countNum() << endl;	}	return 0;}

程序输出数字1到10。

 

三、引用形参

如果使用传值的形参,那么拷贝大的类的对象或者容器对象时,效率比较低,或者某种类型可能不支持拷贝,那么只能通过引用形参访问该类的对象。

当函数无须修改引用形参的值时,最好使用常量引用,这是有原因的。

首先需要知道一个约定:一般来说,非常量可以转换成常量,反之则不行。

看下面这个例子——

int getWhitespaceNum(string &strWords){	int i = 0;	for (char s : strWords)	{		if (isspace(s))		{			i++;		}	}	return i;}

这个函数是用来获得一个字符串中有多少空白字符,函数体内并没有对该字符串有任何改动。

如果形参定义成普通的string &,那么参数不可以传字符串字面值,也不能传常量或者常量引用,带来很多的问题。

但如果把参数写成常量引用,这些问题将不复存在。

 

四、函数返回值

返回一个值时,返回的将是值的副本;

返回引用类型时,返回的是对象的引用,不会发生拷贝。

注意:不要返回局部对象的引用或指针!

const string &getName(){	string strName;	//以某种方式改变strName	if (!strName.empty())		return strName;	else		return "NoName";}

函数结束之后,临时对象的空间被释放,所以两个return语句都指向了不再可用的内存空间。

C++函数中的那些坑