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]的更多相关文章

  1. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  2. 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 ...

  3. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  4. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  7. 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 ...

  8. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  9. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  10. Effective STL 学习笔记:19 ~ 20

    Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

随机推荐

  1. JavaScript简易缩放程序

    一.前言: 上一篇随笔中已经把拖动程序完成了,这篇主要把缩放程序完成,后面合并后可以做成一个图片裁剪的功能 简易缩放程序DEMO:http://jsfiddle.net/UN99R/ 限制缩放程序DE ...

  2. 2000多万个微信号被封全面禁止"集赞" 微信雷霆行动这次玩真的

    微信雷霆行动自年初启动了打击网络黑色产业链以来,微信累计封停了2000万个招嫖账号,3万个假货公众账号,切实保护用户利益.你曾经中过招吗?Yes or No?说说你的看法吧. 同时,微信从9日起开始升 ...

  3. [Effective JavaScript 笔记] 第12条:理解变量声明提升

    js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一 ...

  4. [Effective JavaScript 笔记]第37条:认识到this变量的隐式绑定问题

    CSVReader示例 需求 CSV(逗号分隔型取值)文件格式是一种表格数据的简单文本表示 张三,1982,北京,中国 小森,1982,东京,日本 吉姆,1958,纽约,美国 现需要编写一个简单的.可 ...

  5. Struts2配置文件模板

    <?xml version = "1.0" encoding = "UTF-8"?><!--下面是Struts2配置文件的DTD信息 --&g ...

  6. Ubuntu 16.04 安装 VMware-Workstation-12

    以前一直使用 Ubuntu + Virtaulbox ,最近测试了 VMware-Workstation-9,性能超过 Virtaulbox-4.2.x,下面是详细步骤: 1 首先准备一个Ubuntu ...

  7. NYOJ 106背包问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=106 背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现 ...

  8. 数据结构与算法实验题7.1 M 商人的求救

    问题描述:A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去.M 先生说:“为了安全起见,我们的路线最多只能包 ...

  9. PHP很有用的一个函数ignore_user_abort ()

    PHP很有用的一个函数ignore_user_abort () 2013-01-16 14:21:31|  分类: PHP |  标签:php  函数  |举报|字号 订阅     ignore_us ...

  10. devstack重启后不能运行

    devstack 重启后没有运行服务. 解释: “Note if you reboot your machine running devstack, you need to rerun stack.s ...