C++ | C++中的关键字const修饰符
关键字const的含义
- 定义
cons
t常量;
-
const
可以修饰函数的参数和返回值,在C++中,还可以修饰函数的定义体
被const
修饰的东西都受到保护,可以防止意外的改动,能提高程序的健壮性;
扩展:
下面声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
- 前两个的作用是一样,
a
是一个常整型数
- 第三个意味着
a
是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)
- 第四个意思
a
是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)
- 最后一个意味着
a
是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)
C++中的 const
更像编译阶段的 #define
实例1(c):
#include
int main(int argc, char* argv[])
{
const int a = 100;
int *p;
p = (int *)&a;
printf("*p = %dn", *p);
*p = 99;
printf("a = %dn", a);
return 0;
}
编译、运行:
lanfeiy@yelanfei ~/workspace/test
$ make -f c.mk const
gcc -o const const.c -g -Wall
lanfeiy@yelanfei ~/workspace/test
$ ./const.exe
*p = 100
a = 99
实例2(c++):
#include
using namespace std;
int main(void)
{
const int a = 100;
int *p = NULL;
p = (int *)&a;
cout *p = 99;
cout
return 0;
}
编译、运行:
lanfeiy@yelanfei ~/workspace/test
$ make -f cpp.mk constCpp
g++ -o constCpp constCpp.cpp -g -Wall
lanfeiy@yelanfei ~/workspace/test
$ ./constCpp.exe
*p = 100
a = 100
C和C++对 const
的处理方式的差异:C语言对 const
的处理和普通变量一样,会到内存中读取数据;C++ 对 const
的处理更像是编译时期的#define
,是一个值替换的过程。
C++中全局 const
变量的可见范围是当前文件
实例3:
源文件1:
#include
const int a = 100;
extern void func(void);
int main(int argc, char* argv[])
{
printf("%s->a = %dn", __func__, a);
func();
return 0;
}
源文件2:
#include
extern const int a;
void func(void)
{
printf("%s-> a = %dn", __func__ , a);
}
编译Makefile(使用C语言方式编译):
CC = gcc
BIN = test.bin
SRC = src1.c
src2.c
CFLAGS = -g -Wall
all:
$(CC) -o $(BIN) $(SRC) $(CFLAGS)
clean:
$(RM) $(BIN) a.out *.*.sw?
.PHONY:all clean
编译、运行:
lanfeiy@yelanfei ~/workspace/test/const_c
$ make
gcc -o test.bin src1.c src2.c -g -Wall
lanfeiy@yelanfei ~/workspace/test/const_c
$ ./test.bin
main->a = 100
func-> a = 100
修改Makefile(使用C++的方式来编译):
CC = g++
BIN = test.bin
SRC = src1.c
src2.c
CFLAGS = -g -Wall
all:
$(CC) -o $(BIN) $(SRC) $(CFLAGS)
clean:
$(RM) $(BIN) a.out *.*.sw?
.PHONY:all clean
编译报错,提示变量找不到:
lanfeiy@yelanfei ~/workspace/test/const_c
$ make
g++ -o test.bin src1.c src2.c -g -Wall
/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccHO3gh2.o:src2.c:(.rdata$.refptr.a[.refptr.a]+0x0): undefined reference to `a'
collect2: error: ld returned 1 exit status
make: *** [Makefile:9: all] Error 1
这是因为 C++ 对 const
的特性做了调整,C++ 规定,全局 const
变量的作用域仍然是当前文件,但是它在其他文件中是不可见的,这和添加了static
关键字的效果类似。虽然代码段2中使用 extern
声明了变量 a
,但是在链接时却找不到代码段1中的 a
。
改进版(For C++):
文件1:
/*******************************************************************
* > File Name: main.cpp
* > Create Time: Wed Sep 1 16:31:56 2021
******************************************************************/
#include
#include "mod.hpp"
using namespace std;
int main(void)
{
cout a = ";
cout func();
return 0;
}
文件2:
/*******************************************************************
* > File Name: mod.cpp
* > Create Time: Wed Sep 1 16:32:39 2021
******************************************************************/
#include
#include "mod.hpp"
using namespace std;
void func(void)
{
cout a = ";
cout }
文件3(头文件):
/*******************************************************************
* > File Name: mod.hpp
* > Create Time: Wed Sep 1 16:32:39 2021
******************************************************************/
#ifndef __MOD_HPP__
#define __MOD_HPP__
const int a = 100;
void func(void);
#endif /* __MOD_HPP__ */
文件4(编译用Makefile):
CC = g++
BIN = test.bin
SRC = main.cpp
mod.cpp
CFLAGS = -g -Wall
all:
$(CC) -o $(BIN) $(SRC) $(CFLAGS)
clean:
$(RM) $(BIN) a.out *.*.sw?
.PHONY: all clean
编译、运行:
lanfeiy@yelanfei ~/workspace/test/const_c/cpp
$ make
g++ -o test.bin main.cpp mod.cpp -g -Wall
lanfeiy@yelanfei ~/workspace/test/const_c/cpp
$ ./test.bin
main -> a = 100
func -> a = 100
C和C++中全局 const
变量的作用域相同,都是当前文件,不同的是它们的可见范围:C语言中 const
全局变量的可见范围是整个程序,在其他文件中使用 extern
声明后就可以使用;而C++中 const
全局变量的可见范围仅限于当前文件,在其他文件中不可见,所以它可以定义在头文件中,多次引入后也不会出错。
这种方法适用于GCC,在VS、VC中可能不适用。
总结
C++ 中的const
变量虽然也会占用内存,也能使用&
获取得它的地址,但是在使用时却更像编译时期的#define
;#define
也是值替换,可见范围也仅限于当前文件。
很多C++教程在对比 const
和 #define
的优缺点时提到,#define
定义的常量仅仅是字符串的替换,不会进行类型检查,而 const
定义的常量是有类型的,编译器会进行类型检查,相对来说比 #define
更安全,所以鼓励大家使用 const
代替 #define
。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net