【c++ primer, 5e】特殊用途语言特性
【默认实参】
1、注意点:函数的默认实参可以在函数的声明中添加,但是后续声明只能添加默认参数而不能改变先前声明的默认参数。(函数的声明通常是定义在头文件上的,多次声明同一个函数是合法的)
2、默认实参必须为全局变量,但是允许在局部改变这些变量的值,如果在局部重新声明将作为默认实参的变量,将不会有任何影响。
练习
6.40
b 顺序错误,默认参数应该在位置参数的右边。
6.41
a 非法,没有给第一个位置参数赋值。
c 合法但是背离初衷,原因是'*'会作为整型数赋值给参数wd而不是参数bckgrnd。
6.42
#include <iostream>
#include <string>
using namespace std;
string make_plural(size_t ctr, const string &word, const string &ending = "s")
{
return (ctr > ) ? word + ending : word;
}
int main()
{
string word1 = "success";
string word2 = "failure";
cout << make_plural(, word1) << '\n' << make_plural(, word1, "es") << endl;
cout << make_plural(, word2) << '\n' << make_plural(, word2) << endl;
return ;
}
【内联函数和constexpr函数】
1、为什么使用内联函数?避免函数调用的开销,在编译时在调用点内联的展开。
2、注意点:内联函数通常声明连同定义在头文件内!
3、为什么使用constexpr函数?用作常量表达式。(常量表达式可以用于数组的初始化、常量初始化等)
4、constexpr函数的特点:被隐式声明为内联函数,在编译时其调用就被替换为对应结果值。
练习
6.43
a 放在.h文件中
b.放在.cpp文件中
6.44
inline bool
isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
6.45
略
6.46
不能。不能保证isShorter的实参是常量表达式。
【调试帮助】
1、预处理器定义的5个很有用的名字。p216
2、NDEBUG的用法。
假如有一段这样的代码:
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
int main()
{
#ifndef NDEBUG
cout << __func__ << endl;
cout << __FILE__ << endl;
cout << __LINE__ << endl;
cout << __TIME__ << endl;
cout << __DATE__ << endl;#endif
return ;
}
默认状态下编译运行:
$ g++ prog1.cpp -std=c++ -o prog1 $ prog1
main
prog1.cpp ::
Apr
关闭DEBUG模式编译运行:
$ g++ -D NDEBUG prog1.cpp -std=c++ -o prog1 $ prog1
# 输出为空!
3、assert。
assert 英[əˈsɜ:t]
美[əˈsɜ:rt]
vt. 声称,断言
例如:
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
int main()
{
cout << "hi" << endl;
assert();
cout << "my name is" << endl;
assert();
cout << "xkfx" << endl;
return ;
}
输出:
$
hi
my name is
Assertion failed: , file prog1.cpp, line This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
练习
6.47
#include <iostream>
#include <vector>
using namespace std;
void vectorPrinter(vector<int>::iterator beg, vector<int>::iterator end)
{
if (beg != end) {
cout << *beg << endl;
vectorPrinter(beg+, end);
return;
} else
return;
}
int main()
{
vector<int> ivec = {, , , , };
#ifndef NDEBUG
cout << "size=" << ivec.size() << endl;
#endif
vectorPrinter(begin(ivec), end(ivec));
return ;
}
关闭调试模式只需要在编译时加上-D NDEBUG就可以了。
6.48
string s;
while (cin >> s && s != ".") {} // 不断读入字符串,直到碰到一个要找的字符串就终止(这里用"."替代)。
assert(cin); // cin是一个对象,单独出现在条件语句的时候结果值为1。所以assert什么也不做。
【c++ primer, 5e】特殊用途语言特性的更多相关文章
- 特殊用途语言特性——默认参数、内联函数和constexptr函数
1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 我们可 ...
- 特殊用途语言特性(默认实参/内联函数/constexpr函数/assert预处理宏/NDEBUG预处理变量)
默认实参: 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 需要特别 ...
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- Pro ASP.NET MVC –第四章 语言特性精华
C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...
- 浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- XAML 名称范围 (x:) 语言特性
本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息. 本部分内容 主题 描述 x:Class 属性 配置 XAML 编译,在标记和代码隐藏之间连接分部类.代码分部类在一个独立的代码 ...
- C++ 语言特性的性能分析
转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html 大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...
- C# 动态语言特性,dynamic 关键字研究
1 动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...
随机推荐
- [转]改变UITextField placeHolder颜色、字体
本文转载至 http://m.blog.csdn.net/blog/a394318511/8025170 我们有时需要定制化UITextField对象的风格,可以添加许多不同的重写方法,来改变文本字段 ...
- 更改hadoop native库文件后datanode故障
hadoop是用cloudra的官方yum源安装的,服务器是CentOS6.3 64位操作系统,自己写的mapreduce执行的时候hadoop会提示以下错误: WARN util.NativeCod ...
- pure
Pure也是一款很出色的CSS框架,之前分享的Bootstrap是由Twitter出品的,而Pure是来自雅虎的.尽管从UI界面效果上来说,Pure没有Bootstrap那样精美,但Pure是纯CSS ...
- kafka服务器搭建与测试
kafka服务器搭建 kafka自身集群信息的管理以及对producer和consumer的信息管理是通过zookeeper实现的,zookeepr是kafka不可分割的一部分,所以搭建zookeep ...
- js i++ 与 ++i 的区别
转载:http://blog.csdn.net/hjb2722404/article/details/50423804 在javascript中,我们常常搞不懂i++与++i的区别,今天我们就来简单说 ...
- TCL电视直播软件
升级你的电视系统我的型号46寸 V7300 3D,具体的升级程序在"技术宅"里有下载 找个格式化过的U盘把你的程序拷贝进去,插在电视上,电视会自动升级 当你成功安装V8-0MT32 ...
- 用Python构建你自己的推荐系统
用Python构建你自己的推荐系统 现如今,网站用推荐系统为你提供个性化的体验,告诉你买啥,吃啥甚至你应该和谁交朋友.尽管每个人口味不同,但大体都适用这个套路.人们倾向于喜欢那些与自己喜欢的其他东西相 ...
- 剪花布条---hdu2087(kmp模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...
- golang官方实现如何对httpserver做频率限制(最大连接数限制)
一般海量处理服务,都会对服务做个最大连接数限制,超过该限制之后,拒绝服务,避免发生雪崩,压坏服务. 使用golang来编写httpserver时,如何进行呢?官方已经有实现好的包. 使用示例: imp ...
- Secure Sockets Layer(安全套接层)
SSL SSL(Secure Sockets Layer安全套接层)及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议.TL ...