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++函数中的那些坑的更多相关文章
- php 使用函数中遇到的坑之----strpos
strpos — 查找字符串首次出现的位置 mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) <?ph ...
- php 使用函数中遇到的坑之----list
1. list 把数组中的值赋给一些变量 <?php $info = array('coffee', 'brown', 'caffeine'); // 列出所有变量 list($drink, $ ...
- python函数中把列表(list)当参数时的"入坑"与"出坑"
在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑!! 入坑 def f(x,li=[]): for i in range(x): li.append(i*i ...
- 在python函数中默认参数的一些坑
一.默认参数 python为了简化函数的调用,提供了默认参数机制: 这样在调用pow函数时,就可以省略最后一个参数不写: 在定义有默认参数的函数时,需要注意以下: 必选参数必须在前面,默认参数在后: ...
- Python之在函数中使用列表作为默认参数
本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使 ...
- 深入理解JS函数中this指针的指向
函数在执行时,会在函数体内部自动生成一个this指针.谁直接调用产生这个this指针的函数,this就指向谁. 怎么理解指向呢,我认为指向就是等于.例如直接在js中输入下面的等式: console.l ...
- python中的这些坑,早看早避免。
python中的这些坑,早看早避免. 说一说python中遇到的坑,躲坑看这一篇就够了 传递参数时候不要使用列表 def foo(num,age=[]): age.append(num) print( ...
- 移动端中遇到的坑(bug)!!!
1.模拟单选点击的时候,在ios手机下,点击下面的内容选择,会出现页面闪一闪!! 解决方案:样式重置html的时候加上这句 -webkit-tap-highlight-color: rgba(0, ...
- 总结微信小程序开发中遇到的坑
总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~ 1,页面跳转和参数传递实例 首先说一下我遇到的需求有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是 ...
随机推荐
- 20145226夏艺华 《Java程序设计》第9周学习总结
教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会使用标准注解 第16章 整合数据库 16.1 JDBC入门 (一)JDB ...
- 使GDAL库支持中文路径或中文文件名的处理方法
之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1. 在所有使用GDALAllRegist ...
- 通过java反射机制获取该类的所有属性类型、值
转自:http://blog.csdn.net/sd4000784/article/details/7448221 方法使用了这俩个包下的 field 和method import Java.lang ...
- django中的路由控制详解
一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...
- python的rtree包缺失libspatiaindex.so
1 准备autoconf工具 yum -y install autoconf automake libtool 2 准备g++编译器 yum -y install gcc gcc-c++ 3 下载并安 ...
- Maven学习(十五)-----Maven常用命令
一.Maven常用命令 1.1.Maven 参数 -D 传入属性参数 -P 使用pom中指定的配置 -e 显示maven运行出错的信息 -o 离线执行命令,即不去远程仓库更新包 -X 显示ma ...
- 理解学习Springboot(一)
Springboot有何优势呢,网上一大推,这里就不写了. 一.配置maven 1.在maven官网下载maven,http://maven.apache.org/download.cgi 2.将下载 ...
- 422. Length of Last Word【LintCode java】
Description Given a string s consists of upper/lower-case alphabets and empty space characters ' ', ...
- Dsniff简介
原文发表于:2010-09-25 转载至cu于:2012-07-21 前两天因为看局域网安全的视频中介绍dsniff,也想自己安装下来看看效果.简单的使用没什么难的(高级使用就需要研究文档了),但是安 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字
在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而 ...