平时写程序时,我们可能或多或少对一些用法感到朦胧,下面我对一些易困惑大家,或者易用错的地方作点介绍。
一、函数的一些注意点
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语句都指向了不再可用的内存空间。