原创博文,转载请标明出处--周学伟 http://www.cnblogs.com/zxouxuewei/

const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

1. 修饰常量

用const修饰的变量是不可变的,以下两种定义形式在本质上是一样的:

const int a = 10;
int const a = 10;

2. 修饰指针

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
因此,推荐使用int const* p,而不是使用const int* p(虽然两者意义完全一样),这样更容易理解。

int a = 10;
const int* p = &a; // 指针指向的内容不能变
int const* p = &a; // 同上
int* const p = &a; // 指针本身不能变
const int* const p = &a; // 两者都不能变
int const* const p = &a; // 同上

3. 修饰引用

以下两种定义形式在本质上是一样的:

int a = 10;
const int& b = a;
int const& b = a;

4. 修饰函数参数

用const修饰函数参数,传递过来的参数在函数内不可以改变。

void func (const int& n)
{
n = 10; // 编译错误
}

5. 修饰函数返回值

用const修饰函数返回值的含义和用const修饰普通变量以及指针的含义基本相同。

const int* func()   // 返回的指针所指向的内容不能修改
{
// return p;
}

6. 修饰类成员变量

用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。

class A
{
public:
A(int x) : a(x) // 正确
{
//a = x; // 错误
}
private:
const int a;
};

7. 修饰类成员函数

用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数。

class A
{
public:
int& getValue() const
{
// a = 10; // 错误
return a;
} private:
int a; // 非const成员变量
};

8. 修饰类对象

用const修饰的类对象,该对象内的任何成员变量都不能被修改。
因此不能调用该对象的任何非const成员函数,因为对非const成员函数的调用会有修改成员变量的企图。

class A
{
public:
void funcA() {}
void funcB() const {}
}; int main
{
const A a;
a.funcB(); // 可以
a.funcA(); // 错误 const A* b = new A();
b->funcB(); // 可以
b->funcA(); // 错误
}

9. 在类内重载成员函数

class A
{
public:
void func() {}
void func() const {} // 重载
};

10. const与宏定义的区别

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
另外,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

#define PI 3.1415926535
const double PI = 3.1415926535;

11. const_cast

const_cast运算符用来修改类型的const或volatile属性。
一、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
二、常量引用被转换成非常量的引用,并且仍然指向原来的对象。

void func()
{
const int a = ;
int* p = const_cast<int*> (&a);
*p = ;
std::cout<<*p; //
std::cout<<a; // 10, 原因见第10部分
}

例程如下:

#include <iostream>
#include <cstring> using namespace std; class kstruction
{
public:
kstruction(const string str,const int val,string descript);
~kstruction();
void display();
void change(const string des);//const修饰成员函数的参数
int function()const ;//const修饰成员函数的返回值
int value;
private:
const string name;//const修饰成员变量
const int age;
string description; }; kstruction::kstruction(const string str,const int val,string descript)
:name(str),age(val)
{
//用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。
//name = str;
//age = val;
description = descript;
cout <<"construction"<<endl;
} kstruction::~kstruction()
{
cout <<"Destructiong"<<endl;
} void kstruction::display()
{
cout <<"name = "<<name<<" ,age = "<<age<<" ,description = "<<description<<endl;
} void kstruction::change(const string des)
{
//用const修饰函数参数,传递过来的参数在函数内不可以改变。
//str = "wanghuixi";
description = des;
} int kstruction::function()const
{
//用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数。
//description = "software";
} int main(int argc, char const *argv[])
{ kstruction struct1("zhouxuewei",,"software"); struct1.change("hardware");
struct1.function(); struct1.display(); const kstruction conststruct;//const修饰类的对象
//用const修饰的类对象,该对象内的任何成员变量都不能被修改。
conststruct.value = ;
return ;
}

c++const关键字---15的更多相关文章

  1. C++ —— 类中static和const关键字声明变量的初始化方式总结

    在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...

  2. const关键字:终于拥有真正的常量声明语句

    本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...

  3. C语言const关键字的作用

    1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <string.h> 4 #include ...

  4. 深入聊一下const关键字

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助. 1.c ...

  5. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  6. C++中const关键字的使用总结

    C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数. 变量:const可以修饰普通变量.指针(数组)和结构体. 1.const修饰普通变量是最简单的情形.这样的用法多为在程序中 ...

  7. final关键字+const关键字

    final关键字 1.如果我们希望某个类不被其它的类来继承(可能因为安全考虑),可以使用final. 例题 <? final class A{} class B extends A{};//会报 ...

  8. C++学习11 类和new、delete操作符 类与const关键字

    如果你是Java.C#.PHP程序员,那么会对 new 非常熟悉,在这些编程语言中,只能通过 new 来创建对象. 在C++中,你可以像定义变量一样来创建对象,如: Student stu; //对象 ...

  9. C++中的const关键字

    http://blog.csdn.net/eric_jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方 ...

随机推荐

  1. Android——关于PagerAdapter的使用方法的总结(转)

    PagerAdapter简介 PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter, FragmentStatePagerAdap ...

  2. 无线linux应用及配置--wifi配置

    linux下应用wifi,AP侧运行程序hostapd,客户端运行wpa_supplicant.官网:http://w1.fi/. 无线网卡应用 无线网卡的应用服务程序为wpa_supplicant, ...

  3. Iconfont在移动端应用的问题

    关于部分奇葩用户代理不显示字体图标 以酷派为代表的部分安卓手机自带浏览器.微信/QQ WebView 等用户代理无法正常显示 Icon Font,原因可能是这些用户代理无法正确处理伪元素 conten ...

  4. Android训练课程(Android Training) - NFC基础

    NFC 基础 本文档介绍了在Android上的基本的NFC任务.它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC data),并介绍Androi ...

  5. 构建Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...

  6. jQuery验证控件jquery.validate.js的使用介绍

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  7. In R, how to split/subset a data frame by factors in one column?

    按照某列的值拆分data.frame My data is like this (for example): ID Rate State 1 24 AL 2 35 MN 3 46 FL 4 34 AL ...

  8. R语言进行数据预处理

    R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with Rpackages:tidyr dplyr Ground rules l ...

  9. Qt 菜鸟的坑 QAbstractSocket::isValid()

    我曾经多次在 Qt socket 编程中使用 tcpSocket.isValid 来判断我当前的连接是否可用,最近写程序时才发现此法并不妥当. bool QAbstractSocket::isVali ...

  10. android 在HTML中显示bitmap

    逻辑:将bitmap转化为Base64,通过调用HTML中的JS,显示到HTML中 (1)android代码 public String bitmaptoString(Bitmap bitmap) { ...