自己瞎做实验的时候偶然发现的。
[cpp]
#include <iostream>
#include <string>
using namespace std;
class Constants {
public:
static const int INT;
};
const int Constants::INT = 10;
int main()
{
cout << &Constants::INT << endl;
}
[/cpp]
上面那个是正常的,底下的那个就会链接出错哈~
[cpp]
#include <iostream>
#include <string>
using namespace std;
class Constants {
public:
static const int INT = 10;
};
int main()
{
cout << &Constants::INT << endl;
}
[/cpp]
偶然发现一个好玩的东西
-
- 帖子: 42
- 注册时间: 2011-04-27 10:21
- qgymib
- 帖子: 539
- 注册时间: 2010-04-02 16:44
- 系统: openSUSE 13.2 x64
- cjxgm
- 帖子: 1952
- 注册时间: 2010-04-23 20:40
- 系统: Arch Linux
- 来自: 浙江·杭州
- 联系:
Re: 偶然发现一个好玩的东西
LS+1
明明是LZ没好好学C++嘛
明明是LZ没好好学C++嘛
-
- 帖子: 42
- 注册时间: 2011-04-27 10:21
Re: 偶然发现一个好玩的东西
我觉得你可以试试这个再说~~qgymib 写了:C++里面明确了static类型变量的初始化必须在类外,所以第二种当然会出错了。
[cpp]
#include <iostream>
#include <string>
using namespace std;
class Constants {
public:
static const int INT = 10;
};
int main()
{
cout << Constants::INT << endl;
//cout << &Constants::INT << endl;
return 0;
}
[/cpp]
-
- 帖子: 42
- 注册时间: 2011-04-27 10:21
Re: 偶然发现一个好玩的东西
哈哈~确实是不太好~~cjxgm 写了:LS+1
明明是LZ没好好学C++嘛
- qgymib
- 帖子: 539
- 注册时间: 2010-04-02 16:44
- 系统: openSUSE 13.2 x64
Re: 偶然发现一个好玩的东西
回去翻了翻课本,然后参照http://blog.sina.com.cn/s/blog_60be7ec80100gzhm.html
然后根据http://blog.csdn.net/sevenshal/article/details/9173861
难怪说
猜测:取地址其实是类内部的操作?在借阅《Thinking in c++》中文版188页和做了相关实验后,我认为若在类内使用的话,static const 则必须在static const 定义之处进行初始化。
然后根据http://blog.csdn.net/sevenshal/article/details/9173861
代码: 全选
class A
{
static const int a =1;
}
说的很明确。。。此时的 const static常量既不存在于动态区也不存在与静态区(应该是存在于常量区或代码区。。。),而是由编译器在编译期间就直接进行了值替换。也因为这个原因不可以对其进行取地址操作,因为他根本没有地址。
难怪说
程序员最大的错觉是自己会c++
正在建设中的个人博客
-
- 帖子: 42
- 注册时间: 2011-04-27 10:21
Re: 偶然发现一个好玩的东西
qgymib 写了:回去翻了翻课本,然后参照http://blog.sina.com.cn/s/blog_60be7ec80100gzhm.html猜测:取地址其实是类内部的操作?在借阅《Thinking in c++》中文版188页和做了相关实验后,我认为若在类内使用的话,static const 则必须在static const 定义之处进行初始化。
然后根据http://blog.csdn.net/sevenshal/article/details/9173861代码: 全选
class A { static const int a =1; }
说的很明确。。。此时的 const static常量既不存在于动态区也不存在与静态区(应该是存在于常量区或代码区。。。),而是由编译器在编译期间就直接进行了值替换。也因为这个原因不可以对其进行取地址操作,因为他根本没有地址。
难怪说程序员最大的错觉是自己会c++
纯属好奇,贴出来其实就是指望着有谁能帮我找出答案的哈哈~改天好好看看。
-
- 帖子: 403
- 注册时间: 2007-10-27 1:04
Re: 偶然发现一个好玩的东西
这种问题是与编辑器的具体实现相关的。甚至不同的优化级别也可能会导致不同的结果;
一般,如果不对常静态变量取地址,而只是获取其值,编译器一般是做替换处理;
如果有取地址操作,编译器一般会分配一个存储空间给它——但取值的时候, 还是用的替换;
——这里说的替换处理,主要针对 plain old data;至于复杂的类型,其行为看起来就比较正常了;也就不在楼主的疑惑之内了。
另外,提一点小建议:学C++语言,请把视角挪高一点!
太低,你会浪费很多时间的。
一般,如果不对常静态变量取地址,而只是获取其值,编译器一般是做替换处理;
如果有取地址操作,编译器一般会分配一个存储空间给它——但取值的时候, 还是用的替换;
——这里说的替换处理,主要针对 plain old data;至于复杂的类型,其行为看起来就比较正常了;也就不在楼主的疑惑之内了。
另外,提一点小建议:学C++语言,请把视角挪高一点!
太低,你会浪费很多时间的。