是否在c++代码中正确定义和初始化了构造函数

Are the constructors defined and initialized correctly in C++ code?

本文关键字:定义 初始化 构造函数 c++ 代码 是否      更新时间:2023-10-16

我在网上看到这段代码,我看不懂。谁能帮我翻译一下吗?构造函数的定义和初始化是否正确?

struct account {
string login;
string surname;
string name;
string passwd;
bool connecte;
/** accessInt :
int accessInt;
/** acl  :   acl */
acl* accessListe; 
//constructers
account() 
{
}
account(
    const string & login, const string & surname,
    const string & name, const string & passwd, const bool connecte , const int & accessListe
    ) : login(login), surname(surname), name(name), passwd(passwd), connecte(connecte), accessInt(accessListe){
    accessListe = new acl(accessInt);
}
account(
    const char * login, const char * surname,
    const char * name, const char * passwd, const bool connecte , const int & accessListe
    ) : login(login), surname(surname), name(name), passwd(passwd), connecte(connecte), accessInt(accessListe){
    accessListe = new acl(accessInt);
}
friend std::ostream &operator<<(std::ostream &c, const account& ac) {
    c << "a:" << ac.login << ":" << ac.surname << ":" << ac.name << ":" << ac.passwd << ":" << ac.accessListe->toInt();
    return c;
}
};

代码有一个奇怪的内嵌注释:

/** accessInt :
int accessInt;
/** acl  :   acl */
acl* accessListe; 

由于有代码试图初始化accessInt,我假设其声明上方的行只是缺少关闭注释的令牌。

代码缺少acl的定义。

后两个构造函数的主体试图初始化accessListe,但也有一个名为accessListe的构造函数参数,它将遮蔽对象成员。要么重命名参数,要么在构造函数体中使用this->accessListe

jxh回答了代码中的一些错误,但我想扩展它并讨论其他一些问题。默认构造函数尤其糟糕,因为它没有尝试构造任何带值的对象。这对于所有保证被构造为空字符串的std::string是很好的;但是,对于intbool和指针成员,它们都将使用任意值构造。这意味着,如果调用默认构造函数This类,这些值将不会初始化为任何东西,并可能导致问题!假设account析构函数清理了它分配的内存:

account::~account() { delete accessListe; }

如果类是用它的默认构造函数构造的,那么当它被清理时,将会发生未定义的行为(默认情况下,accessListe将只指向任何内存位)。你应该确保你的默认构造函数(以及所有的构造函数)用正常值初始化所有的值:

account::account() : connecte(false), accessInt(0), accessListe(nullptr /* or 0 if you don't have C++11*/) {}

对于后两个构造函数,它们都可以(读:应该)在构造函数初始化列表中初始化指针accessListe,而不是在之后赋值:

account::account(arguments...) : accessInt(someValue), accessListe(new acl(accessInt))