偶然发现一个好玩的东西

软件和网站开发以及相关技术探讨
回复
stareven
帖子: 42
注册时间: 2011-04-27 10:21

偶然发现一个好玩的东西

#1

帖子 stareven » 2013-11-30 11:08

自己瞎做实验的时候偶然发现的。
[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]
头像
qgymib
帖子: 539
注册时间: 2010-04-02 16:44
系统: openSUSE 13.2 x64

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

#2

帖子 qgymib » 2013-11-30 16:42

C++里面明确了static类型变量的初始化必须在类外,所以第二种当然会出错了。
正在建设中的个人博客
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

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

#3

帖子 cjxgm » 2013-11-30 17:24

LS+1
明明是LZ没好好学C++嘛
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
stareven
帖子: 42
注册时间: 2011-04-27 10:21

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

#4

帖子 stareven » 2013-11-30 20:57

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]
stareven
帖子: 42
注册时间: 2011-04-27 10:21

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

#5

帖子 stareven » 2013-11-30 21:02

cjxgm 写了:LS+1
明明是LZ没好好学C++嘛
哈哈~确实是不太好~~ :em05
头像
qgymib
帖子: 539
注册时间: 2010-04-02 16:44
系统: openSUSE 13.2 x64

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

#6

帖子 qgymib » 2013-12-01 11:58

回去翻了翻课本,然后参照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++
正在建设中的个人博客
stareven
帖子: 42
注册时间: 2011-04-27 10:21

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

#7

帖子 stareven » 2013-12-01 16:48

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++

纯属好奇,贴出来其实就是指望着有谁能帮我找出答案的哈哈~改天好好看看。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

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

#8

帖子 sarrow » 2013-12-02 11:19

这种问题是与编辑器的具体实现相关的。甚至不同的优化级别也可能会导致不同的结果;

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

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

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

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

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