是否在c++代码中正确定义和初始化了构造函数
Are the constructors defined and initialized correctly in C++ code?
我在网上看到这段代码,我看不懂。谁能帮我翻译一下吗?构造函数的定义和初始化是否正确?
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
是很好的;但是,对于int
、bool
和指针成员,它们都将使用任意值构造。这意味着,如果调用默认构造函数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))
相关文章:
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- Boost Python Numpy - 要初始化的未定义引用
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++类中的类作为自定义向量(如何初始化?
- 初始化类定义中的结构数组
- C++ 如何检查 char 变量是否未定义(未初始化)
- C++列表初始化允许多个用户定义的转换
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- (C++)我的自定义数组无法初始化(编译错误)
- 类模板静态数据成员定义/声明/初始化
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在另一个文件中初始化的 extern 数组中未定义的引用
- thread_local静态成员模板定义:初始化失败,GCC
- 通过用户定义的转换初始化引用
- 自定义初始化数组与 std::make_unique
- C++具有自定义初始化的静态调度
- 导入错误:动态模块未定义初始化函数
- 有没有一种标准的方法可以在初始化阶段运行一些代码并定义初始化的顺序
- C++,为什么我不能把带有参数的类构造函数的定义-初始化列表放在类声明之外
- 是否需要在头文件中定义初始化列表