默认实参,constexpr函数
2015-12-03 21:43
148 查看
我们使用string对象表示窗口内容时,希望窗口的高,宽等都有一个默认值。但同时允许这些参数自由指定与默认不同的值,此时可以定义成如下形式:
typedef string :: size_type sz;
string screen (sz ht = 24, sz wid = 80, char backgrnd = ' ' );
引用时,如果想使用默认值,则直接将screen函数置空,改变哪个值将哪个参数赋值。
例: screen(); 等价于screen(24, 80, ' ');
screen(66); 等价于screen(66, 80, ' ');
但是因为函数调用时是按照位置解析,所以应该合理设置形参的顺序,尽量让不怎么使用默认值的形参在前面。
sz wd = 80;
char def = ' ';
sz ht();
string screen (sz = ht(), sz = wd, char = def);
若此时调用函数改变一些实参:
例:void f2()
{
def = ' * '; //改变了默认实参的值
sz wd = 100; //未改变默认实参值,因为此处相当于重新定义的,跟外层的wd没关系
string window = screen (); 调用screen(ht(), 80, ' * ');
}
内联函数,在编译中展开,在函数返回类型前加上 inline 既可。
constexpr函数
指能用于常量表达式的函数,函数返回类型及所有形参类型都必须是字面值类型,且函数体有且只有一个return语句
允许constexpr函数的返回值并非一个常量:
constexpr size_t scale (size_t cnt)
{
return new_sz() * cnt;
}
调用时:
int arr[scale(2)]; //正确,scale(2)是常量表达式
int i = 2;
int arr[scale(i)]; //错误,不是常量表达式
常量表达式是指值不会改变并在编译过程就能得到计算结果的表达式。
int i = 3; 中,虽然i本身是一个常量,但其值直到运行时才能获得,但改为 const int i = 3;就是常量表达式了。
typedef string :: size_type sz;
string screen (sz ht = 24, sz wid = 80, char backgrnd = ' ' );
引用时,如果想使用默认值,则直接将screen函数置空,改变哪个值将哪个参数赋值。
例: screen(); 等价于screen(24, 80, ' ');
screen(66); 等价于screen(66, 80, ' ');
但是因为函数调用时是按照位置解析,所以应该合理设置形参的顺序,尽量让不怎么使用默认值的形参在前面。
sz wd = 80;
char def = ' ';
sz ht();
string screen (sz = ht(), sz = wd, char = def);
若此时调用函数改变一些实参:
例:void f2()
{
def = ' * '; //改变了默认实参的值
sz wd = 100; //未改变默认实参值,因为此处相当于重新定义的,跟外层的wd没关系
string window = screen (); 调用screen(ht(), 80, ' * ');
}
内联函数,在编译中展开,在函数返回类型前加上 inline 既可。
constexpr函数
指能用于常量表达式的函数,函数返回类型及所有形参类型都必须是字面值类型,且函数体有且只有一个return语句
允许constexpr函数的返回值并非一个常量:
constexpr size_t scale (size_t cnt)
{
return new_sz() * cnt;
}
调用时:
int arr[scale(2)]; //正确,scale(2)是常量表达式
int i = 2;
int arr[scale(i)]; //错误,不是常量表达式
常量表达式是指值不会改变并在编译过程就能得到计算结果的表达式。
int i = 3; 中,虽然i本身是一个常量,但其值直到运行时才能获得,但改为 const int i = 3;就是常量表达式了。
相关文章推荐
- iOS开发见闻-第9期
- Day2:12/03/2015继承(Derived)
- UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法
- AngularJS之页面跳转Route
- 使用SQL Server保存Session状态,实现单点登录
- Java Web中的中文编码问题(上)
- 十万个对不起实现,Java版
- 使用Java编写并运行Spark应用程序
- Android设置特定时间执行操作
- 《TCP/IP详解 卷1:协议》读书笔记 第八章 Traceroute程序
- Hibernate validation 的使用. Bean 自动校验
- Decaf-platform安装篇
- 如何比较好的编写一个包含业务逻辑的方法体
- FormsAuthentication.SetAuthCookie
- CCNP学习笔记4-路由部分--路由控制
- 阿里云, mysql相关
- 【2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div 1)G】【坐标轴变换 LIS】Racing Gems 开车吃宝石,横向速度不能超
- 栈的链式实现
- BugPhobia准备篇章:Beta阶段前后端接口文档
- java编程思想(读书笔记):5.隐藏实现细目