C++中const使用注意要点(二)
当const修饰类的成员变量
1、const修饰类的非静态成员时必须在构造函数初始化列表上初始化;

在构造函数内会提示表达式必须是可修改的左值,因为在构造函数内并不是初始化,仅仅是赋值,而const类型必须初始化。
2、const修饰类的静态成员必须在定义的地方对它初始化,因为静态成员是无法在构造函数初始化列表上初始化的;
当const修饰类的成员函数时
1、用const修饰类的对象,那么该对象不能调用任何修改类成员的方法;
2、把const放在成员函数后,比如void f() const {},那么该函数内不能修改类成员;
例外1:可以将this指针强制转换成非const指针来在2的情况下改变类成员
class Test
{
int i;
public:
Test(int ii = 0) : i(ii) {}
void f() const
{
((Test*)this)->i++;
(const_cast<Test*>(this))->i++;
}
};
例外2:使用mutable关键字,可以突破const的限制,被mutable修饰的变量将永远处于可变状态
实际往往会使用类的常引用来作为函数参数,这样就不会修改成员变量的值,但是要注意的是调用的方法后必须声明const
class MyClass
{
public:
MyClass(int _val = );
~MyClass(void); int Get() { return val; } private:
int val;
}; MyClass copy(const MyClass& bc)
{
int i = bc.Get(); // Error!
return MyClass(i);
}
虽然我们知道Get函数不会改变成员变量,但是编译器不知道,这样它就会觉得你调用了可能改变成员变量的函数(Get)。
产生非常常见的编译错误:
error C2662: “MyClass::Get”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
1> 转换丢失限定符
C++中const使用注意要点(二)的更多相关文章
- C++中const使用注意要点(一)
最近看<C++编程思想>发现自己的基础确实不牢固,也想起了以前写代码时也因为const的事情浪费过时间,这里总结下几个要点. 首先说下内部链接和外部链接. 当一个cpp文件在编译时,预处理 ...
- C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏
const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...
- OpenCV中对图像进行二值化的关键函数——cvThreshold()。
函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold, doub ...
- (转) C/C++中const关键字详解
文章转自 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...
- c/c++中const使用总结(金典)
原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 个人总结: (1)const只对它左 ...
- C/C++ 中 const 修饰符用法总结
C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...
- C++中const用法详解
本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...
- C++ 中const作用
一.对const与#define的特点及区别的理解 #define只是用来做文本替换的,#define常量的生命周期止于编译期,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数,并没 ...
- C++中const的实现细节介绍(C,C#同理)
via:http://www.jb51.net/article/45755.htm 本篇文章主要是对C++中const的实现细节进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1.什么 ...
随机推荐
- vue 自定义拖拽指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- LeetCode OJ:Decode Ways(解码方法)
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- Qt出现QObject::connect: Cannot queue arguments of type '******'的解决方法
一般出现这种情况都是自定义的类型进行型号槽连接的时候出现的,使用 假设自定义的类型是MyClass 使用qRegisterMetaType<MyClass>("MyClass&q ...
- 微信授权网页获取用户openiid
微信网页授权:官方文档: https://mp.weixin.qq.com/wiki 支付文档:https://pay.weixin.qq.com/wiki/doc/api/index.html 调试 ...
- anjular2以及微信小程序的一点比较
1条件渲染: 小程序:用 wx:if="{{condition}}" 来判断是否需要渲染该代码块. <view wx:if="{{condition}}" ...
- UDP:rfc768/广播和多播/IGMP
封装情况:
- redis常用配置参数解析
本文主要总结一下redis常用的配置参数的用法: 以下参数决定redis运行方式,默认前台运行,修改为yes可以让redis以后台守护进程方式运行 daemonize no 以下参数指定redis的p ...
- I.MX6 linux eGalaxTouch 自动获取设备节点
I.MX6 linux eGalaxTouch 自动获取设备节点 \\\\\\\\\\\\\\-*- 目录 -*-///////////// | 一. 需求: | 二. /proc/bus/input ...
- 开源中文检索引擎Coreseek简单使用
Coreseek结合MySQL使用简单示例,如下所示: echo 北京 | iconv -f gbk -t utf-8 | search -c D:\web\coreseek\etc\csft_mys ...
- scala学习笔记(9): 语法续
1 不定长参数 def sum(args: Int*) = { var result = 0 for ( arg <- args) result += arg result } 2 数组初始化 ...