我很清楚类和结构之间的区别,但是我很难权威地说这是否定义得很好:
// declare foo (struct)
struct foo;
// define foo (class)
class foo {
};
// instance of foo, claiming to be a struct again! Well defined?
struct foo bar;
// mixing class and struct like this upsets at least one compiler (names are mangled differently)
const foo& test() {
return bar;
}
int main() {
test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果这是未定义的行为,有人可以指向权威(即ISO的章节和经文)参考的方向吗?
处理这个问题的编译器(Carbide 2.7)相对较旧,我尝试过的所有其他编译器对此都非常满意,但显然没有任何证据.
我的直觉是这应该是未定义的行为,但我找不到任何证实这一点,我很惊讶没有GCC版本或Comeau这么多警告它.
我在类的C++前向声明中发现了一个错误,它被错误地声明为struct Book
而不是class Book
.我认为Book曾经是一个结构,变成了一个类,但前向声明仍然存在.
Book.h:
class Book {
...
};
Run Code Online (Sandbox Code Playgroud)
Library.h:
struct Book;
class Library {
std::vector<Book*> books;
};
Run Code Online (Sandbox Code Playgroud)
没有编译器警告,结果程序似乎工作正常.这让我很好奇:理论上,这会不会引起问题?它只是一个指针,是的,但是,例如,如果类有虚方法,多继承,指针可能不同吗?
我知道关于默认公共/私有的类/结构之间的区别,但我特别询问前向声明和交换它们的可能后果.
在C ++中声明类指针变量时,何时以及为什么我们应该使用'struct'关键字?
我已经在嵌入式环境中看到了这一点,所以我怀疑这是C的一种保留。我已经看到了很多有关在声明struct对象时何时使用'struct'关键字的解释,因为它与C中的名称空间相关(在这里),但是我找不到任何人在谈论为什么在声明类指针变量时可能会使用它。
例如,在CFoo.h中:
class CFoo
{
public:
int doStuff();
};
inline Foo::doStuff()
{
return 7;
}
Run Code Online (Sandbox Code Playgroud)
后来在另一个类中:
void CBar::interesting()
{
struct CFoo *pCFoo;
// Go on to do something interesting with pCFoo...
}
Run Code Online (Sandbox Code Playgroud)