Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988585
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 10:42:22

struct foo
{
    int foo;
};
如果按照C++标准,上述代码合不合法?

[附]
a. vc2005 认为它不合法。
b. g++3.4.2 认为它合法,仅当出现构造函数时,才认为它不合法。比如
struct foo
{
    int foo;
    foo();
};
g++3.4.2 认为它不合法。
阅读(3202) | 评论(20) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 10:44:33

清风雨
1. 我觉得pAnic的说法也不错。 当然,就现在C++不提供也不是很紧要。

2.这和喜不喜欢goto没有什么必然关系(我个人,也并不完全反对goto)。goto并不能直接实现break和contniue上层的能力,需要一点点配合。,当习惯于break和continue,我想break或contniue更上层的循环时,如果得用goto,那种别扭感也就发生了(既然有break本层的,为什么没有break上一层或更上一层的呢?)。如果别的技巧,那种书写代码的优雅感也就流失了不少。——有时会为我这个技巧还高兴一会,但更多的是事后的流失感。

3. 如果站在用户的角度,就不管内部有什么理由了。至于我是否区分,那也是我的事(这个问题,我可能不能多说了^_^,我不懂windows SEH的。但是,站在外层,我是不管内部原因的)。finally提供了一个统一的一定的出口(最重要的是在catch里面发生了异常时),使得编码更容易也更易理解,并没要求一定要做释放工作。另,GC只对内存有效吧!

网友评论2012-11-20 10:44:24

luoda254
周星星你好,我是C++初学者,我遇到了问题,向您求援,
CPerson *pPerson=new CPerson;
void (CPerson::*pfn)();
pfn=&CPerson::fun;
如果CPerson::fun()是虚函数,则(pPerson->*pfn)()执行的是派生类中的fun(),而我想调用CPerson::作用域下的fun(),应该怎么写啊?

网友评论2012-11-20 10:44:13

周星星
re pAnic: 我觉得不必要,因为你完全可以命名一个不同的名字。

re 清风雨:
a. Java中不也就是C++中goto一样的功能嘛,我知道很多人无理由的看不起goto,既然这样的话我建议你写一个宏:#define this_is_not_goto goto,也许你心里会好过写。
[注]:很多人说goto会 破坏结构 和 影响逻辑,我不这样认为,因为 破坏结构 和 影响逻辑 并不是 goto 的固有属性,任何东西,甚至是int,如果用在错误的地方,同样也 破坏结构 和 影响逻辑。
有人说goto会破坏面向对象的逻辑,这是对的,但一个优秀的设计,其对象作用域应当是自我封闭的(也就是说,如果它是扩散的,应当使用{}进行作用域限定),只能说goto并不具有容纳烂设计的能力,这很难说就是goto的不对。
b. 如果你真的了解windows SEH和C++ exception的不同你就不会这样说了,SEH是不可以用于非封闭类的,也就是说它只可以用于面向过程的代码中;C++

网友评论2012-11-20 10:43:54

清风雨
其实还有一点,java的label的break和continue最好C++也能支持。要不C++得用别扭得多得方式来做到,或者是goto或者是别的技巧。
a:
for()
{
b: for()
{
c: for()
{
}
}
}

这样对这种嵌套的循环,想中止跳出哪层就方便的多了,代码看起来也舒服。

还有一个finally,虽然那位发明人说了很多的理由,但,我还是趋向于请您提供吧!不要把个人技巧和语言支持混在了一起来做为语言不支持的理由(其实,我想说借口:})。而且,事实也是,好多人改用了MS的__finally了。—— 还好,反正我在C++里面不用异常。

网友评论2012-11-20 10:43:43

pAnic
呵呵,也许未来的C/C++标准需要对不同层次的名称引用作一些规范,顺便让用户能够访问那些不冲突但是无法直接访问的变量。
例如:
int i; //global
for()
{
int i; //OK
for()
{
int i; //这里已经无法直接访问前面那个i了。
//但是仍可以用
::i;
//来访问全局的i