您的位置:首页 > 编程语言 > C语言/C++

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】|那些人追的干货
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: