【C++自我精讲】基础系列二 const
来源:互联网 发布:怎么制作红包软件 编辑:程序博客网 时间:2024/05/16 14:08
【C++自我精讲】基础系列二 const
0 前言
分三部分:const用法、const和#define比较、const作用。
1 const用法
const常量:const可以用来定义常量,不可改变,const常量在定义时必须初始化(extern修饰时是特例)。
//const常量const int Number = 100;extern const int Number;
const指针:
1)const出现在*号左边,表示被指物是常量(不可以改变);注意:const写在类型之前和写在类型之后且*号之前是一样的。
2)const出现在*号右边,表示指针自身是常量(不可以改变);
3)const出现在*号两边,表示被指物和指针两者都是常量(不可以改变)。
//const指针char name[] = "joinclear";char* pName = name; //指针和所指物都可以改变const char* pName = name; //指针可以改变,指针所指物不可以改变char const* pName = name; //同上char* const pName = name; //指针不可以改变,指针所指物可以改变const char* const pName = name; //指针和所指物都不可以改变
const引用:初始化右值一般只是个常量,所以只有常量引用可以有初始化右值。
//const引用int i = 100;int &j = i; //引用int &j = 200; //错误,引用不能改变右值const int &k = 200; //const引用可以改变右值
const函数形参:const只能修饰输入参数,不能修饰输出参数。
1)对于内部数据类型的输入参数,没必要将“值传递”方式改为“const引用传递”,因为“值传递”是,函数会自动产生临时变量用于复制该参数,无需const。
void Fun(int i) //OKvoid Fun(const int i) //没必要
2)当输入参数是“指针传递”是,为了防止函数体内改变此指针指向的值,可以加const修饰。
void StringCopy(const char *strSource); //strSource不能改变
3)对于非内部数据类型的输入参数,应将“值传递”方式改为“const引用传递“。
void Func(CTest a); //函数体内会产生CTest的临时对象用于复制a,临时对象又会经过构造、复制、析构,很耗时void Func(CTest &a); //引用,不产生临时对象,但"引用传递"有可能改变avoid Func(const CTest &a); //加const不会改变a
const函数返回值:const修饰函数返回值。
1)返回值是“值传递”方式,不用加const修饰。因为函数会把返回值复制到外部临时的存储单元,加const修饰没必要。
int Fun(int i) //OKconst int Fun(int i) //没必要
2)返回值是“指针传递”方式,可以加const修饰。意思为函数返回值指针所指内容不能改变,此时此返回值也只能赋给const修饰的同类型指针。
const char * GetString(void);const char *str = GetString();
const类成员变量:只在某个对象生存期内是常量,对于整个类是可变的,因为类可以创建多个对象,不同的对象其const类成员变量的值是可以不同。
1)const类成员变量,不能在类声明中初始化。
class A{ const int size = 100; //错误};
2)const类成员变量,只能在类构造函数的初始化表中进行初始化。
class A{ A(int size); const int size ; };A::A(int i) : size(i) //构造函数初始化列表{ ...}
const类成员函数:当类成员函数,不会修改数据成员时应该声明为const成员函数。
class A{public: int GetNum() const; //const成员函数private: int num_;};int A::GetNum() const{ num_ = 100;; // 错误,num_不能改变 return num_;}
2 const和#define比较
1)const常量有数据类型,编译器可以对前者进行类型安全检查;而#define常量没有数据类型,编译器只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
2)const可定义局部变量,作用域仅限于函数体内;#define常量,即使在函数体内,作用域也是全局的,为从定义处到文件结束,除非用#undef取消定义。
3 const作用
1)定义const常量,不可改变,能够节省内存空间,代替#define。
2)编译器能进行类型安全性检查,消除部分隐患。
3)可以保护被修饰的内容,防止意外修改,能够增强程序的健壮性。
4)能够提高效率,安全。
- 【C++自我精讲】基础系列二 const
- 【C++自我精讲】基础系列一 指针与引用
- 【C++自我精讲】基础系列三 重载
- 【C++自我精讲】基础系列四 static
- 【C++自我精讲】基础系列六 PIMPL模式
- 【C++自我精讲】基础系列五 隐式转换和显示转换
- 庖丁解牛<c++primer>系列二:const关键字
- const-static精讲
- 【学习C++】C++常对象精讲 — const关键字
- C++(二)const
- C基础之CONST
- C++基础之const系列
- 精讲c++中的const
- 精讲C++中的const
- troubleshooting基础技巧,第二讲,show出真自我
- C专家编程 二 const
- c语言基础之const
- C语言基础-const用法
- POJ-1561-Winner-2-概率论
- 产品开发过程中对技术角色有意无意的曲解和误解
- python实战--Http代理服务器
- win7 x64环境下用vc2008编译mysql++注意事项
- (转)让Android模拟器飞一会,模拟器的速度终于可以快过真机啦
- 【C++自我精讲】基础系列二 const
- Windows多进程编程 .
- jsopu getElementsByClass 遇到空格无法解析的解决办法
- hdu 1348 Wall(凸包模板)
- 微软笔试
- Oracle学习(13)---Logminer
- service-based database
- vmware设置centos虚拟机nat联网
- Linux系统服务器错误信息的解释