C++中 容易忽视的const 修饰符

C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点:

(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对const进行类型安全检查,而后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误!(如类型不匹配问题)

(2)编译器处理方式不同。define宏是在预处理阶段展开,const常量是编译运行阶段使用。

(3)存储方式不同。define宏仅仅是展开,有很多地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)。

使用const修饰符时需要注意以下几点:

(1)使用const修饰符定义常量时,必须初始化。

(2)常量一旦被定义,在程序中任何地方都不能再更改。

(3)const定义的常量可以有自己的数据类型,这样C++编译程序可以进行更加严格的类型检查。如果用const定义的是一个整型常量,int可以省略。

(4)函数参数可以用const说明,用于保证实参在该函数内部不被改动,大多数C++编译器能对具有const参数的函数进行更好的代码优化。

(5)函数返回值为const只用在函数返回为引用的情况。函数返回值引用常量表示不能将函数调用表达式作为左值使用。

(6)在类中,可以在类的成员函数定义后面加上const,表示这个函数是一个“只读函数”,函数不能改变类对象的状态,不能改变对象的成员变量的值。const成员函数也不能在函数中调用其他非const的函数。

const与指针一起使用时有三种情况:

(1)指向常量的指针,如const char *pc="abcd";它声明了指向常量的指针变量pc,不允许改变指针所指向的常量,但是由于pc是一个指向常量的普通指针变量,因此可以改变pc的值。

(2)常指针,如 char *const pc = "abcd"; 它声明了一个名为pc的指针变量,该指针是指向字符型数据的常指针,用“abcd”的地址初始化该常指针。该指针不能移动,但是它所指的数据可以改变。

(3)指向常量的常指针,如 const char * const pc ="abcd",声明了一个名为pc的指针变量,它是一个指向字符型常量的常指针,用“abcd”的地址初始化该指针,整个指针本身不能改变,它所指向的值也不能改变。

时间: 2024-08-04 19:46:40

C++中 容易忽视的const 修饰符的相关文章

新标准中set的迭代器it有const修饰符,如何去掉

新的C++11标准中,set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了.但是有时候遇到要修改stl set元素的问题,这个问题一般的解决方法是先erase这个元素,然后再insert.如果利用const_cast(*it)把it映射成一个引用的对象,那么就可以对它进行修改了.const_cast<node*>(&(*it))->b = 10;

Delphi 中 函数参数中的 const 修饰符的本质以及注意事项

来自:http://blog.csdn.net/farrellcn/article/details/9096787 ------------------------------------------------------------------------------ 很多书籍中说函数参数如果是String类型的,如果在函数内部不改变参数的值,使用 const 修饰符会加快程序的执行速度,至于如何加快的?有的人说是因为 const 函数保证了参数字符串不会被复制.以前也没有对这个问题深入研究

【C语言】函数参数中的const修饰符

  通常,字符串操作函数原型中,都会在形参前面加上const修饰符,表示此指针不能用于修改字符串的值   比如:char *strcpy(char *strDest, const char *strSrc)  但是可不可以通过 在函数里定义一个指针指向strSrc,来改掉字符串的值呢? 给出以下代码: #include <STDIO.H> #include<stdlib.h> void fuc(const char *p) { char *q = p; *q='b'; } int

[Reprint]C++函数前和函数后加const修饰符区别

c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostream> 02   03 using namespace std; 04   05 // Ahthor:  过往记忆 06 // E-mail:  [email protected] 07 // Blog:    http://www.iteblog.com 08 // 转载请注明出处 09   10

C++ 成员函数前和函数后加const修饰符区别

博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include<iostream> using namespace std; class TestClass { public: size_t length() const; const char* getPContent(); void setLengthValid(bool isLengthValid); pri

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

const修饰符简述

1.const限定符的使用 1)定义const常量:const可以将一个对象变成常量,不可被修改(只读类型),在定义时必须进行初始化.例如: const double mathPI = 3.141592653; 2)修饰函数的参数.返回值等.被const修饰的东西将不再改变: 3)若在整个程序中使用其他文件的变量: //若变量为非const //file_1.cpp int months = 10; //file_2.cpp extern int months; //const修饰的变量 //f

const修饰符使用

关键点:const 属于修饰符 ,修饰常量,const 修饰的位置很关键. const修饰指针和修饰变量存在差异 修饰变量 const是常量修饰关键字,被它修饰的**变量**在定义时赋值,之后不能对这个变量赋值,如果强制进行赋值会产生出错处理, int const a;与const int a; //无差别 const int a[5]={1,2,3,4,5}; a[0]=3;/*出错,对数组a[]中任意一个再次赋值都会出错*/ int a[5] //除了定义时赋值,再次对数组a[]中任何一个元

static extern const修饰符

const const修饰的东西不能被修改(由左至右解读-->顺时针螺旋法则) 指针类型根据位置的不同可以理解成3种情况: 1.常量指针 NSString * const pt1; //常量指针,指向一个字符串 //pt1初始化之后不能赋值,指向的对象值可以修改. //定义字符串常量 //NSString* const [email protected]"123"; @"123"存储在文字常量区,相同的字符串只存储一份 NSString* [email pro