我们可以像这样声明一个类成员:
class Test {
public:
int a;
}
Run Code Online (Sandbox Code Playgroud)
这就是我们如何声明,但我想知道变量a
的定义.
我知道静态类成员,它是静态变量所以它不能在类中定义,它应该在类外定义.所以我认为普通的类成员应该有一个定义的位置,我猜它是隐式定义普通成员的构造函数.是对的吗?
对于非静态数据成员,声明和定义是同一个.
所以我认为普通的类成员应该有一个定义的位置,我猜它是隐式定义普通成员的构造函数.
我想我可以看到你来自哪里.对于每个静态数据成员,每种类型只有一个变量实例(对于模板 - 每个模板实例化创建一个不同的类型) - 这就是为什么声明更像是普通变量的extern声明 - 它说"这个变量将有一个地址 - 请求链接器稍后在地址中拼接".该定义是程序要求编译器为该特定转换单元对象中的变量保留实际内存的位置,该对象将由链接器找到,并且可供其他基于以下内容的知道和访问变量的转换单元中的代码访问.宣言.(这对模板来说有点复杂).因此,从程序员的角度来看,静态数据成员定义似乎是触发内存分配和安排构造函数运行的源代码行.一旦你编写了定义,分配和构造都会被排序.
对于非静态数据成员,它有很大的不同 - 当编译器解析类定义时,仍然没有实际请求那些非静态数据成员在任何地方给出任何内存,因为还没有该类类型的实例对象.只有当某些其他代码表明需要对象实例时,编译器才需要安排内存(如果不使用放置new
)和构造.换句话说,对于非静态数据,成员定义和分配/构造通常是分离的 - 使用单独的源代码.
这全部递归地应用:当对象实例本身是静态的或文件/命名空间范围时,如上所述,当看到定义时,将安排(不一定执行)存储器和构造(包括类内的数据成员).但是对象实例经常在堆栈或堆上.无论哪种方式,数据成员的分配和构造代码都是由创建包含对象的方式驱动的,并且与数据成员的定义无关.
归档时间: |
|
查看次数: |
723 次 |
最近记录: |