The first motivation for const seems to have been to eliminate the use of preprocessor #define for value substitution. It has since been put to use for pointers, function arguments, return types, class objects and member functions.        (Page 334)

1 Value substitution        (Page 334)

Because the preprocessor simply does text replacement and has no concept nor facility for type checking.

const in header files          (Page 335)

A const in C++ defaults to internal linkage; that is, it is visible only whthin the file where it is defined and cannot be seen at link time by other translation units. You must always assign a initial value to a const when you define it(but const member variable in class should not assign value when it is defined), except when you make an explicit declaration using extern.

Normally, the C++ compiler avoids creating storage for a const, but instead holds the definition in its symbol table. When you use extern with const, however, you force storage to be allocated(this is also true for certain other cases, such as taking the address of a const).

2 Safety consts          (Page 336)

If you initialize a variable with a value that is produced at runtime and you know it not change for the lifetime of that variable, it is good programming practice to make it a const so the compiler will give you an error message if you accidentally try to change it.

3 Differences with C         (Page 338)

In C, a const always occupies srotage and its name is global. The C compiler cannot treat a const as a compile-time constant.

In C, if you say

const int bufsize = 100;

char buf[bufsize];

you will get an error. But is OK in C++.

C defaults to external linkage for const and it always occupies srotage. So it can not contain in header file.

4 Const pointers          (Page 340)

When using const with pointers, you have two options: const can be applied to what the pointer is pointing to, or the const can be applied to the address stored in the pointer itself.

pointer to const

const int * u;      (normal)

int const * u;      (rare)

const pointer

int d = 1;

int * const u = &d;

assignment and type checking          (Page 343)

C++ is very particular about type checking, and this extends to pointer assignments. You can assign the address of a non-const object to a const pointer because you're simply promising not to change something that is OK to change. However, you cannot assign the address of a const object to a non-const pointer because then you are saying you might change the object via the pointer.

character array literals              (Page 343)

character array literals are actually constant character arrays. If you try to change the values in a chraacter array literal, the behavior is undefined.

char * cp = "howdy";

the compiler does not allocate storage for cp;

change what pointer cp points at is undifined. If you want to be able to modify the string, put it in an array:

char cp[] = "howdy";

the compiler has allocate storage for cp.

5 Function arguments & return values

6 Classes

const member variables, const class object, const member function

const member variables

Inside a class, const partially reverts to its meaning in C. It allocates storage within each object and represents a value that is initialized once and then cannot change. The use of const inside a class means "This is constant for the lifetime of the object". However, we may wish that each different object contain a different value for that constant.

Thus, when you create an ordinary (non-static) const inside a class, you cannot give it an initial value. This initialization must occur in the constructor initializer list.

for example,

class Fred{

  const int size;

public:

  Fred(int sz);

};

Fred::Fred(int sz):size(sz){}

void main()

{

  Fred a(1);

}

Compile-time constants in classes

static const variable means "there is only one instance, regardless of how many objects of the class are created," which is precisely what we need here: a member of a class which is constant, and which cannot change from one object of the class to another. Thus a static const of a built-in type can be treated as a compile-time constant.

you must provide the initializer at the point of definition of the static const. As a constract, all other data member in class must be initialized in the constructor or in other member functions.

const object & const member functions

A const member function cannot modify any member variables.

A const object is defined the same for  a user-defined type as a built-in type. And it can only call const member function.

for example,

class X{

  int i;

public:

  X(int ii);

  int f() const;

  int modify();

};

X::X(int ii):i(ii){};

X::f() const {return i;}      // the const member function can not modify data.

X::modify() { i++;}

void main()

{

  X x1(10);

  const X x2(20);

  x1.f();       // OK

  x2.f();       // OK

  x2.modify();    // error

}

Neither constructors nor destructors can be const member functions because they virtually always perform some modification on the object during initialization and cleanup.

6 volatile

it means "This data may change outside the knowledge of the compiler."

Constants in C++的更多相关文章

  1. some OpenGL constants

    some OpenGL constants This is from (https://github.com/peterderivaz/pyopengles/blob/master/gl2.py) G ...

  2. CLR via C# 3rd - 07 - Constants and Fields

    1. Constants        A constant is a symbol that has a never-changing value. When defining a constant ...

  3. JavaScript Patterns 5.7 Object Constants

    Principle Make variables shouldn't be changed stand out using all caps. Add constants as static prop ...

  4. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  5. Effective Java 30 Use Enums instead of int constants

    Enumerated type is a type whose legal values consist of a fixed set of constants, such as the season ...

  6. Task Scheduler Error and Success Constants (Windows)

    If an error occurs, the Task Scheduler APIs can return one of the following error codes as an HRESUL ...

  7. WM (Constants)

    Create page WM (Constants)   Summary WM_* Constants and their definitions or descriptions and what c ...

  8. 7.Constants and Fields

    1.Constants is a symbol that has a never-changing value.  its value must be determinable at compile ...

  9. TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. esriSRGeoCS3Type Constants

    ArcGIS Developer Help  (Geometry)     esriSRGeoCS3Type Constants More available geographic coordinat ...

随机推荐

  1. java.lang.RuntimeException: java.lang.ClassNotFoundException: cmd.CmdWordCount$MyMapper解决方法

    14/02/28 20:29:48 INFO mapred.JobClient: Task Id : attempt_201402281833_0004_m_000000_1, Status : FA ...

  2. POJ1226 - Substrings(KMP+二分)

    题目大意 给定n个字符串,字符串可逆序可顺序,求它们的最长公共子串 题解 在输入的过程中记录一下最短的那个字符串,然后枚举起点,然后进行二分求出子串末位置,然后再验证是否是公共子串,记录最长的公共子串 ...

  3. CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

    Download Bitnami Review Board Stack click here CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

  4. Java条形码生成方案及二维码要点

    1.什么是条形码及其应用 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的规则排列,用来表示一组信息的图形标识符.常见的条形码是由反射率相差很大的黑条和白条排成的平行线图案. 条形码可 ...

  5. 使用VisualSVN Server搭建SVN服务器(转载)

    转载于http://www.cnblogs.com/greywolf/archive/2013/01/28/2879952.html 使用 VisualSVN Server来实现主要的 SVN功能则要 ...

  6. linux命令之cat

    转自:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...

  7. C#编译器怎么检查代码是否会执行

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#编译器怎么检查代码是否会执行.

  8. [微信小程序] 终于可以愉快的使用 async/await 啦

    [小程序] 终于可以愉快的使用 async/await 啦 这篇文章主要是想说一下 怎么在微信小程序中使用async/await从而逃离回调地狱 背景 最近一直在搞微信小程序 用的语言是TypeScr ...

  9. HTTPResponse.read([amt]):只能read一次

    业务需要:我要写个tanx模拟器,给DSP发竞价请求. 下面是部分代码: def PostDataToDSP(self,url,postdata): headers = { 'Content-Type ...

  10. careercup-树与图 4.2

    4.2 给定有向图,设计一个算法,找出两个结点之间是否存在一条路径. 解答 根据题意,给定一个有向图和起点终点,判断从起点开始,是否存在一条路径可以到达终点. 考查的就是图的遍历,从起点开始遍历该图, ...