【C++学习】 之 const专题讲座
2015-09-14 22:52
281 查看
前言:上课和书中对const的介绍仅仅局限于定义常量,而没有深入讲解const,本博客将用简短的语言小谈const,希望能让新人尽早入门c++。
1、2
其实是一回事,这个好理解
3 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改),也就是说c = &a 是可以的,但是*c = 100是不行的
4
d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
5 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
小结:看const后面是什么,带*说明指向的内容不能修改,*在const前面就是指针不能改。
C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址
分配内存
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
C++中的const常量在与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器(CPP)处理,单纯的文本替换
②要直接初始化,否则将无法初始化
当然不可以!请看4.1,具体原因请看const深入
static 表示的是静态的。类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么
例如 例子4-3-1 中,class A a1 ,a2,a3中的const可以是不一样的。
如果想用常量,请使用枚举类型。ennum{a = 100}; //this is ok!
这样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。因为const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初始化,这意味着过一会儿才给const初始化。当然,无法防止在在构造函数主体的不同地方改变const的值。
1 const的位置?
const int a;<span style="white-space:pre"> </span>//1 int const b;<span style="white-space:pre"> </span>//2 const int *c;<span style="white-space:pre"> </span>//3 int * const d;<span style="white-space:pre"> </span>//4<span style="white-space:pre"> </span> const int * const e ;<span style="white-space:pre"> </span>//5
1、2
其实是一回事,这个好理解
3 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改),也就是说c = &a 是可以的,但是*c = 100是不行的
4
d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
5 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
小结:看const后面是什么,带*说明指向的内容不能修改,*在const前面就是指针不能改。
2 C语言有const吗?
有!C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址
分配内存
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
C++中的const常量在与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器(CPP)处理,单纯的文本替换
3 const的注意事项
const 限定符定义常量时 ①常量名一般全用大写,便于与变量区分;②要直接初始化,否则将无法初始化
4 const与类
4.1 类成员变量的属性如果有const变量,只能用初始化成员列表的方法进行初始化!
原因是:在调用构造函数的时候,对象在构造函数括号里的语句执行之前就被创建了,而const必须初始化,所以通过构造函数的参数给const“初始化”(其实是赋值)已经不行了,要让它在创建之前也就是括号之前初始化,这就引入了初始化成员列表。(后面会讲到)。4.2 const在类成员函数的最后
例如 int get_a() const; 这就规定了调用这个函数不能修改类的任何属性,这个在程序开发中是很重要的。4.3 可以在类定义的时候对const进行初始化吗?
例 4.3-1class A { public const a = 10; };
当然不可以!请看4.1,具体原因请看const深入
5 更深一步探讨const
const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间。static 表示的是静态的。类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么
例如 例子4-3-1 中,class A a1 ,a2,a3中的const可以是不一样的。
如果想用常量,请使用枚举类型。ennum{a = 100}; //this is ok!
class foo { private: const int i = 100; // error !!! public: foo(){} ...... };
这样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。因为const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初始化,这意味着过一会儿才给const初始化。当然,无法防止在在构造函数主体的不同地方改变const的值。
相关文章推荐
- OC语言基本语法
- C++反射
- effective c++ 别让异常逃离析构函数
- C++的STL进一步总结之set
- C++的STL进一步总结之map
- C++的STL进一步总结之pair
- OC语言中的类和对象
- c语言条件表达式
- 第2周项目3 体验复杂度(2)汉诺塔
- C++的STL进一步总结之lower_bound和upper_bound
- c语言'/0'
- C++ Primer学习总结_1_开始(续)
- Effective C++读书笔记(二)
- C/C++基础笔试题1.1.2(十问解决方案运营商)
- c++深拷贝与浅拷贝
- C++ Primer Plus(第六版)--学习杂记(第一第二章)
- c++ primer 5th:无符号数的转换
- 各种排序算法源码(c++)20150913
- C++
- c++ 互相引用导致无限循环引用的报错