const对象仅在文件内有效

  当以编译时初始化的方式定义一个const对象时,编译器将在编译的过程中把用到该变量的地方都替换成对应的值。为了执行替换,编译器必须知道变量的初始值。如果程序包含多个文件,则每个用了const对象的文件都必须得能访问到它的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都有对它的定义。为了支持这一用法,同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效。当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。

例子:

1 // file_1.h
2 #ifndef FILE_1
3 #define FILE_1
4 void f();
5 #endif
1 // func.cpp
2 #include <file_1.h>
3 #include <iostream>
4
5 const int x = 998;
6 void f()
7 {
8     std::cout << "func:&x " << &x << std::endl;
9 }
 1 // main.cpp
 2 #include <iostream>
 3 #include <string>
 4 #include <file_1.h>
 5
 6 const int x = 998;
 7 int main()
 8 {
 9     f();
10     std::cout << "main:&x: "<<&x << std::endl;
11     return 0;
12 }

输出:

x的地址完全不一样,说明2个x变量时独立的,不是同一个。

  如果想要在不同的文件间共享同一个const变量怎么办,方法是对于const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就好了。

例子:

1 // file_1.h
2 #ifndef FILE_1
3 #define FILE_1
4 extern const int x;
5 void f();
6 #endif
1 // func.cpp
2 #include <file_1.h>
3 #include <iostream>
4
5 extern const int x = 998;
6 void f()
7 {
8     std::cout << "func:&x " << &x << std::endl;
9 }
 1 // main.cpp
 2 #include <iostream>
 3 #include <string>
 4 #include <file_1.h>
 5
 6 extern const int x;
 7 int main()
 8 {
 9     f();
10     std::cout << "main:&x: "<<&x << std::endl;
11     return 0;
12 }

输出:

地址一样,说明是同一个变量

原文地址:https://www.cnblogs.com/ACGame/p/10053488.html

时间: 2024-10-06 10:31:03

const对象仅在文件内有效的相关文章

const对象仅在文件内有效-谈extern/作用域

<C++ Primer>中指出,const对象仅在文件内有效(2.4章 page54). WHAT? const对象 :分两步 - 1,找到对象 2,加const (注意陷阱) 文件内 :指的是在一个项目中,相互独立的文件.即没有#include! 1 const int i = 10; // ok 2 const char* s1 = "Do not use include"; // error! is not const-object 3 char* const s2

内部链接和外部链接以及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对象默认为文件的局部变量

const限定符可以将一个对象转换为一个常量.因为常量在定义后就不能被修改,所以定义时必须初始化. 在全局作用域里定义非const变量时,它在整个程序中都可以访问.例如: //file1.cpp int counter; //definitaion //file2.cpp extern int counter; //use counter in file1 与其他变量不同,除非特别说明,在全局作用域声明的const变量时定义该对象的文件的局部变量.此变量只能在那个文件中,不能被其他文件访问. 通

const 对象默认为文件的局部变量

在全局作用域中定义非const变量时,它在整个应用程序中都可以访问,如果是const变量那么它只是在当前文件中的局部变量. 我们知道如果要一个变量在其他文件中也可使用的话我们可以用extern标识变量即可,默认非const型的变量为extern 1.cpp extern int number;//声明了一个number变量,他会在其他模块寻找定义 int main(){ cout<<number<<endl;//number是100 } 2.cpp int number=100;/

const对象默认是static的,而不是extern的

const 和 static 变量,可以放在头文件中 const对象默认是static的,而不是extern的,所以即使放在头文件中声明和定义.多个cpp引用同一个头文件,互相也没有感知,所以不会导致重复定义. 类(class)的定义,可以放在头文件中 用类创建对象的时候,编译器要知道对象如何布局才能分配内存,因此类的定义需要在头文件中.一般情况下,我们把类内成员函数的定义放在cpp文件中,但是如果直接在class中完成函数声明+定义的话,这种函数会被编译器当作inline的,因此满足上面inl

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

hibernate 对象关系映射文件详解

POJO 类和数据库的映射文件*.hbm.xml POJO类和关系数据库之间的映射可以用一个XML文档来定义. 映射文件的扩展名为.hbm.xml 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系 映射文件说明 hibernate-mapping 类层次:class 主键:id 基本类型:property 实体引用类: many-to-one

(三)详解对象-关系映射文件

一.Hibernate中持久化类编写规范 -必须提供无参数的默认构造方法.因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例. -所有属性必须提供public访问控制符的set get方法 -属性应尽量使用基本数据类型的包装类型(如Integer) 基本数据类型无法表达null值,所有基本数据类型的默认值都不是null,这样就有很大的缺陷. 例如有一个score属性,表示学生分数,如果为0,那么是表示该学生未参加考试还是说该学生成绩为0呢? 这时候如果用包装类型,就可以

利用EJS查找可用的Google搜索服务器IP,并缓存入系统Hosts文件内

此博客为9925.org的镜像,登录9925.org可以查看到最新博文. 原文出处:http://ily.so/qi2ENn 搜索可用的Google搜索服务器IP,并将搜索结果缓存入系统Hosts文件内. 提示:此脚本在R5以上版本的EJS脚本IDE工具内可成功解释运行. clear(); console.info("/**************************版权声明**************************/"); console.info("/*