c)类定义总有内部连接,而非inline类成员函数定义总有外部连接,不论这个成员函数是静态、虚拟还是一般成员函数,类静态数据成员定义总有外部连接。
1.类的定义有内部连接。如果不是,想象一下你在4个cpp文件中include定义了类Base的头文件,在4个编译单元中的类Base都有外部连接,在连接的时候就会出错。
看下面的例子:
//main.cpp
class B //类定义,内部连接
{
static int s_i; //静态类成员声明,内部连接
public:
void foo()
{
++s_i;
} //类inline函数,内部连接
};
struct D
{
void foo(); //类成员函数声明,内部连接
};
int B::s_i = 0; //类静态数据成员定义,外部连接
void D::foo() //类成员函数定义,外部连接
{
cout << "D::foo in main.cpp" <<endl;
}
int main() //main函数,全局自由函数,外部连接
{
B b;
D d;
return 0;
}
//a.cpp
class B
{
int k;
};
struct D
{
int d;
};
在这个例子中,main.cpp与a.cpp中都有class B和class D的定义,但在编译这两个cpp文件时并不发生link错误。
2.类的非inline成员函数(一般,静态,虚拟都是)总有外部连接,这样当你include了某个类的头文件,使用这个类的函数时,就能连接到正确的类成员函数上,继续以上面为例子,如果把a.cpp中的struct D改为
struct D //类定义
{
int d;
void foo(); //类成员函数声明
};
责任编辑:cyth