C ++中的类实例声明

时间:2011-06-14 06:22:45

标签: c++

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

class ChatMgr
{
   private:
   ClientList _userlist;
   ClientList *_userlist;
}

那有什么区别?我知道第二个是实例的地址,我需要使用new来初始化它以使用它。那么对于第一个,我可以只访问类中的所有数据成员而不进行初始化吗?

提前致谢....

7 个答案:

答案 0 :(得分:2)

你是对的,_userListClientList类的实际实例,因此在ChatMgr(其构造函数被调用)时初始化,但是*_userlist是一个指针,未被初始化。

答案 1 :(得分:1)

有什么区别?

ClientList _userlist;   

添加类ClientList的对象作为类ChatMgr

的成员

_userlist本身就是一个对象,因此,当创建ChatMgr的对象时,编译器将调用它的构造函数。 _userlist的所有初始化都应该出现在构造函数的constructorInitializer 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 _userlistClientList的一个实例。它的构造函数将由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是一个指针,PODwon't be initialized(甚至不是0 / NULL),除非你明确地这样做。