c++const关键字---15
原创博文,转载请标明出处--周学伟 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的更多相关文章
- C++ —— 类中static和const关键字声明变量的初始化方式总结
在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...
- const关键字:终于拥有真正的常量声明语句
本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...
- C语言const关键字的作用
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <string.h> 4 #include ...
- 深入聊一下const关键字
const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助. 1.c ...
- 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将大大改善程序的健壮性,本人根据各方 ...
随机推荐
- CAS (14) —— CAS 更多用户信息
CAS (14) -- CAS 更多用户信息 摘要 将更多用户信息写入到service验证返回消息中 版本 tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas ...
- Java编程的逻辑 (54) - 剖析Collections - 设计模式
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- textbox 控制输入整数,小数
/// <summary> /// keypress事件控制输入 /// </summary> /// <param name="sender"> ...
- 安卓程序代写 网上程序代写[原]C语言基础
C 作者:han1202012 发表于2013-11-1 19:53:29 原文链接 阅读:28 评论:0 查看评论
- 《FPGA全程进阶---实战演练》第一章之如何学习FPGA
对于很多初学者,大部分都是急于求成,熟不知越是急于求成,最终越是学无所成,到头来两手空空,要学好FPGA,必须弄懂FPGA本质的一些内容. 1.FPGA内部结构及基本原理 FPGA是可以编程的,必须通 ...
- 大型网站的SEO引爆点
网站越大,SEO服务做起来就轻松,因为大型网站都有很好的执行团队,你只需要找准他们网站的SEO爆破点,就能够迅速获得非常理想的SEO效果.本文将结合我最近两年的几个经典案例:腾讯拍拍.金山爱词霸.中青 ...
- 多线程系列八:线程安全、Java内存模型(JMM)、底层实现原理
一.线程安全 1. 怎样让多线程下的类安全起来 无状态.加锁.让类不可变.栈封闭.安全的发布对象 2. 死锁 2.1 死锁概念及解决死锁的原则 一定发生在多个线程争夺多个资源里的情况下,发生的原因是 ...
- AWT中文译为抽象窗口工具包
AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具. AWT由Java中的java.awt包提供,里面包含 ...
- Java设计模式六大原则之场景应用分析
定义:不要存在多于一个导致类变更的原因. 通俗的说.即一个类仅仅负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而须要改动类T时,有可能会导致原本执行正 ...
- MyBatis通用Mapper技巧
一.排序 错误代码:example.orderBy(BaseEntity.Field.GMTUpdate + " desc"); 正确方式: 一是:通过注解 @OrderBy(va ...