Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确使用外部变量?_C++_Constants - Fatal编程技术网

C++ 如何正确使用外部变量?

C++ 如何正确使用外部变量?,c++,constants,C++,Constants,问题1: 我最近读了一本书《C++初级读本》,读到以下内容: 要替换变量的值,编译器必须查看变量的初始值设定项。当我们将一个程序拆分为多个文件时,每个使用常量的文件都必须有权访问其初始值设定项。为了查看初始值设定项,必须在每个要使用变量值的文件中定义变量 我有一个问题:当我使用其他文件中定义的变量时,我只需使用extern来声明就足够了,为什么必须访问其初始值设定项,所以我做了一个测试: 在main.cpp中,我写道: #include <iostream> using names

问题1: 我最近读了一本书《C++初级读本》,读到以下内容:

要替换变量的值,编译器必须查看变量的初始值设定项。当我们将一个程序拆分为多个文件时,每个使用常量的文件都必须有权访问其初始值设定项。为了查看初始值设定项,必须在每个要使用变量值的文件中定义变量

我有一个问题:当我使用其他文件中定义的变量时,我只需使用
extern
来声明就足够了,为什么
必须访问其初始值设定项
,所以我做了一个测试:

在main.cpp中,我写道:

#include <iostream>

using namespace std;
extern int test;

int main()
{
    cout << test << endl;
    return 0;
}
int test = 100;
顺便说一句,这两个文件添加到同一个项目中,否则将无法成功构建。 当我运行它们时,它会打印出来

一百

就像我预料的那样。但在main.cpp中,我不需要像书中说的那样定义
inttest=100
。我不知道谁是对的

问题2:

我在gcc 4.7和visual studio 2013中进行了测试,它们都得到了相同的结果,
r变了。那么,
const
的意义是什么?r不应该总是43吗?

我认为这本书中的引语有如下含义

const size_t N = 10;

int main()
{
    int a[N];
    //...
}
如果常数N是在其他具有说明符
extern
的模块中定义的,则在具有main的模块中,编译器无法访问常数的值,因此无法定义数组

extern const size_t N;

int main()
{
    int a[N]; // error: the value N is unknown
    //...
}
由于这个原因,常数具有内部链接,可以在编译时需要其值的每个模块中定义它们

至于第二个问题,则使用常量引用,以防止使用引用修改被引用对象

例如,如果希望某个函数不会更改复合对象,可以将其参数声明为对该对象的常量引用

此外,临时对象也绑定到常量引用

举个例子

void display_string( const std::string &s )
{
    std::cout << s << std::endl;
}
编译器隐式地将字符串文本转换为类型为
std::string
的临时对象,并将其绑定到参数的常量引用

如果参数不会像常量引用那样声明,例如

display_string( "Hello, World" );
void display_string( std::string &s );
然后编译器将发出一个错误

使用常量引用时,假定客户端代码不会更改引用的对象本身


也就是说,客户端代码可以查看对象,但不能用手触摸对象。:)

Q1
有权访问其初始值设定项
意味着编译器需要知道变量的初始值设定项(定义)。您可以通过将main.cpp和test.cpp链接在一起,让编译器实现这一点。您说过,
这两个文件添加到相同的项目中,所以IDE将为您这样做。
您可以在上找到更多信息


问题2。编译器不允许您更改
r
的值,因为它是对常量变量的引用,但
i
是一个整数变量,所以您可以更改它的值。

如何编译
const int&r=i?书中的引用提到了
const
。关于你的第二个(也是不相关的)问题,你知道参考文献是如何工作的,对吗?@rel这是完全正确的,这与在函数中使用常量引用参数并传递值或非常量变量没有什么不同。如果编译器实际上不知道常量值,如何知道编译时常量?这就是引用的内容。请注意,可以在不知道值的情况下使用
const
变量,但它不再是编译时常量,编译器不能在优化中使用常量值。
void display_string( std::string &s );