C++ 中 const 使用
2016-01-15 18:34
429 查看
一 const解释
如果你一看见C++中const就脱口而出:“常量!”那只能说明你对c++不甚了解。或者说你太2了.const得一些使用方法与场景如下:
1.const修饰普通变量,全局变量,静态变量
1 const int iTmp = 1; 2 int const iTmpEx = 2;
变量保持其原有属性,只是多了一个const,只读属性。这里,const到底是紧贴变量名还是类型说明符号(int)都无关紧要。在修饰指针时候的不同在后面会详细说明.
2.const修饰指针
const 修饰指针有三种情况:
只要看const离哪个近些,const离pName最近,说明它是在修饰指针变量pName,表示pName不能改变,即不能做pName++这种修改pTmp指针的操作。
//A: 指针指向内容不能修改,指针本身可以修改。 char chBuffer[] = "test"; //等同char const* pName = chBuffer; const char *pName = chBuffer; pName++; //合法,指针本身可以修改 *pName = 'c';// 非法,指针指向的内容不能被修改 cout<<pName<<endl(); //B: 指针指向内容能修改,指针本身不可以修改。 char chBuffer[] = "test"; char * const pName = chBuffer; pName++; //非法,指针本身不能被修改 *pName = 'c'; //内容可以被修改 cout<<pName<<endl(); //C: 指针指向内容不能修改,指针本身不可以修改。 char chBuffer[] = "test"; const char * const pName = chBuffer; pName++; //非法,指针本身不能被修改 *pName = 'c'; //非法 内容不可以被修改 cout<<pName<<endl();
3.const修饰函数参数
void Test(const int iAge)//函数体中,确保iAge不被修改。 void Test(const char *pName)//函数体中,确保pName指向的内容不被修改。 void Test(char* const pName)//函数体中,确保pName不被修改。 void Test(const char* const pName)//函数体中,确保pName和pName指向的内容不被修改。 void Test(const ClassTest &obj);// 这种情况使用非常多,这样可以避免调用ClassTest的构造函数,直接传递类对象的地址
c++中&和*怎么用
&引用访问一个变量是直接访问,而*指针是间接访问。
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值.
“&”是取地址运算符
“*”的用法有两种情况:(1)定义指针变量(2)间接访问运算符
int a,*p; p=&a; a=*p;
例如:
int i = 3,j = 4; int &x = i;//成为i的别名 x = j;//不能否认x仍然引用i,并没有成为j的别名,只是修改了x和j共享的内存空间的值.这点与指针不同,指针在任何时刻都可以改变自己的指向
4.const修饰函数返回值
const 修饰返回值的用法比较少见,有种用法,比如
const char* Test();
那么接受它返回内容的变量也要写成const char * 类型
5:const修饰类成员变量
修饰类成员变量时候,初始化需要放到类初始化列表种进行初始化
class CTest{ public: int m_iAge; } CTest::CTest:m_iAge(99){ }
6.const修饰成员函数
对变量的只读访问,只是类普通变量,排除全局,静态变量。
class CTest{ public: void Show()const; private: int m_iAge; } void CTest:: Show()const{ cout<<m_iAge; // m_iAge++; 不能修改 }
原文:
1.C++ 中 const 使用
二 const与宏的区别
编译时刻宏是预编译(编译之前处理),const是编译阶段
编译检查.
宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
优点.
宏能定义一些函数,方法。 const不能。
缺点.
用大量宏,容易造成编译时间久,每次都需要重新替换
三 static 作用
修饰局部变量延长局部变量的生命周期,程序结束才会销毁。
某个局部变量(例如static int age = 0)只会生成一份内存,只会初始化一次,所有函数,共享这个局部变量(age)。
改变局部变量的作用域,在其他函数中共享这个局部变量。static 表示静态的变量,分配内存的时候, 存储在静态区,不存储在栈上面。
修饰全局变量
只能在本文件中访问,修改全局变量的作用域,生命周期不改变。
避免重复定义全局变量
四 extern作用:
只是用来获取全局变量(包括全局静态变量)的值(例如:extern int externFile)),不能用于定义变量(例如:extern const int a = 20)。先在当前文件查找有没有全局静态变量(static int a,因为文件中不能有int a形式的变量),没有找到,才会去其他文件查找全局变量(int a,其他文件里不包括静态变量,因为静态变量只能在本文件使用)。
五 static与const联合使用
声明一个静态的全局只读常量,其他文件无法访问,避免重复定义全局变量.static const int a = 20;
开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合.
// GlobeConst.m中 static const int a = 20;
六 extern与const联合使用
声明一个全局只读常量extern const int b = 1;
开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合.只在头文件中做声明,不做定义。
//GlobeConst.h中 extern const int b; //GlobeConst.m中 const int b = 1;
六 定义与声明的区别
声明不等于定义//定义,指出变量名字同时为变量分配存储空间,定义包含了声明 int a = 20; //声明,声明只是指出了变量的名字,并没有为其分配存储空间 int a;
相关代码:
// // externFile.h // constStudy // // Created by ifeng on 16/1/15. // Copyright © 2016年 beijing. All rights reserved. // #ifndef externFile_h #define externFile_h #include <stdio.h> extern int externFile; extern int externFileNoStatic; #endif /* externFile_h */
// // externFile.c // constStudy // // Created by ifeng on 16/1/15. // Copyright © 2016年 beijing. All rights reserved. // #include "externFile.h" int externFile = 10; int externFileNoStatic = 12;
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。 int a = 20; // static修饰全局变量 static int age = 20; static int externFile = 11; //引用外部变量 extern int externFile;//引用的是本文件的externFile extern int externFileNoStatic;//引用的是其他文件的externFile //int externFileNoStatic;不能这样声明,错误。 void test() { // static修饰局部变量 static int age = 0; age++; int a = 5; a ++; printf("static:%d,int a:%d\n",age,a); } int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... printf("Hello, World!\n"); test();//static:1,int a:6 test();//static:2,int a:6 printf("static2:%d,int a :%d\n",age,a);//static2:20,int a :20 extern int age; printf("extern in file:%d\n",age);//extern in file:20 printf("externFile in file:%d\n",externFile);//externFile in file:11 printf("externFileNoStatic out file:%d\n",externFileNoStatic);//externFile out file:12 } return 0; }
1.C/C++中extern关键字详解
2全局变量和extern详解
3.【如何正确使用const,static,extern】|那些人追的干货
相关文章推荐
- 修练8年C++面向对象程序设计之体会
- 修练8年C++面向对象程序设计之体会
- C++历史段错误
- C语言中有string吗?
- C++语言学习资料大全分享 想要的速度下
- Effective C++(条款39-40)
- C++ vector的使用
- C++ Primer 5th Chapter 9 学习笔记
- C++中运算符重载
- c语言 数组名是常量指针
- MFC中ActiveX控件的使用
- C\C++ 使用do{...}while(0)进行宏定义的好处!!!
- 线程池的实现(c语言)
- 详解C++编程中标记语句与复合语句的写法
- 杨辉三角 C语言
- 魔方阵的实现 C语言
- C++ Primer 5th Chapter 8 学习笔记
- C++运行时获取类型信息的type_info类与bad_typeid异常
- C语言中的常用变量
- C++中关于拷贝构造函数