Effective C++ 学习笔记[2]
2. 第一节 习惯C++
2.1 C++是一个语言联邦,包括以下四个部分:
C:包括区块、语句、预处理器、内置数据类型、数组、指针等,但是C语言本身存在局限:没有模板template、没有异常exception、没有重载overloading…….
Object-oriented C++: 这部分主要就是C with classes.是面向对象设计的古典守则在C++上最直接实施。包括类(构造函数、析构函数)、封装、继承、多态、virtual虚函数等等。
Template C++: 这部分是C++泛型编程的部分。
STL:STL是一个template程序库。
2.2尽量以const、enum,inline 替换#define
本规则大致意思就是:宁可以编译器替换预处理器,因为#define不被视为语言的一部分,在预处理阶段就已经处理好了。例如:
#define ASPECT_RATIO 1.63
也许在编译器处理源码之前,ASPECT_RATIO 就已经被预处理器移走了,于是ASPECT_RATIO 名称可能没有进入记号表symbol table,于是当运用此常量但获得一个编译错误信息时,可能会带来困惑,因为这个错误信息提到的是1.63而不是ASPECT_RATIO ;而加入ASPECT_RATIO 被定义在一个非你所写的头文件内,你肯定对1.63以及它来自何处毫无概念,于是将会因为追踪他而浪费时间。
一个可行的代替方式是:
const double AspectRatio = 1.63;
作为一个语言常量,AspectRatio肯定会被编译器看到,当然就会进入记号表内部。
2.3 尽可能使用const
(1)关于const 在不同位置所代表的不同含义:

事实上这个概念都有只是三种声明方式非常相似:
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。
char * const cp; ( * 读成 pointer to ) cp is a const pointer to char
const char * p; p is a pointer to const char;
char const * p; 同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
C++标准规定,const关键字放在类型或变量名之前等价的。
const int n=5; //same as below
int const m=10
结论:
char * const cp : 定义一个指向字符的指针常数,即const指针
const char* p : 定义一个指向字符常数的指针
char const* p : 等同于const char* p
2.4 const修饰数组
//直接声明为 int a[], 这样会允许函数内部对a[] 进行修改
void showTheWorld( int a[], int sizeOfa) {
for ( int i = 0; i < sizeOfa; i++)
cout << a[i] << " ";
cout << endl;
}
如果 声明为const int a[], C++就不允许函数内部在对a[] ,进行修改了
void showTheWorld( const int a[], int sizeOfa)
{
cout << "The array contains the following values:\n";
for ( int i = 0; i < sizeOfa; a[i]++) // a[i]++ 会改变a[] l里面的每个项加1;因为声明了const int a[] ,这样编译器就会报错
cout << a[i] << " ";
cout << endl;
}
double computeAverage( int a[], int numberUsed); //声明一个参数 int a[] 不为const
void showDifference( const int a[], int numberUsed)
{
double average = computeAverage(a, numberUsed); //调用computeAverage,编译器会认为computeAverage会改变a[] 数组,这与showDifference参数矛盾,报错
for ( int index = 0; index < numberUsed; index++)
cout << a[index] << " differs from average by " << (a[index] – average) << endl;
}
//computeAverage 应该定义成
double computeAverage( const int a[], int numberUsed);
总结说明:
const char* g_str = "123456" 与 const char g_str[] = "123465"是不同的, 前面那个const 修饰的是g_str指向的内容是不能变化的,但是指针g_str本身并不是常量;但是const char g_str[] = "123465"表示g_str[]数组本身是const的。
在定义const的全局常量时,如果你像让char *g_str遵守const的全局常量的规则,最好这么定义const char* const g_str="123456",或者定义为const char g_str[] = "123465"。
Effective C++ 学习笔记[2]的更多相关文章
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor
Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- Effective STL 学习笔记:19 ~ 20
Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
随机推荐
- ThinkPHP自动获取关键词(调用第三方插件)
ThinkPHP自动获取关键词调用在线discuz词库 先按照下图路径放好插件 方法如下 /** * 自动获取关键词(调用第三方插件) * @return [type] [description] * ...
- bootshrap会改变IE浏览器滚动条样式
在某个小网站的开发中 客户一直抱怨在IE11中网页右边滚动条不一样 后来发现在IE11中,有2个页面滚动条会自动隐藏,一开始以为是浏览器默认行为,改了overflow:scroll后也没有用.仔细观察 ...
- 新浪微博的XSS漏洞攻击过程详解
今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建 党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉 ...
- HDU 4857 逃生 (优先队列+反向拓扑)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 解题报告:有n个点,有m个条件限制,限制是像这样的,输入a b,表示a必须排在b的前面,如果不 ...
- Nginx+tomcat负载均衡配置
Nginx+tomcat是目前主流的java web架构,如何让nginx+tomcat同时工作呢,也可以说如何使用nginx来反向代理tomcat后端均衡呢?直接安装配置如下: 1.JAVA JDK ...
- poj1328贪心 雷达,陆地,岛屿问题
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 60381 Accepted: 13 ...
- BZOJ 1004
一道奇怪的数学题.为了这道题我看了很多题解,到底还是一知半解..整个感觉就是上了一场数学课. HNOI2008 Cards 题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有 ...
- grep与egrep
当只有一个匹配条件时:egrep pattern file等价于grep -E pattern file 例如: 当多个匹配条件时,只能用egrep -e pattern1 -e pattern2 - ...
- Linux: xclip,pbcopy,xsel用法 terminal 复制粘帖 (mac , ubuntu)
ubuntu下的用户可以只用apt-get来安装: sudo apt-get install xclip echo "Hello, world" | xclip mac下使用pbc ...
- 开发Web Service的几种方式
本文作者在学习使用Java开发Web Service(不包括Restful)时,由于不知道Java有这么多框架支持开发Web Service一度陷入迷惘,不知道这些框架各有 什么不同,各有什么优缺点. ...