读高质量C++/C编程指南第5章
Posted TangguTae
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读高质量C++/C编程指南第5章相关的知识,希望对你有一定的参考价值。
在此之前先讲一讲C++/C的内存分布
考虑32位的系统,总共的地址空间为2^32次方,即为4G大小,其中内核空间占用1G的大小,用户空间占用3G的大小。从低地址到高地址依次为代码段、数据段、堆、共享区、栈、内核空间。
其中代码段主要存放可执行代码、只读常量等;数据段存放全局数据、静态数据等;堆就是我们所熟知的动态内存开辟的空间就在堆上;栈存放非静态局部变量、函数参数、函数返回值等等;
注意:
代码段的地址不是从0x00000000开始的
堆的地址增长方向是向上增长的。
栈的地址增长方向是向下增长的。
共享区一般装载一个共享的动态内存库,用户可使用系统接口创建共享内存,用作进程间通信。
这一章讲的是常量,常量是一种标识符,它的值在运行期间恒定不变。常量放在内存中的代码段。C语言采用#define这种宏的方式来定义常量;而C++除了宏这种方式,还可以用const定义常量。
使用常量的好处:
1、程序的可读性强;例如要定义一个数组的大小,或者定义某个变量的边界值,直接写一个数并不直观,如果用常量可以取一个直观的名字。#define MAX 100或者const int MAX = 100; #define path "/home/user/bin"或者const char* path = "/home/user/bin";
2、便于批量修改;一旦要修改值的时候,可以避免重复的修改。
3、避免书写错误;在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
const与define的区别
1、const常量有数据类型,而宏常量没有数据类型。编译器可以对const类型的常量进行数据类型的安全检查。而define只进行了字符的替换,没有类型的安全检查。
2、const有调试信息,宏常量在预处理阶段已经被替换了,没有调试信息。
在类当中定义const类型的常量时,需要在定义的时候初始化。
因为类可以创建多个对象,不同对象其const数据成员的值可以不同。
class B
public:
B(int a, int ref)
:_n(10)//成员变量定义的地方,进行初始化
_x=10;//可以初始化列表初始化,也可以在函数类初始化
private:
const int _n; // const
int _x;
;
补充:
类当中需要采用初始化列表的方式初始化的情况总共有三种:
1、自定义类型成员(没有合适的构造函数的类)
2、引用成员变量
3、const类型的变量
//包含这三种需要初始化的情况 class A public: A(int a) :_a(a) private: int _a; ; class B public: B(int a, int ref) :_aobj(a) ,_ref(ref) ,_n(10)//成员变量定义的地方,进行初始化 _x=10;//不是这三种情况,可以初始化列表初始化,也可以在函数类初始化 private://这三个必须在初始化列表初始化 A _aobj; // 没有默认构造函数 int& _ref; // 引用 const int _n; // const int _x; //成员变量声明的地方 ;
以上是关于读高质量C++/C编程指南第5章的主要内容,如果未能解决你的问题,请参考以下文章