分页: 1 / 1

偶然发现一个好玩的东西

发表于 : 2013-11-30 11:08
stareven
自己瞎做实验的时候偶然发现的。
[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]

Re: 偶然发现一个好玩的东西

发表于 : 2013-11-30 16:42
qgymib
C++里面明确了static类型变量的初始化必须在类外,所以第二种当然会出错了。

Re: 偶然发现一个好玩的东西

发表于 : 2013-11-30 17:24
cjxgm
LS+1
明明是LZ没好好学C++嘛

Re: 偶然发现一个好玩的东西

发表于 : 2013-11-30 20:57
stareven
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]

Re: 偶然发现一个好玩的东西

发表于 : 2013-11-30 21:02
stareven
cjxgm 写了:LS+1
明明是LZ没好好学C++嘛
哈哈~确实是不太好~~ :em05

Re: 偶然发现一个好玩的东西

发表于 : 2013-12-01 11:58
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++

Re: 偶然发现一个好玩的东西

发表于 : 2013-12-01 16:48
stareven
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++

纯属好奇,贴出来其实就是指望着有谁能帮我找出答案的哈哈~改天好好看看。

Re: 偶然发现一个好玩的东西

发表于 : 2013-12-02 11:19
sarrow
这种问题是与编辑器的具体实现相关的。甚至不同的优化级别也可能会导致不同的结果;

一般,如果不对常静态变量取地址,而只是获取其值,编译器一般是做替换处理;

如果有取地址操作,编译器一般会分配一个存储空间给它——但取值的时候, 还是用的替换;

——这里说的替换处理,主要针对 plain old data;至于复杂的类型,其行为看起来就比较正常了;也就不在楼主的疑惑之内了。

另外,提一点小建议:学C++语言,请把视角挪高一点!

太低,你会浪费很多时间的。