c++ --> const关键字总结
| 
 No.  | 
 作用  | 
 说明  | 
 参考代码  | 
| 
 1  | 
 可以定义const常量  | 
 
  | 
 const int Max = 100;  | 
| 
 2  | 
 便于进行类型检查  | 
 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误  | 
 void f(const int i) { .........}  | 
| 
 3  | 
 可以保护被修饰的东西  | 
 防止意外的修改,增强程序的健壮性。  | 
 void f(const int i) { i=10;//error! }  | 
| 
 4  | 
 可以很方便地进行参数的调整和修改  | 
 同宏定义一样,可以做到不变则已,一变都变  | 
 
  | 
| 
 5  | 
 为函数重载提供了一个参考  | 
 
  | 
 class A  | 
| 
 6  | 
 可以节省空间,避免不必要的内存分配  | 
 const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝  | 
 #define PI 3.14159         //常量宏  | 
| 
 7  | 
 提高了效率  | 
 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高  | 
 
  | 
TYPE const ValueName = value;
const TYPE ValueName = value;
-->将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义。
extend const int ValueName = value;
int a=,b=;
int *const p1=&a;
int *const p2; //不允许,必须对其初始化
p2=&b; //不允许,p2是常量不允许作为左值
*p1=; //允许修改指针*p1的值
int a=,b=;
const int *p; //声明常量指针p
p=&a; //p指向a
p=&b; //修改指针p让其指向b,允许
*p=; //不允许
-->两者都不可变
const char* const pContent;
void function(const int Var);
-->参数指针所指内容为常量不可变:
void function(const char* Var);
-->参数指针本身为常量不可变(也无意义,因为char* Var也是形参):
void function(char* const Var);
-->参数为引用,为了增加效率同时防止修改。修饰引用参数时:
void function(const Class& Var); //引用参数在函数内不可以改变 void function(const TYPE& Var); //引用参数在函数内为常量不可变
这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性, 且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙。
(2)const 修饰函数返回值
const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。
a.const int fun1() //这个其实无意义,因为参数返回本身就是赋值。
b. const int * fun2() //调用时 const int *pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针内容不可变。
c.int* const fun3() //调用时 int * const pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针本身不可变。
class A
{
…
const int nValue; //成员常量不能被修改
…
A(int x): nValue(x) { } ; //只能在初始化列表中赋值
}
class A
{
…
void function()const; //常成员函数, 它不改变对象的成员变量. //也不能调用类中任何非const成员函数。
}
class AAA
{
void func1();
void func2() const;
}
const AAA aObj;
aObj.func1(); //×
aObj.func2(); //正确 const AAA* aObj = new AAA();
aObj-> func1(); //×
aObj-> func2(); //正确
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
- 常量指针被转化成非常量指针,并且仍然指向原来的对象;
 - 常量引用被转换成非常量引用,并且仍然指向原来的对象;
 - 常量对象被转换成非常量对象。
 
- 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
 - 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
 - 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
 - const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
 - 不要轻易的将函数的返回值类型定为const;
 - 除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
 - 任何不会修改数据成员的函数都应该声明为const 类型。
 
const int n=5;
int a[n];
#include<iostream>
using namespace std; int main(void)
{
const int a=3;
int* pa=&a;
*pa=4;
printf("%d\n",*pa);
printf("%d\n",a);
return 0;
} 编译结果:
e:\c++\acm\lianxi.cpp(7) : error C2440: 'initializing' : cannot convert from 'const int *' to 'int *'
class A {
public:
    A() {}
private:
    static const int i;   //注意必须是静态的!
};
const int A::i=;
另一个很常见的方法就是初始化列表:
class A {
public:
    A(int i=):test(i) {}
private:
    const int i;
}; 
c++ --> const关键字总结的更多相关文章
- PHP的final关键字、static关键字、const关键字
		
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
 - C++中const关键字的使用总结
		
C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数. 变量:const可以修饰普通变量.指针(数组)和结构体. 1.const修饰普通变量是最简单的情形.这样的用法多为在程序中 ...
 - final关键字+const关键字
		
final关键字 1.如果我们希望某个类不被其它的类来继承(可能因为安全考虑),可以使用final. 例题 <? final class A{} class B extends A{};//会报 ...
 - C++学习11 类和new、delete操作符  类与const关键字
		
如果你是Java.C#.PHP程序员,那么会对 new 非常熟悉,在这些编程语言中,只能通过 new 来创建对象. 在C++中,你可以像定义变量一样来创建对象,如: Student stu; //对象 ...
 - C++中的const关键字
		
http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...
 - 陈正冲老师讲c语言之const关键字
		
1.const 关键字也许该被替换为 readolny const是constant的缩写,是恒定不变的意思,也翻译为常量.常数等.很不幸,正是因为这一点,很多人都认为被const修饰的值是常量.这是 ...
 - C语言之头文件,static与const关键字
		
[前言] 最近几个月在做一个C语言代码重构的项目,过程中也让我对之前在书本上学习到的东西有些补充和巩固,在本博中总结记录下,梳理下零碎的知识点和经验也加深印象,书写是为了更好地思考.平时也都是用印象笔 ...
 - static和const关键字的作用
		
static关键字至少有下列n个作用: (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)在模块内的stat ...
 - const关键字详解
		
const在函数前与函数后的区别 一 const基础 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况: int b = 500; ...
 - C++ const关键字用法详解
		
1const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目. 事实上这个概念谁都有只是三种声明方式非常相似很容易记混. Bjarne在他的T ...
 
随机推荐
- 一个URL的组成
			
URL的组成 URL由三部分组成:协议类型,主机名和路径及文件名.通过URL可以指定的主要有以下几种:http.ftp.gopher.telnet.file等. URL的组成 URL的组成 协议 ...
 - php xml DOM编码
			
PHP XML文件编程 一.PHP DOM编程 <?php //1.创建dom对象 $xmldoc=new DOMDocument(); //2.加载xml(指定对哪个xml文件进行操作) $x ...
 - (十二)java嵌套类和内部类
			
嵌套类和内部类:在一个类里边定义的类叫做嵌套类,其中没有static修饰的嵌套类是我们通常说的内部类,而被static修饰的嵌套类不常用.有的地方没有嵌套类和内部类的区分,直接是嵌套类就称作内部类,没 ...
 - eclipse中的System.getProperty("user.dir")
			
eclipse中的System.getProperty("user.dir") 1.在Java Application中,上述中的获取的是Java项目的路径 (1)运行源码 /** ...
 - CF374 Maxim and Array
			
贪心 如果有0先变成非0 如果负数的个数 应该变为偶数 之后就是每次将绝对值最小的值加K #include<bits/stdc++.h> using namespace std; cons ...
 - toggle的用法(点击更换不同的function)当指定元素被点击时,在两个或多个函数之间轮流切换。
			
一,用法 <html> <head> <script type="text/javascript" src="/jquery/jquery. ...
 - C#图解教程 第二十一章 命名空间和程序集
			
命名空间和程序集 引用其他程序集 mscorlib库 命名空间 命名空间名称命名空间的补充命名空间跨文件伸展嵌套命名空间 using 指令 using命名空间指令using别名指令程序集的结构 程序集 ...
 - 【BZOJ3223】文艺平衡树(Splay)
			
题面 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
 - [HNOI2013]消毒
			
题目大意: 网址:https://www.luogu.org/problemnew/show/3231 大意:a×b×c的三维空间里有a×b×c个点(x,y,z),其中有些点需要被消除. 消除的方法为 ...
 - Java数组的操作方法
			
在JDKAPI中,我们可以看到java.util.Arrays类.因为是在util工具包下.所以,方法都是静态的 看看里面有哪些方法是我们平时工作中会使用到的(以 int[] 举例)? 1)binar ...