①//================================================================================================================================
结构体定义的细节 总结自 http://www.kuqin.com/language/20090406/44443.html
typedef struct AAA //AAA是临时类型名
{ //这是c风格的,所以在c++中需注意★
struct AAA *next; //自引时只能这么写
}aaa; //aaa是结构体 类型名,★使用时需要 实例化一个变量
struct BBB //BBB是 结构体 类型名
{ //这是C\C++风格的
BBB *bbb; //只有c++里能这么写
};
struct CCC //类型名,可缺省
{ //这是C++风格的
}ccc; //ccc是结构体 变量名(有实体的对象)
。。。本来还算清楚。。看了这文章。。更不清楚了— —...
==============================================这个写得更清楚。。。http://www.cppblog.com/percyph/archive/2009/03/06/75742.html
分三块来讲述:
1 首先:
在C中定义一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1;来声明
这里的Stu实际上就是struct Student的别名。
另外这里也可以不写Student(于是也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;
但在c++里很简单,直接
struct Student
{
int a;
};
于是就定义了结构体类型Student,声明变量时直接Student stu2;
===========================================
2其次:
在c++中如果用typedef的话,又会造成区别:
struct Student
{
int a;
}stu1;//stu1是一个变量
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型
使用时可以直接访问stu1.a
但是stu2则必须先 stu2 s2;
然后 s2.a=10;
===========================================
3 掌握上面两条就可以了,不过最后我们探讨个没多大关系的问题
如果在c程序中我们写:
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;
这算什么呢?
我个人观察编译器(VC6)的理解,这相当于
typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;
也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。
②//===================================================================================================
inline关键字修饰的函数、在类内定义的函数;
1、在内联函数内不允许用循环语句和开关语句。 如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码,递归函数(自己调用自己的函数)是不能被用来做内联函数的。
2、内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。
③//================================================================================================================
C++ 类 中的静态变量、静态成员函数
</pre><pre name="code" class="cpp">class CPoint
{
static void init( ); //在类定义时就有了(已经分配了内存),不需对象化即可直接使用。像这样:CPoint::init();
static int x;
int y;
}
int CPoint::x=0; //静态成员变量需要这样初始化。
void CPoint::init()
{
cout<<x; //√ init()可以访问x(∵x是静态的),
cout<<y; //× 但访问不了y(∵CPoint还未实例化时y还没有分配)
}
④//=================================================================================================================================
void printBT1(BTree *T) //执行时:BTree tree; printBT1(&tree);
{
if(*T==NULL){cout<<'#';return;}
cout<< (*T)->data;
printBT1( &(*T)->lc );
printBT1( &(*T)->rc );
}
void printBT2(BTree T) //执行时:BTree tree; printBT2(tree);
{
if(T==NULL){cout<<'#';return;}
cout<< T->data;
printBT2( T->lc );
printBT2( T->rc );
}
这两个输出结果是相同的,只是前者容易误操作,改动 T 的原值。。以此来熟悉 对象 传参。
⑤//=================================================================================================================================
typedef struct Node{
}Node,*Tree;
main(){
Tree T=new Node(); //√
Node N=new Node(); //×
} //注:new 返回的是个地址,所以应该传给指针变量;
//上例中别看名字貌似都一样,还要看类型!要保证传向的目标是个能存地址的。
⑥//=================================================================================================================================
class A
{}
class B
{
A *a;
}
class C
{
B **b;//动态初始化二维数组;
if(b[][].a){cout<<"do sth.";}
//★这里用的是 . 而非 -> //没搞明白为啥,b不是个指针吗?
}
⑦//================================================================================================================================
关于fstream fin;
虽说 fin>>b;的过程会抛弃空格类符号。但是,如果 文件最末尾是 回车、空格、tab,那么文件是没有到达 结尾的,依然会占用一次输入流,只不过这次读取不到任何值而已。 //如果需要用读取次数计数的话,就要注意这里了。