随笔 - 55  文章 - 15  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

Static:静态存储,内部链接。
1.函数内部的静态变量
内部类型:在定义的时候初始化,如果未初始化,编译器将其设置为0.
自定义类型:在定义的时候调用构造函数,如未传递参数,调用默认构造函数。包含局部对象的函数如果未被调用,则该局部对象不会构造,也不会析构。
void f()
{
 static Obj b('b');
}
void g()
{
 Obj c('c');
}
int main()
{
return 0;
}// no constructor both c and b

内部链接的好处是,可以将这个名字放在头文件中而不用担心链接时发生冲突。(链接时发现多个同一名字的定义会报错,不知道该链接哪一个了)。通常将变量、内联函数放在头文件中,因为这些默认是内联的。链接只引用那些在链接/装载期间有地址的成员,因此类声明和局部变量并不链接。

2.全局变量
static int a = 0;//definition, internal linkage, static storage area

extern int b = 0;//definition,external linkage, static storage area
3。局部变量:
static只改变变量的存储类型。而extern只是用作声明,表示某处已经存在一个存储区。
4。函数名:
只改变可见性,static 仅该翻译单元可见,extern(默认)外部可见。

名字空间解决冲突
1)只能在全局范围内定义,可以相互嵌套
2)定义结尾处不需要有分号
3)可以在多个头文件中用一个标识符
4)可以用另一个名字空间做别名
namespace longName
{
  int i = 0;
}

namespace LN = longName;
5)不能创建实例
每个翻译单元只能有一个未命名的名字空间,默认为内部链接。
namespace{
class A{};
class B{};
int i, j , k;
}
可以在一个名字空间的类定义之内插入一个友元声明,该友元自动成为该名字空间的一员。
namespace Me
{
  class Us{
  friend void you();// you is member of namespace Me
  };
}
使用名字空间
using 声明
namespace  U
{
  inline void f(){}
  inline void g(){}
}

namespae V
{
  inline void f(){}
  inline void g(){}
  inline void g(int){}
  inline char g(char){return 'a';}
}

void h()
{
  using namespace U;
  using V::g;//没有类型方面的信息,声明了这个空间中的所有重载函数
  g();
  g(1);
  g('b');
  U::g();
}
不要在头文件中使用using namespace ...会污染所有包含该头文件的编译单元。

C++中的静态成员
所有的类公用一块内存区域,可以进行类内部通信。如果一个静态数据成员被声明但是未被定义,连接器会报一个错误。
定义必须出现在类的外部,且只能定义一次,通常放在类的实现文件中。
//.h file
class A
{
  static int i ;
public:
  //
};
//.cpp file
int A::i = 1;

这些都是类创建者应该做的,所以,客户程序员不需要再定义一次了。
静态数组的初始化
在类外初始化
class Value{
  static const int scSize = 100;//非常特殊,内部类型可以这样定义,也可以在类外定义。
  static const float scFloat;
  static const int scInts[];
};
const int Value::scFloat = 1.0f;
const int Value::scInts[]={2,23,4};
自定义类型: 必须在类外初始化
class Stat
{
  static X x1;
  static X xTable[];
  static const X x2;
  static const X xTable2[];
 };

X Stat::x1(100);
X Stat::xTable[] = { X(1), X(2), X(3)};
const X Stat::x2(200);
const X Stat::xTable2 = {X(2), X(4), X(10) };


局部类中不能有static 数据成员。

静态成员函数:没有隐含的this指针,所以不能调用非静态成员函数。

静态初始化的相依性:一个对象的初始化必须需要另一个对象先初始化,如果初始化顺序不对,则造成错误。解决方法:利用函数
1.头文件中声明一个函数,且不能为内联。
2.实现文件中定义一个静态对象,并返回引用。
//Dependency1StatFunc.h
#include "Dependency1.h"
extern Dependency1& d1();

//Dependency2StatFunc.h
#include "Dependency2.h"
extern Dependency2& d2();

//Dependency1StatFunc.cpp
#include "Denpendency1StatFunc.h"
Dependency1& d1()
{
  static Deppendency1 dep1;
  return dep1;
}

//Dependency2StatFunc.cpp 静态对象一般放在单独的文件中定义,但要在头文件中声明。
#include "Denpendency1StatFunc.h"
#include "Denpendency2StatFunc.h"
Dependency2& d2()
{
  static Deppendency2 dep2(d1());//调用d1()的时候dep1已经初始化了
  return dep2;
}


使用c类型的函数
extern "c" float f(int a);
extern "c"{
#include "Myheader.h"
}
extern "c"
{
float f();
double d();
}






























posted on 2012-05-31 14:30 Dino-Tech 阅读(135) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理