gpt4 book ai didi

c++ - 类成员的定义

转载 作者:行者123 更新时间:2023-11-30 01:22:58 25 4
gpt4 key购买 nike

我们可以这样声明一个类成员:

class Test {
public:
int a;
}

这是我们声明的方式,但我想知道变量 a 是在哪里定义的。

我知道静态类成员,它是静态变量所以不能在类中定义,应该在类外定义。所以我认为普通类成员应该有一个地方可以定义,我猜它是隐式定义普通成员的构造函数。是吗?

最佳答案

对于非静态数据成员,声明和定义是一样的。

So I think the normal class member should have a place to be defined, I guess it's the constructor where the normal member is defined implicitly.

我想我可以看到你来自哪里。对于每个静态数据成员,每个类型只有一个变量实例(对于模板 - 每个模板实例化创建一个不同的类型) - 这就是为什么声明更像是普通变量的外部声明 - 它说“这个变量将有一个在某处地址 - 要求链接器稍后拼接地址”。 定义 是程序要求编译器为该特定翻译单元对象中的变量保留实际内存的地方,链接器将找到该变量,并使其可供其他翻译单元中知道的代码访问并根据声明访问变量。 (模板有点复杂)。因此,粗略地说,从程序员的角度来看,静态数据成员定义似乎是触发内存分配并安排构造函数运行的源代码行。一旦你写好了定义,分配和构造就都排序了。

但是对于非静态数据成员,情况就完全不同了——当类定义被编译器解析时,仍然没有实际请求在任何地方为这些非静态数据成员提供任何内存,因为还没有实例对象那个类类型。只有当某些其他代码指示需要对象实例时,编译器才需要安排内存(如果不使用放置 new)和构造。换句话说,对于非静态数据成员,定义和分配/构造通常是分离的 - 使用单独的源代码。

这一切都是递归应用的:当对象实例本身是静态的或属于文件/命名空间范围时,内存和构造(包括类内的数据成员)将在看到定义时安排(不一定执行),如上。但对象实例通常位于堆栈或堆上。无论哪种方式,数据成员的分配和构造代码都由创建包含对象的方式驱动,并且与数据成员的定义无关。

关于c++ - 类成员的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15538474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com