C++ C+中的类实例声明+;

C++ C+中的类实例声明+;,c++,C++,假设我有一个ClientList类,我已经这样声明了 class ChatMgr { private: ClientList _userlist; ClientList *_userlist; } 那有什么区别呢?我知道第二个是实例的地址,我需要使用new来初始化它。那么对于第一个问题,我是否可以只访问类中的所有数据成员而不初始化它 提前感谢….如果我没记错的话,第一个通过构造函数创建ClientList,第二个只保存潜在ClientList的地址 由于您尚未指定指向的对象,

假设我有一个ClientList类,我已经这样声明了

class ChatMgr
{
   private:
   ClientList _userlist;
   ClientList *_userlist;
}
那有什么区别呢?我知道第二个是实例的地址,我需要使用new来初始化它。那么对于第一个问题,我是否可以只访问类中的所有数据成员而不初始化它


提前感谢….

如果我没记错的话,第一个通过构造函数创建ClientList,第二个只保存潜在ClientList的地址

由于您尚未指定指向的对象,因此在创建对象并将其新地址指定给指针之前,指针将不可用。

有什么区别?

添加类
ClientList
的对象作为类
ChatMgr

\u userlist
本身就是一个对象,因此,当创建
ChatMgr
的对象时,编译器将调用它的构造函数。
\u userlist
的所有初始化都应该在它自己的
构造函数
或构造函数的
初始化器列表
中进行

ClientList *_userlist; 
将指向类
ClientList
的对象的指针添加为类
ChatMgr

*\u userlist
在使用它之前应该指向有效的东西,因为它只是一个指针,您需要将它指向有意义的东西才能使用它

最好在类的
ChatMgr
初始值设定项列表中使用initialize

对于第一个问题,我可以访问类中的所有数据成员而不初始化它吗?

如Q1中所述,Yes您可以访问
\u userlist
的内容,而无需对其进行初始化,因为当编译器调用
ClientList
构造函数时,初始化会隐式进行。

您是正确的,
\u userlist
ClientList
类的实际实例,当
ChatMgr
为(调用其构造函数)但
*\u userlist
为未初始化的指针时,会初始化so-
\u userlist
是一个对象

ClientList *_userlist; 
ClientList*\u用户列表
-
\u userlist
是指向
ClientList
类型的对象的指针

在第一种情况下,只要在实例化当前
ChatMgr
对象之前看到
ClientList
的定义,就可以访问数据成员。所以

 class ClientList
 {
    // ...
 };

 class ChatMgr
 {
     ClientList _userList ;
     // ...
 };

您需要在使用指针之前初始化它,但实例可能会在构造函数中初始化

ClientList *_userlist; 
你们班有两名成员:

ClientList _userlist;
ClientList *_userlist;
ClientList\u userlist
ClientList
的一个实例。它的构造函数将由
ChatMgr
构造函数调用,假设构造函数正确初始化了所有内容,您就可以开始使用它了


ClientList*\u userlist
是指向
ClientList
实例的指针。在您可以使用它之前,可以通过使用
new
,或者通过为其分配其他实例的地址,对其进行初始化。一旦您这样做,指针将被初始化,它所指向的实例可能也将被初始化(
new
将调用
ClientList
构造函数)。

我担心您可能会混淆概念。请记住以下两者之间的区别:

House H;
House *L;

H本身就有一座房子。L存储房屋地址。

更改成员变量的名称,以便代码实际编译:

class ChatMgr
{
   private:
   ClientList _userlist;
   ClientList *_pUserlist;
}
除非对任何对象进行初始化,否则无法访问该对象。不同之处在于,无论是否显式创建
\u userList
对象,只要创建
ChatMgr
对象,都无法(合法)在未初始化的情况下获取此类成员。

\u pUserlist
,OTOH是一个指针,a,并且根本不是指向
0
/
NULL
),除非您明确地这样做

*\u userlist
不是指针。第二个声明中的指针是
\u userlist
(不带星号)
*\u userlist
是指针对象(即所指向的对象)。“指针变量的大小都相同”-不是真的。例如,成员函数指针的大小与非成员函数指针的大小不同。此外,指针大小实际上可能会因体系结构的不同而不同,据我所知,无法保证任意指针类型在给定体系结构上具有相同的大小(同时,我会想到远指针和近指针)。此外,这只是偏离了真正的问题,即自动存储与指针。