C++ const使用详解
1.const常量和宏常量
const int max=100;
#define max 100;
const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少
2.const变量在内存中的位置
我们在C程序的内存布局中,已经通过示例进行了说明
#include <stdio.h>
const int a = ; ////全部常量a
int main()
{
const int b = ; //局部常量b
int* pa = (int*)&a;//报错,因为全部常量放在只读数据段
int* pb = (int*)&b;//修改成功,因为局部常量放在栈上
*pa = ;
*pb = ;
return ;
}
3.const常成员变量的初始化
在某个对象生存期内是常量。
class Test
{
public:
const int a;
Test(int i):a(i){}
}
const常量只能通过初始化列表的方式进行初始化。
4.const修饰对象
该对象不能修改。只能访问成员变量,不能修改。只能调用常成员函数。
关于常成员函数,我们在后面介绍。
如下例所示:
#include<iostream>
class Test
{
public:
int a;
void fun0(){}
void fun1() const{}
};
int main()
{
Test test;
const Test& a_test = test;
std::cout<<a_test.a<<std::endl;//正常,访问公共成员a
a_test.fun0();//报错,对象包含与成员函数不兼容的类型限定符
a_test.fun1();//正常
return ;
}
5.const修饰指针
我们看一下下面四种写法:
) const int* a = ;
) int const *a = ;
) int* const a = ;
) const int* const a = ;
我们需要知道的是,
const在*左,表示指针指向的内容为常量,这也是我们平时说的常量指针
const在*右,表示指针本身为常量,这也是我们平时说的指针常量
因此,1),2)表示指针a指向的内容不能修改
3)表示指针a本身不能修改
4)表示指针a和a指向的内容都不能修改
6.const修饰成员函数,函数参数,返回值
1)修饰成员函数
void fun1() const;
成员函数名后加上const,即表明该函数为常成员函数。
常成员函数的const隐式修饰this指针,即对象不可修改,
所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数。
如下例所示:
int g_a;
void g_fun(){}
class Test
{
public:
void fun0(){}
void fun1() const{}
void fun2() const
{
a = ;//报错,“必须是可修改的左值”
fun0();//报错,对象包含与成员函数不兼容的类型限定符
fun1();//正常,可调用其他常成员函数 g_a = ;//正常
g_fun();//正常
}
private:
int a;
}
2)修饰函数参数
void fun0(const Test* p_test);
void fun1(const Test& test);
在传入的参数前,加上const,表明传入的参数不可修改。
3)修饰函数返回值
const Test fun0();
const Test* fun1();
当使用const Test* fun1();返回指针时,该返回值只能赋给const修饰的同类型指针。
如下例所示:
class Test
{
public:
void fun0(){}
const Test fun1(){
return *this;
}
const Test* fun2(){
return this;
}
};
int main()
{
Test test;
Test r = test.fun1();
const Test* rp = test.fun2();
}
C++ const使用详解的更多相关文章
- C++初学者 const使用详解
关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文. 1. const常量 如: cons ...
- const用法详解(转)
http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...
- C++中const用法详解
本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...
- es6学习笔记(1) let和const命令详解
let和const命令: Es6新增了let命令,声明变量,但与var不一样的,只在let命令所在的代码块内有效(如for循环之外let声明的变量就不再有效).并且let不像var那样会发生" ...
- C++ Const引用详解
(1) 在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. 1 int ival ...
- (转) C/C++中const关键字详解
文章转自 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...
- C++中const关键字详解
1.什么是const? const意味着是常量类型,被const修饰的变量或对象是不能被修改和更新的,当然在某些情况下,我们可以偷梁换柱的改变它. 2.为什么要引入const? 最初的目的是为了取代预 ...
- const关键字详解
const在函数前与函数后的区别 一 const基础 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况: int b = 500; ...
- ECMAScript6-let与const命令详解
前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...
随机推荐
- stm32的软件架构问题
1. 架构组成:程序代码分为四种结构a) 顺序执行代码定义:按照顺序逐行执行的代码优点:是思路简单,代码可靠不易被干扰.缺点:占用资源用途:只用来各种变量.函数的定义,硬件的初始化程序位置:main. ...
- 如何由Height Map生成Normal Map
转自:http://www.cnblogs.com/cxrs/archive/2009/11/01/1594155.html Nvidia和ATI都有相应的工具把Heightmap转成NormalMa ...
- (转)HTML文档头部信息
原文:http://www.cnblogs.com/sunyunh/archive/2012/07/25/2609199.html HTML(3)HTML文档头部信息 <!DOCTYPE h ...
- Intellij编译时报“java: System Java Compiler was not found in classpath”
问题如下: http://stackoverflow.com/questions/19889145/setting-up-intellij-12-idea-with-java-1-7-and-reso ...
- 文件IO和标准IO
2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 ...
- Android屏幕适配常识
屏幕适配的注意事项 1. AndroidManifest.xml设置 在中Menifest中添加子元素 android:anyDensity="true"时,应用程序安装在不同密度 ...
- java作业4
(一) 请查看String.equals()方法的实现代码,注意学习其实现方法.(发表到博客作业上) (二) 整理String类的Length().charAt(). getChars().rep ...
- HDU 5100
http://acm.hdu.edu.cn/showproblem.php?pid=5100 用1*k方格覆盖n*n方格 有趣的一道题,查了下发现m67的博客还说过这个问题 其实就是两种摆法取个最大值 ...
- Magento架构师的笔记-----Magento显示当前目录的父分类和子分类的分类名
在Magento目录的分类页面里,希望在左侧导航获取到父分类和子分类,可以用以下方法:打开app/your_package/your_themes/template/catalog/navigatio ...
- Java学习第二天
一.两个常用工具 1.随机生产一个[0,1)之间的数 Math.random() 举例: double box =Math.random(); //产生随机小数 [0,1) System.out.pr ...