假设我有ClientList类,我已经这样声明了。
class ChatMgr
{
private:
ClientList _userlist;
ClientList *_userlist;
}
那有什么区别?我知道第二个是实例的地址,我需要使用new来初始化它以使用它。那么对于第一个,我可以只访问类中的所有数据成员而不进行初始化吗?
提前致谢....
答案 0 :(得分:2)
你是对的,_userList
是ClientList
类的实际实例,因此在ChatMgr
(其构造函数被调用)时初始化,但是*_userlist
是一个指针,未被初始化。
答案 1 :(得分:1)
有什么区别?
ClientList _userlist;
添加类ClientList
的对象作为类ChatMgr
_userlist
本身就是一个对象,因此,当创建ChatMgr
的对象时,编译器将调用它的构造函数。 _userlist
的所有初始化都应该出现在构造函数的constructor
或Initializer list
中。
ClientList *_userlist;
添加指向类ClientList
的对象的指针作为类ChatMgr
的成员
*_userlist
在使用它之前应指向有效的东西,因为它只是一个指针,你需要指出它能够使用它的意义。
最好,您应该在班级Initializer List
的{{1}}中使用初始化。
对于第一个,我可以在不初始化的情况下访问班级内的所有数据成员吗?
正如Q1中所解释的那样,是,您可以在不初始化的情况下访问ChatMgr
的内容,因为在编译器调用_userlist
构造函数时,初始化会发生。
答案 2 :(得分:0)
如果我没记错的话,第一个通过构造函数创建ClientList,第二个只保存潜在ClientList的地址。
由于您尚未指定要指向的内容,因此在您创建对象并将其新地址分配给指针之前,后者将无法使用。
答案 3 :(得分:0)
ClientList _userlist;
- _userlist
是一个对象。
ClientList *_userlist;
- _userlist
是指向ClientList
类型对象的指针。
在第一种情况下,只要在实例化当前ClientList
对象之前看到ChatMgr
的定义,就可以访问数据成员。所以,
class ClientList
{
// ...
};
class ChatMgr
{
ClientList _userList ;
// ...
};
答案 4 :(得分:0)
您需要在使用之前初始化指针,但实例可能会在构造函数中初始化。
你的班级有2名成员:
ClientList _userlist;
ClientList *_userlist;
ClientList _userlist
是ClientList
的一个实例。它的构造函数将由ChatMgr
构造函数调用,并假设构造函数正确初始化所有内容,您可以开始使用它。
ClientList *_userlist
是指向ClientList
实例的指针。通过使用new
或者通过为其指定其他实例的地址,可以在使用之前初始化它。执行此操作后,指针将被初始化,它指向的实例也可能被初始化(new
将调用ClientList
构造函数)。
答案 5 :(得分:0)
我担心你可能会混淆概念。请记住:
之间的区别House H;
House *L;
H自己存放房屋。 L存储房屋的地址。
答案 6 :(得分:0)
更改成员变量的名称,以便代码实际编译:
class ChatMgr
{
private:
ClientList _userlist;
ClientList *_pUserlist;
}
除非已初始化,否则永远不能访问任何对象。不同之处在于_userList
will be initialized每当您创建一个ChatMgr
对象时,无论您是否明确地执行此操作,因此没有(合法)方法可以在没有它的情况下获得此类成员被初始化。
_pUserlist
,OTOH是一个指针,POD和won't be initialized(甚至不是0
/ NULL
),除非你明确地这样做。