标签:
// 不知道下面是个declaration还是invocation // 直到看到整数常量1024才能确定 int (*pf)(1024);而在下面这个声明中,像上面那样的"向前预览(lookahead)"甚至起不了作用:
// meta-language rule: // pq的一个declaration,而不是invocation int (*pq)();当语言无法区分是一个声明还是一个表达式(expression)时,需要一个超越语言范围的规则,而该规则会将上述表达式判断为一个"声明".
// struct名称(或class名称)暂时省略
{
public:
virtual void foo();
protected:
static int object_count;
};
事实上可以它是一个struct,也可以说它是个class,这两种声明的观念上的意义取决于对"声明"本身的检验。struct mumber {
/* stuff */
char pc[1];
};
// 从档案或标准输入装置中取得一个字符串
// 然后为struct本身和该字符串配置足够的内存
struct mumble *pmumbl = (struct mumble *)
malloc(sizeof(struct mumble) + strlen(string) + 1);
strcpy(&memble.pc, string);
如果改用class来声明,而该class是:struct C_Point {...};
class Point : public C_point {...}
于是C和C++两种用法都可获得支持:extern void draw_line(Point, Point); draw_line(Point(0, 0), Point(100, 100)); draw_rect(Point(0, 0), Point(100, 100));这种习惯用法现已不再被推荐,因为某些编译器在支持virtual function的机制中对于class的继承布局做了一些改变,组合(composition),而非继承,才是把C和C++结合在一起的唯一可行方法(conversion运算符提供了一个十分编译的萃取方法):
struct C_point {...};
class Point {
public:
operator C_point() { return _c_point; }
private:
C_point _c_point;
}; C struct在C++中的一个合理用途,是当需要传递"一个复杂的class object的全部或部分"到某个C函数中去时,struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局,然而这项保证只在组合(composition)的情况下才存在。如果是"继承"而不是"组合",编译器会决定是否应该有额外的data members被安排到base struct subobject中。版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/47115277