Effective C++ 第二版 1)const和inline 2)iostream

 

条款1 尽量用const和inline而不用#define

>"尽量用编译器而不用预处理"
Ex. #define ASPECT_R 1.653    编译器永远不会看到ASPECT_R这个符号名, 在源码进入编译器之前, 就被预处理程序去掉, ASPECT_R 不会被加入到符号列表中; 编译报错时, 报错信息指向1.653, 让程序员无法跟踪错误;(这个问题也会出现在符号调试器中);

>Solution: 定义常量 const double ASPECT_R = 1.653; 常量定义一般是在头文件中, 许多源文件会包含它; [me: 如果只是局部使用的常量应该放在cpp中]
Note 定义指针常量时要注意, 除了指针所指的类型定义成const, 指针也经常要定义成const; Ex. const char* const kName = "Scott";

定义类的常量, 把常量限制在类中, 为了保证常量只有一份拷贝, 把它定义为静态成员:

1
2
3
4
5
6
class  GamePlayer {
private :
     static  const  int  NUM_TURNS = 5;  // constant declaration (老的编译器不接受静态成员声明时初始化)
     int  scores[NUM_TURNS];  // use of constant
...
};

Note 如果上面只是NU_TURNS的声明(没有 '= 5'), 必须在类实现代码中定义类的静态成员: const int GamePlayer::NUM_TURNS = 5; // mandatory definition; goes in class impl. file;

[文中可能是写反了, 头文件中有了 '= 5'就已经是定义了, 不需要在cpp中再定义;]

Note 类内只允许初始化整数类型的静态成员: int, bool, char...

Issue 必须在头文件中定义静态成员的情况: 当你的类需要用到这个类的常量时: e.g. GamePlayer::scores数组声明(编译时需要知道数组大小); [SIZE必须是静态常量或枚举数]

Solution 对于不支持头文件定义静态常量的编译器, 借用enum, 当需要int类型时可以使用枚举类型:

 

1
2
3
4
5
6
7
class  GamePlayer {
private :
     enum  { NUM_TURNS = 5 };  // "the enum hack" — makes
     // NUM_TURNS a symbolic name for 5
     int  scores[NUM_TURNS];  //fine
...
}

#define 指令实现看起来像函数的宏, 但是不会导致函数的调用;

#define max(a,b) ((a) > (b) ? (a) : (b)) 要保证每个参数加上括号, 即使这样还是会有预期外的情况:

1
2
3
int  a = 5, b = 0;
max(++a, b);  // a 的值增加了2 次
max(++a, b+10);  // a 的值只增加了1 次

>根据值来决定max的运行;

使用内联函数替代: inline int max(int a, int b) { return a > b ? a : b; }

使用模板来扩展int之外的类型:

1
2
3
template < class  T>
inline  const  T& max( const  T& a,  const  T& b)
return  a > b ? a : b; }

>模板产生一套函数, 每个函数比较两个可以转换成同种类型的对象, 返回大的;

Note 在使用模板写max之类的通用函数前, 先检查标准库中是否已经存在;

const和inline减少了预处理的使用, 但是#include还不能缺少, #ifdef/#ifndef 在控制编译的过程中也很重要;


条款2 尽量用<iostream>而不用<stdio.h>

scanf/printf 轻巧, 高效, 但不是类型安全的, 没有扩展性; 需要把读写的变量和控制读写格式的信息分开(FORTRAN style);

>>和<<, 实现重载函数可以处理不同的类型; 读写语法形式相同, 不需要记住格式规定;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int  i;Rational r;  //有理数
cin >> i >> r;
cout << i << r;
class  Rational {
public :
     Rational( int  numerator = 0,  int  denominator = 1);
...
private :
     int  n, d;  // 分子,分母
     friend  ostream& operator<<(ostream& s,  const  Rational& r);
};
ostream& operator<<(ostream& s,  const  Rational& r)
{
     s << r.n <<  '/'  << r.d;
     return  s;
}

>"opertaor<<"不是成员函数(是操作符);

相对不足:

1) 有些iostream的操作比起相应的C stream效率低; 

2) 标准化过程中, iostream库在底层做了很多修改, 对要求最大可移植性的程序来说, 不同的厂商遵循标准的程度不同;

3) iostream库的类有构造函数, <stdio.h>里的函数没有, 在某些涉及静态对象初始化顺序的时候, 如果可以确定没有隐患, 用标准C库更简单实用;

优点: iostream库的类和函数类型安全, 可扩展性好;

库的包含: <iostream>

#include <iostream.h> 得到的是置于全局空间的iostream库元素;

#include <iostream> 得到的是置于名字空间std下的iostream库元素;

全局空间获取元素可能导致名字冲突;


 

转载于:https://www.cnblogs.com/jiangu66/p/3196873.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP之MVC项目实战(二)

本文主要包括以下内容 GD库图片操作 利用GD库实现验证码 文件上传 缩略图 水印 GD库图片操作 <?php$img imagecreatetruecolor(500, 300); //var_dumP($img); // //分配绿色 $green imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result ima…

2019年机器学习:追踪人工智能发展之路

作者&#xff5c;Hussain Fakhruddin编译&#xff5c;专知整理&#xff5c;Yingying&#xff0c;李大囧摘要&#xff1a;“智能助理”的时代已经到来了。机器学习已经成为全球数字化转型的关键要素之一 ,在企业领域&#xff0c;机器学习用例的增长在过去几年中也是显著的。预计…

PHP之MVC项目实战(三)

本文主要包括以下内容 标准错误错误处理 http操作 PDO 文件操作 标准错误错误处理 PHP在语法层面上发生的错误 两个过程&#xff1a; 触发阶段&#xff08;发生一个错误&#xff09; 处理阶段&#xff08;如何处理该错误&#xff09; 触发阶段 系统触发&#xff0c;…

价值2950亿美元的「量子霸权」,技术水平到了哪个阶段

来源&#xff1a;36Kr摘要&#xff1a;谁掌握了量子计算机&#xff0c;谁就可能引领下一次信息革命。当前经典计算体系&#xff0c;并不能解决所有问题。量子计算将给现有的计算理论带来深刻变革&#xff0c;将极大加深人类对物质与信息的理解&#xff1b;将是一种前所未有的计…

微信开发简单实例

本文主要包括以下内容 1. 微信聊天机器人 微信聊天机器人 利用图灵机器人接口实现微信聊天机器人 <?phpdefine("TOKEN", "weixin"); $wechatObj new wechatCallbackapiTest(); if (isset($_GET[echostr])) {$wechatObj->valid(); }else{$wec…

开放政府数据价值:内涵、评价与实践

来源&#xff1a;《政府数据开放研究》作者&#xff1a;陈美 湖北工业大学经济与管理学院分析开放政府数据的价值与评价&#xff0c;有助于政府数据开放更高效地开展。文章在界定开放政府数据价值内涵与层次划分的基础上&#xff0c;介绍国外开放政府数据价值评价进展&#xff…

Smarty模板技术学习

模板引擎技术&#xff1a;使得php代码和html代码分离的技术就称为“模板引擎技术” 自定义smarty模板技术实现 <?php//迷你smarty原理 class MiniSmarty{public $var_arr array();public $template_dir "./view/";public $compile_dir "./view_c/"…

vc++深入详解学习-NO.3

c的多态性&#xff0c;基于虚函数的多态性技术&#xff0c;在成员函数的定义前面加上virtual关键字申明的函数叫做虚函数&#xff0c;当c编译器在编译的时候&#xff0c;发现类中的虚函数&#xff0c;这个时候c就好采用迟邦定技术&#xff0c;在运行期间依据对象的类型确定调用…

50大产业链全景图(高清完整版)

来源&#xff1a;新材料在线摘要&#xff1a;机器人、无人驾驶、VR、光伏、核电、半导体……50大产业链全景图&#xff0c;让你一次纵观全局。&#xfeff;&#xff08;点击图片查看大图&#xff09;—1—全国各省新材料产业链全景图—2—飞机产业链全景图—3—高铁产业链全景图…

3D打印,智能砖,竹子城市……改变未来建筑业的8项技术

来源&#xff1a;资本实验室科学技术正在彻底改现代生活的方方面面&#xff0c;并且每天都在不断进步&#xff0c;没有任何减速的迹象。绝大多数行业已经并且正在受到技术进步的影响&#xff0c;并越来越接近未来。对于建筑行业而言&#xff0c;以下8种新技术将改变未来建筑业的…

Smarty模板技术学习(二)

本文主要包括以下内容 公共文件引入与继承 内容捕捉 变量调剂器 缓存 Smarty过滤器 数据对象、注册对象 与已有项目结合 公共文件引入与继承 可以把许多模板页面都用到的公共页面放到单独文件里边&#xff0c;通过模板就可以直接调用&#xff0c;类似php里边通过include指令…

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础&#xff0c;最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取&#xff0c;Zookeeper 的安装非常简单&#xff0c;下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机…

AI“重造”麻省理工学院!今宣布投资10亿美元成立全新计算学院,近70年来最大结构调整...

来源&#xff1a;Deep Tech深科技摘要&#xff1a;近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息。近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息&#xff1a;投资 10 亿美元以引领计算机技术和人工智能技术的发展及全球影响…

经验分享:10个简单实用的 jQuery 代码片段

尽管各种 JavaScirpt 框架和库层出不穷&#xff0c;jQuery 仍然是 Web 前端开发中最常用的工具库。今天&#xff0c;向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段。 您可能感兴趣的相关文章精心挑选12款优秀 jQuery Ajax 分页插件分享60款绚丽的 jQuery 幻灯片…

PHP数据库操作

PHP实现数据库的增删改查 <?php $connmysql_connect(localhost,root,root); if(!$conn){ echo "connect failed"; exit; }$sqluse test; mysql_query($sql,$conn);//增加 $sql"insert into mytest values(null,pu,20)"; $rsmysql_query($sql,$conn);…

日本机器人实力大盘点,和Atlas的高调刷屏相比,日本机器人的默默崛起更让人忌惮...

来源&#xff1a;机器人大讲堂摘要&#xff1a;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连跳中无法自拔&#xff0c;刷屏的Atlas代表了美国对待科研的态度&#xff1a;我能所以全世界都得膜拜我&#xff01;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连…

Android高性能ORM数据库DBFlow入门

DBFlow&#xff0c;综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点。同时不是基于反射&#xff0c;所以性能也是非常高&#xff0c;效率紧跟greenDAO其后。基于注解&#xff0c;使用apt技术&#xff0c;在编译过程中生成操作类&#xff0c;使用方式和ActiveAndr…

不值钱的软件人才[转]

软件人才在中国不值钱&#xff0c;不但价格只比“一文不值”多一点&#xff0c;而且地位也就是一个普通劳动者&#xff0c;和高薪等挂不上钩。这里讲的是中国大陆地区&#xff0c;因为我不知道其他国家的情况&#xff0c;如无特殊声明&#xff0c;以下所有情况均只中国大陆的情…

科学:揭示自由意志的生物学本质

来源&#xff1a;中国科学报摘要&#xff1a;神经科学家开始精确定位大脑中参与自由意志感知的区域。“外星人肢体综合征”听起来也许并非那么像外星人的事&#xff0c;虽然它仍然很怪异。病人们抱怨说&#xff0c;他们的一只手变成了“流氓”&#xff0c;会在自己不知道的情况…

ThinkPHP入门

ThinkPHP项目的创建 <?php include "../../ThinkPHP/ThinkPHP.php"; 在index.php中导入ThinkPHP.php即可&#xff0c;会自动创建目录。 tp创建流程分析 1. 入口文件index.php2. ThinkPHP/ThinkPHP.phprequire THINK_PATH.Common/runtime.php;3. ThinkPHP/…