const 在c及c++中应用

const 在c及c++中应用

const的定义:const是ANSI C中的的关键字,它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性,const在其它编程语言中也有出现,例如Pascal、C++、PHP5、BC#等。

一.const在c和c++中的基础用法

  • const 用于定义变量,当int const a=10;时此时变量a只有只读权利。这时a为只读,就不能为左值,即不能被赋值。
    ?? 注意此时const int a=10;与int const a=10;语义相同。const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。

    #include<iostream>
    using namespace std;
    const int a=10;

int main(){
? int b=a; //不为左值 合法
? a=100 //为左值 非法

  • 在c语言某些编译器(例如vc++6.0)中用const变量来初始化数组,编译器会报错。这是由于“只读变量”和“常量”的不同。但注意在C++中则可以,因为const被扩展了含义。

?? 但由enum类型和#define宏定义的数就可以用来定义常量初始换数组。

二.const和#define的区别

?? 他们两个从功能上说它们很像,但它们又有不同。

  • define是预编译指令,而const是普通变量的定义。const定义的是变量,而#define定义的是常量。#define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。例如刚刚的初始化数组,用#define就能够运行。
  • 因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是开辟一个新内存来存放它的值,只不过这个值由编译器限定不允许被修改。而ANSI C规定数组定义时长度必须是“常量”,所以会报错。
    但其实除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用const。

三.const与一维指针的运用

  • const int p1=&a;等价于int const p1=&a;
  • const int p1=&a; ?//const修饰p1,将p1作为左值合法,将p1作为左值非法
    我们可以看出,const修饰的是
    p1,不能直接改变 *p1的值,但可以改变指向来改变p1的值。

  • int * const p2=&a; ?//const修饰p2,将p2作为左值非法,将p2作为左值合法
    这种情况下,const修饰的是p2,不能直接改变p2的方向,但可以改变
    p2的值。

  • const int const p3=&a;?//const分别修饰p3,p3,将p3,p2作为左值都非法,这时p3的值和p3方向都不能被改变
    我们可以看出,const修饰的是p1,不能直接改变 p1的值,但可以改变指向来改变p1的值。

??总结:const后面是什么,什么就不能被修改。Eg.const int p1=&a; 和const int p2=&a; 分别为*p1的值和p2指向不能改变。

四.const在与函数

??const更大的作用是它可以修饰函数的参数、返回值,甚至函数的定义体。但需要注意的是如果参数做输出需要,用const就失去了功能。

  • 例如:

void StringCopy(char*strDestination, const char *strSource);

?其中strSource是输入参数,strDestination是输出参数。给strSource加上const修饰后,如果函数体内的语句试图改动strSource的内容,编译器将指出错误。

  • 传递地址时加const修饰,函数返回值只能被赋给加const修饰的同类型指针,或者使用强制转换。

const int* func(void){ //函数声明
? int* a = func(); //报错
? int* c = const_cast<int*>(func()); //正确 ?const int* b = func(); }//正确

(3)const 成员函数
不修改数据成员的函数都尽量声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误。

原文地址:https://www.cnblogs.com/xqy-888/p/11515485.html

时间: 2024-08-13 09:37:33

const 在c及c++中应用的相关文章

const基础知识、const在C++和C中的异同、const与#define宏定义的异同

1.const基础知识 (1)用const定义常量 const int a = 5;   //定义了一个int型常量a,其值为5 (注:在C++中将其存储在符号表中(key,value),并不分配内存空间,只有在取地址或者定义为全局变量在其他文件中使用时才分配内存空间) (2)const与指针 1 const int* p1 = &a; //p1是指向常量a的指针,a的值不能通过指针p1改变 2 3 int* const p2 =&b; //p2是只能指向b的指针,b的值可以通过p2改变

内部链接和外部链接以及const对象在头文件中的若干问题

首先我们看一段示例代码: t1.h [cpp] view plaincopyprint? #ifndef T1_H_ #define T1_H_ #include "t2.h" #ifndef HHH #define HHH int da = 5; #endif #endif #ifndef T1_H_ #define T1_H_ #include "t2.h" #ifndef HHH #define HHH int da = 5; #endif #endif t2

const在c中和c++中

在C语言中 1 2 3 4 5 6 7 void main(){     const int i = 0;     int *j = (int *)&i;     *j = 1;     printf("%d,%d", i, *j);     system("pause"); } 结果输出为1,1 在C++中 1 2 3 4 5 6 7 8 9 10 #include<iostream> using namespace std; int main

PHP 面向对象中常见关键字使用(final、static、const和instanceof)

PHP 面向对象中常见关键字的使用: 00x1.Final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用final标识的成员方法,在子类中不能覆盖. 总结:final表示为最终的意思,所以使用final关键字的类或者类中的成员方法是不能被更改的. 00x2.Static :static关键字将类中的成员属性或者成员方法标识为静态的,static标识的成员属性属于整个类,static成员总是唯一存在的,

C++中 容易忽视的const 修饰符

C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误!(如类型不匹配问题) (2)编译器处理方式不同.define宏是在预处理阶段展开,const常量是编译运行阶段使用. (3)存储方式不同.define宏仅仅是展开,有很多地方使用,就展开多少次,不会分配内存.const常量会在内存

C++总结:C++中的const和constexpr

C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error. 对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变).C++中采用的是物理常量性,例如下面的例子: 1 2 3 4 5 6 7 struct A {     int *ptr; }; int k = 5, r = 6;

c++中const关键字全面总结

一.const作用 1.const定义常量 注意:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用. (1)const修饰变量,以下两种定义形式在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的. TYPE const ValueName = value; const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初

C++中const

[const] 0.普通const对象定义在栈空间中 { int a = 10; const int b = 100; cout << &a << ' ' << &b; } Result: 0x22abec 0x22abe8 注:Code::Blocks + Cygwin测得. 1.对变量类型加以限定,使之不能被修改: const int e1 = 100; e1 = 101; // error 2.const对象必须被初始化: const int e2

C++中const用法总结

1. const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变.例如:const int nValue:         //nValue是constint const nValue:    // nValue是const但是对于指针类型的TYPE,