C\C++知识点累加器

①//================================================================================================================================

 结构体定义的细节 总结自 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;
===========================================
掌握上面两条就可以了,不过最后我们探讨个没多大关系的问题
如果在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,那么文件是没有到达 结尾的,依然会占用一次输入流,只不过这次读取不到任何值而已。 //如果需要用读取次数计数的话,就要注意这里了。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值