C++ const 用法

const\u5728c++\u91cc\u7684\u7528\u6cd5\uff1f\uff1f\uff1f

\u5e38\u7c7b\u578b\u662f\u6307\u4f7f\u7528\u7c7b\u578b\u4fee\u9970\u7b26const\u8bf4\u660e\u7684\u7c7b\u578b\uff0c\u5e38\u7c7b\u578b\u7684\u53d8\u91cf\u6216\u5bf9\u8c61\u7684\u503c\u662f\u4e0d\u80fd\u88ab\u66f4\u65b0\u7684\u3002\u56e0\u6b64\uff0c\u5b9a\u4e49\u6216\u8bf4\u660e\u5e38\u7c7b\u578b\u65f6\u5fc5\u987b\u8fdb\u884c\u521d\u59cb\u5316\u3002

\u4e00\u822c\u5e38\u91cf\u548c\u5bf9\u8c61\u5e38\u91cf

1. \u4e00\u822c\u5e38\u91cf

\u4e00\u822c\u5e38\u91cf\u662f\u6307\u7b80\u5355\u7c7b\u578b\u7684\u5e38\u91cf\u3002\u8fd9\u79cd\u5e38\u91cf\u5728\u5b9a\u4e49\u65f6\uff0c\u4fee\u9970\u7b26const\u53ef\u4ee5\u7528\u5728\u7c7b\u578b\u8bf4\u660e\u7b26\u524d\uff0c\u4e5f\u53ef\u4ee5\u7528\u5728\u7c7b\u578b\u8bf4\u660e\u7b26\u540e\u3002\u5982\uff1a

int const x=2;

\u6216

const int x=2;

\u5b9a\u4e49\u6216\u8bf4\u660e\u4e00\u4e2a\u5e38\u6570\u7ec4\u53ef\u91c7\u7528\u5982\u4e0b\u683c\u5f0f\uff1a

const []\u2026

\u6216\u8005

const []\u2026

\u4f8b\u5982\uff1a

int const a[5]={1, 2, 3, 4, 5};

2. \u5e38\u5bf9\u8c61

\u5e38\u5bf9\u8c61\u662f\u6307\u5bf9\u8c61\u5e38\u91cf\uff0c,\u7684rTmag\u6559~\u65e0_;\u5b9a\u4e49\u683c\u5f0f\u5982\u4e0b\uff1a

const

\u6216\u8005

const

\u5b9a\u4e49\u5e38\u5bf9\u8c61\u65f6\uff0c\u540c\u6837\u8981\u8fdb\u884c\u521d\u59cb\u5316\uff0c\u5e76\u4e14\u8be5\u5bf9\u8c61\u4e0d\u80fd\u518d\u88ab\u66f4\u65b0\uff0c\u4fee\u9970\u7b26const\u53ef\u4ee5\u653e\u5728\u7c7b\u540d\u540e\u9762\uff0c\u4e5f\u53ef\u4ee5\u653e\u5728\u7c7b\u540d\u524d\u9762\u3002

\u5e38\u6307\u9488\u548c\u5e38\u5f15\u7528

1. \u5e38\u6307\u9488

\u4f7f\u7528const\u4fee\u9970\u6307\u9488\u65f6\uff0c\u7531\u4e8econst\u7684\u4f4d\u7f6e\u4e0d\u540c\uff0c\u800c\u542b\u610f\u4e0d\u540c\u3002\u4e0b\u9762\u4e3e\u4e24\u4e2a\u4f8b\u5b50\uff0c\u8bf4\u660e\u5b83\u4eec\u7684\u533a\u522b\u3002

\u4e0b\u9762\u5b9a\u4e49\u7684\u4e00\u4e2a\u6307\u5411\u5b57\u7b26\u4e32\u7684\u5e38\u91cf\u6307\u9488\uff1a

char * const prt1 = stringprt1;

\u5176\u4e2d\uff0cptr1\u662f\u4e00\u4e2a\u5e38\u91cf\u6307\u9488\u3002\u56e0\u6b64\uff0c\u4e0b\u9762\u8d4b\u503c\u662f\u975e\u6cd5\u7684\u3002

ptr1 = stringprt2;

\u800c\u4e0b\u9762\u7684\u8d4b\u503c\u662f\u5408\u6cd5\u7684\uff1a

*ptr1 = "m";

\u56e0\u4e3a\u6307\u9488ptr1\u6240\u6307\u5411\u7684\u53d8\u91cf\u662f\u53ef\u4ee5\u66f4\u65b0\u7684\uff0c\u4e0d\u53ef\u66f4\u65b0\u7684\u662f\u5e38\u91cf\u6307\u9488ptr1\u6240\u6307\u7684\u65b9\u5411(\u522b\u7684\u5b57\u7b26\u4e32)\u3002

\u4e0b\u9762\u5b9a\u4e49\u4e86\u4e00\u4e2a\u6307\u5411\u5b57\u7b26\u4e32\u5e38\u91cf\u7684\u6307\u9488\uff1a

const * ptr2 = stringprt1;

\u5176\u4e2d\uff0cptr2\u662f\u4e00\u4e2a\u6307\u5411\u5b57\u7b26\u4e32\u5e38\u91cf\u7684\u6307\u9488\u3002ptr2\u6240\u6307\u5411\u7684\u5b57\u7b26\u4e32\u4e0d\u80fd\u66f4\u65b0\u7684\uff0c
K\u63d0\u6559{\u7f51i^\u7ba1H6L\u7edcv^

\u800cptr2\u662f\u53ef\u4ee5\u66f4\u65b0\u7684\u3002\u56e0\u6b64\uff0c

*ptr2 = "x";

\u662f\u975e\u6cd5\u7684\uff0c\u800c\uff1a

ptr2 = stringptr2;

\u662f\u5408\u6cd5\u7684\u3002

\u6240\u4ee5\uff0c\u5728\u4f7f\u7528const\u4fee\u9970\u6307\u9488\u65f6\uff0cL\u7f51VMXN$[m}\u5e94\u8be5\u6ce8\u610fconst\u7684\u4f4d\u7f6e\u3002\u5b9a\u4e49\u4e00\u4e2a\u6307\u5411\u5b57\u7b26\u4e32\u7684\u6307\u9488\u5e38\u91cf\u548c\u5b9a\u4e49\u4e00\u4e2a\u6307\u5411\u5b57\u7b26\u4e32\u5e38\u91cf\u7684\u6307\u9488\u65f6\uff0cconst\u4fee\u9970\u7b26\u7684\u4f4d\u7f6e\u4e0d\u540c\uff0c\u524d\u8005const\u653e\u5728*\u548c\u6307\u9488\u540d\u4e4b\u95f4\uff0c\u540e\u8005const\u653e\u5728\u7c7b\u578b\u8bf4\u660e\u7b26\u524d\u3002

2. \u5e38\u5f15\u7528

\u4f7f\u7528const\u4fee\u9970\u7b26\u4e5f\u53ef\u4ee5\u8bf4\u660e\u5f15\u7528\uff0c\u88ab\u8bf4\u660e\u7684\u5f15\u7528\u4e3a\u5e38\u5f15\u7528\uff0c\u8be5\u5f15\u7528\u6240\u5f15\u7528\u7684\u5bf9\u8c61\u4e0d\u80fd\u88ab\u66f4\u65b0\u3002\u5176\u5b9a\u4e49\u683c\u5f0f\u5982\u4e0b\uff1a

const &

\u4f8b\u5982\uff1a

const double & v;

\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0cf\u7f51|B\xc{Lf&pHhA\u80b2\u5e38\u6307\u9488\u548c\u5e38\u5f15\u7528\u5f80\u5f80\u7528\u6765\u4f5c\u51fd\u6570\u7684\u5f62\u53c2\uff0c\u8fd9\u6837\u7684\u53c2\u6570\u79f0\u4e3a\u5e38\u53c2\u6570\u3002

\u5728C++\u9762\u5411\u5bf9\u8c61\u7684\u7a0b\u5e8f\u8bbe\u8ba1\u4e2d\uff0c\u6307\u9488\u548c\u5f15\u7528\u4f7f\u7528\u5f97\u8f83\u591a\uff0c\u5176\u4e2d\u4f7f\u7528const\u4fee\u9970\u7684\u5e38\u6307\u9488\u548c\u5e38\u5f15\u7528\u7528\u5f97\u66f4\u591a\u3002\u4f7f\u7528\u5e38\u53c2\u6570\u5219\u8868\u660e\u8be5\u51fd\u6570\u4e0d\u4f1a\u66f4\u65b0\u67d0\u4e2a\u53c2\u6570\u6240\u6307\u5411\u6216\u6240\u5f15\u7528\u7684\u5bf9\u8c61\uff0c\u8fd9\u6837\uff0c\u5728\u53c2\u6570\u4f20\u9012\u8fc7\u7a0b\u4e2d\u5c31\u4e0d\u9700\u8981\u6267\u884c\u62f7\u8d1d\u521d\u59cb\u5316\u6784\u9020\u51fd\u6570\uff0c\u8fd9\u5c06\u4f1a\u6539\u5584\u7a0b\u5e8f\u7684\u8fd0\u884c\u6548\u7387\u3002

\u4e0b\u9762\u4e3e\u4e00\u4f8b\u5b50\u8bf4\u660e\u5e38\u6307\u9488\u4f5c\u51fd\u6570\u53c2\u6570\u7684\u4f5c\u6cd5\u3002

#include
const int N = 6;
void print(const int *p, int n);

void main()
{
int array[N];
for (int i=0; i cin>>array[i];
print(array, N);
}

void print(const int *p, int n)
{
cout<<"{"<<*p;
for (int i=1; i cout<<","<<*(p+i);
cout<<"}"< }


\u5e38\u6210\u5458\u51fd\u6570

\u4f7f\u7528const\u5173\u952e\u5b57\u8fdb\u884c\u8bf4\u660e\u7684\u6210\u5458\u51fd\u6570\uff0c\u79f0\u4e3a\u5e38\u6210\u5458\u51fd\u6570\u3002\u53ea\u6709\u5e38\u6210\u5458\u51fd\u6570\u624d\u6709\u8d44\u683c\u64cd\u4f5c\u5e38\u91cf\u6216\u5e38\u5bf9\u8c61\uff0c\u6ca1\u6709\u4f7f\u7528const\u5173\u952e\u5b57\u8bf4\u660e\u7684\u6210\u5458\u51fd\u6570\u4e0d\u80fd\u7528\u6765\u64cd\u4f5c\u5e38\u5bf9\u8c61\u3002\u5e38\u6210\u5458\u51fd\u6570\u8bf4\u660e\u683c\u5f0f\u5982\u4e0b\uff1a

() const\uff1b

\u5176\u4e2d\uff0cconst\u662f\u52a0\u5728\u51fd\u6570\u8bf4\u660e\u540e\u9762\u7684\u7c7b\u578b\u4fee\u9970\u7b26\uff0c\u5b83\u662f\u51fd\u6570\u7c7b\u578b\u7684\u4e00\u4e2a\u7ec4\u6210\u90e8\u5206\uff0c\u56e0\u6b64\uff0c\u5728\u51fd\u6570\u5b9e\u73b0\u90e8\u5206\u4e5f\u8981\u5e26const\u5173\u952e\u5b57\u3002\u4e0b\u9762\u4e3e\u4e00\u4f8b\u5b50\u8bf4\u660e\u5e38\u6210\u5458\u51fd\u6570\u7684\u7279\u5f81\u3002

#include
class R
{
public:
R(int r1, int r2) { R1=r1; R2=r2; }
void print();
void print() const;
private:
int R1, R2;
};

void R::print()
{
cout< }

void R::print() const
{
cout< }

void main()
{
R a(5, 4);
a.print();
const R b(20, 52);
b.print();
}


\u8be5\u4f8b\u5b50\u7684\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a

5,4
20;52

\u8be5\u7a0b\u5e8f\u7684\u7c7b\u58f0\u660e\u4e86\u4e24\u4e2a\u6210\u5458\u51fd\u6570\uff0c|T?v;T\u4e13tj%\u4e13I
o;(6!gG2]\u6559bzz\u4e13"
\u5176\u7c7b\u578b\u662f\u4e0d\u540c\u7684(\u5176\u5b9e\u5c31\u662f\u91cd\u8f7d\u6210\u5458\u51fd\u6570)\u3002\u6709\u5e26const\u4fee\u9970\u7b26\u7684\u6210\u5458\u51fd\u6570\u5904\u7406const\u5e38\u91cf\uff0c\u8fd9\u4e5f\u4f53\u73b0\u51fa\u51fd\u6570\u91cd\u8f7d\u7684\u7279\u70b9\u3002

\u5e38\u6570\u636e\u6210\u5458

\u7c7b\u578b\u4fee\u9970\u7b26const\u4e0d\u4ec5\u53ef\u4ee5\u8bf4\u660e\u6210\u5458\u51fd\u6570\uff0c\u4e5f\u53ef\u4ee5\u8bf4\u660e\u6570\u636e\u6210\u5458\u3002

\u7531\u4e8econst\u7c7b\u578b\u5bf9\u8c61\u5fc5\u987b\u88ab\u521d\u59cb\u5316\uff0c\u5e76\u4e14\u4e0d\u80fd\u66f4\u65b0\uff0c\u56e0\u6b64\uff0c\u5728\u7c7b\u4e2d\u8bf4\u660e\u4e86const\u6570\u636e\u6210\u5458\u65f6\uff0c\u53ea\u80fd\u901a\u8fc7\u6210\u5458\u521d\u59cb\u5316\u5217\u8868\u7684\u65b9\u5f0f\u6765\u751f\u6210\u6784\u9020\u51fd\u6570\u5bf9\u6570\u636e\u6210\u5458\u521d\u59cb\u5316\u3002

\u4e0b\u9762\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u8bb2\u8ff0\u4f7f\u7528\u6210\u5458\u521d\u59cb\u5316\u5217\u8868\u6765\u751f\u6210\u6784\u9020\u51fd\u6570\u3002

#include
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};

const int A::b=10;
A::A(int i):a(i), r(a)
{
}

void A::print()
{
cout< }

void main()
{
A a1(100), a2(0);
a1.print();
a2.print();
}


\u8be5\u7a0b\u5e8f\u7684\u8fd0\u884c\u7ed3\u679c\u4e3a\uff1a

100:10:100
0:10:0

\u5728\u8be5\u7a0b\u5e8f\u4e2d\uff0c\u8bf4\u660e\u4e86\u5982\u4e0b\u4e09\u4e2a\u5e38\u7c7b\u578b\u6570\u636e\u6210\u5458\uff1a

const int & r;

const int a;

static const int b;

\u5176\u4e2d\uff0cr\u662f\u5e38int\u578b\u5f15\u7528\uff0ca\u662f\u5e38int\u578b\u53d8\u91cf\uff0cb\u662f\u9759\u6001\u5e38int\u578b\u53d8\u91cf\u3002

\u7a0b\u5e8f\u4e2d\u5bf9\u9759\u6001\u6570\u636e\u6210\u5458b\u8fdb\u884c\u521d\u59cb\u5316\u3002

\u503c\u5f97\u6ce8\u610f\u7684\u662f\u6784\u9020\u51fd\u6570\u7684\u683c\u5f0f\u5982\u4e0b\u6240\u793a\uff1a

A(int i):a(i),r(a)
{
}

\u5176\u4e2d\uff0c\u5192\u53f7\u540e\u8fb9\u662f\u4e00\u4e2a\u6570\u636e\u6210\u5458\u521d\u59cb\u5316\u5217\u8868\uff0c\u5b83\u5305\u542b\u4e24\u4e2a\u521d\u59cb\u5316\u9879\uff0c\u7528\u9017\u53f7\u8fdb\u884c\u4e86\u5206\u9694\uff0c\u56e0\u4e3a\u6570\u636e\u6210\u5458a\u548cr\u90fd\u662f\u5e38\u7c7b\u578b\u7684\uff0c\u9700\u8981\u91c7\u7528\u521d\u59cb\u5316\u683c\u5f0f\u3002

int a = 1;

const int* p1 = &a; // p1\u6307\u5411\u7684\u5185\u5bb9\u4e0d\u53ef\u6539\u53d8
int* const p2 = &a; // p2\u6307\u5411\u7684\u4f4d\u7f6e\u4e0d\u53ef\u6539\u53d8

*p1 = 2; // \u9519\u8bef!!
++p2; // \u9519\u8bef!!

\u7ed3\u8bba\uff1a\u58f0\u660e\u5e26const\u7684\u6307\u9488\u65f6\uff0cconst\u51fa\u73b0\u5728*\u53f7\u5de6\u8fb9\u5219\u8be5\u6307\u9488\u6307\u5411\u7684\u4f4d\u7f6e\u7684\u5185\u5bb9\u4e0d\u53ef\u6539\u53d8\uff1bconst\u51fa\u73b0\u5728*\u53f7\u8fb9\u5219\u8be5\u6307\u9488\u6307\u5411\u7684\u4f4d\u7f6e\u4e0d\u53ef\u6539\u53d8\uff1b\u5982\u679cconst\u51fa\u73b0\u5728*\u53f7\u4e24\u8fb9\u5219\u8be5\u6307\u9488\u6307\u5411\u7684\u5185\u5bb9\u548c\u5176\u6307\u5411\u4f4d\u7f6e\u5747\u4e0d\u53ef\u6539\u53d8\uff0c\u5982\uff1a
const int* const p3 = &a;

const char* why()const{return "test"};

const char* \u8fd9\u91cc\u7684const\u8868\u793a\u8fd4\u56de\u5185\u5bb9\u4e0d\u53ef\u66f4\u6539\uff0c\u5982\uff1a

X.why() = "hello"; //\u9519\u8bef

why()const\u8868\u793a\u8be5\u51fd\u6570\u4e0d\u4fee\u6539\u6570\u636e\u6210\u5458\u7684\u503c\uff0c\u5982\uff1a

class X
{
int a;
public:
const char* why()const{a = 2;return "test"}; // \u9519\u8bef!!
};

1. const常量,如const int max = 100;
优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

2. const 修饰类的数据成员。 const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。 const数据成员的初始化只能在类的构造函数的初始化表中进行。

3. const修饰指针的情况,见下式:
const int* a = & [1]
int const *a = & [2]
int* const a = & [3]
const int* const a = & [4]
可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。

4. const的初始化
先看一下const变量初始化的情况
1) 非指针const常量初始化的情况:A b;
const A a = b;
2) 指针const常量初始化的情况:
A* d = new A();
const A* c = d;
或者:const A* c = new A();
3)引用const常量初始化的情况:
A f;
const A& e = f; // 这样作e只能访问声明为const的函数,而不能访问一般的成员函数;

5. const在函数声明中的应用 在函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。1) 修饰参数的const,如 void fun0(const A* a ); void fun1(const A& a);
调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
[注意]:参数const通常用于参数为指针或引用的情况,且只能修饰输入参数;若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。
[总结]对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是为了提高效率。例如,将void Func(A a)改为void Func(const A &a)
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x)不应该改为void Func(const int &x)
2) 修饰返回值的const,如const A fun2( ); const A* fun3( );
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。 [总结] 1) 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。2)如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

6. 类成员函数中const的使用
一般放在函数体后,形如:void fun() const;
任何不会修改数据成员的函数都因该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。

7. 使用const的一些建议
1 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
2 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
3 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
4 const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
5 不要轻易的将函数的返回值类型定为const;
6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

就是在你定义的变量前加一个const例如: const char mv=“哈哈”;表示这个变量是常量,不能被赋值改变了!

一种是定义为常量 如const int i = 10;
一种是形参,返回值,用来保护传入参数不被改变。如 char* strCopy(char* strDst, const char* strSrc);

const是常量的意思,就是把一个变量定义成不可更改的值,在一般使用中有2中用法
1、const int a=100;这是把a定义成常量,这个a在使用中不可更改(不可赋值),注意const和变量赋值必须在一条语句中,意思就是:
const int a;
a=100;
这种定义常量是错误的,只有const int a=100;是正确的定义
2、是在参数传递中使用,这是一般const 和& 是连用的,这样使用的好处是当你使用参数又不想改变参数的值可以这样写就不会再参数使用中改变参数的值,而加&是为了节省空间,当然这种用法用到得比较少,不过这是一个好的编程习惯,使用方法:
int f(const int &a,const int &b)
{
…………这里面写代码。a,b 值是不可改变的,a,b所使用的实参和a,b共同占用一块空间,这样可以省空间
}
希望对你有帮助

扩展阅读:c++简单程序实例 ... c++ struct ... c++ json解析库 ... c++ 接口实现 ... const关键字用法 ... c++入门项目 ... const c++的作用 ... c++编程 ... c++基础入门 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网