• 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语句都指向了不再可用的内存空间。

  • 相关阅读:
    hashlib模块
    sys模块
    random模块
    time模块
    生成器、迭代器
    装饰器
    函数相关内容
    集合相关操作
    springcloud(四):Eureka的配置详解
    springcloud(二):Eureka服务注册与发现
  • 原文地址:https://www.cnblogs.com/hellovenus/p/cpp_function.html
Copyright © 2020-2023  润新知