C++中关于类对象的初始化问题
答案:3 悬赏:80 手机版
解决时间 2021-12-03 09:10
- 提问者网友:轮囘Li巡影
- 2021-12-02 10:51
C++中关于类对象的初始化问题
最佳答案
- 五星知识达人网友:笑迎怀羞
- 2021-12-02 11:51
你没用到你干嘛定义它?用得到的统统都需要初始化(既然定义了就当然用得到的了嘛......),否则其数据成员包含的就是垃圾。
是,初始化不是赋值,所以你想初始化而不是赋值的话就要用member initialization list而不是operator =。
区别:
clas A
{
public:
A();
A(int const _id, string const& _name, string const& _address);
private:
int id;
string name;
string address;
};
A::A(int const _id, string const& _name, string const& _address)
{
id = _id;
name = _name;
address = _address;
}
使用复制赋值操作符来“初始化”成员是所谓的“伪初始化”。在上面的过程中,在进入A()的函数体之前,name和address就已经分别调用了它们各自的默认构造函数一次,而在A()的函数体中它们又再次调用自己的operator = 来进行赋值。对内置类型来说则没有这个过程,所以对于内置类型,使用初始化成员列表或在构造函数体内对其进行赋值没什么大的区别。
A::A(int const _id, string const& _name, string const& _address)
: id(_id), name(_name), address(_address)
{
}
这一次name和address就只分别调用了它们各自的复制构造函数一次,而免去了多余了那一次对operator = 的调用,对于非内置类型来说,这就大大提高了对象的初始化效率。同样对于内置类型来说这没有什么大的不同,但为了保持一致性,通常最好的做法就是也把它们放在初始化成员列表中进行初始化。
另外 = 操作符所表示的意思也不总是赋值,在对象定义声明时使用操作符 = 对象调用的就是其复制构造函数而不是operator = :
int main()
{
A a(1000, "Stanly", "WestRoadNo.12345"), b;
b = a; // 这是operator =
A c = b; // 这是A(const A& _A)
}
是,初始化不是赋值,所以你想初始化而不是赋值的话就要用member initialization list而不是operator =。
区别:
clas A
{
public:
A();
A(int const _id, string const& _name, string const& _address);
private:
int id;
string name;
string address;
};
A::A(int const _id, string const& _name, string const& _address)
{
id = _id;
name = _name;
address = _address;
}
使用复制赋值操作符来“初始化”成员是所谓的“伪初始化”。在上面的过程中,在进入A()的函数体之前,name和address就已经分别调用了它们各自的默认构造函数一次,而在A()的函数体中它们又再次调用自己的operator = 来进行赋值。对内置类型来说则没有这个过程,所以对于内置类型,使用初始化成员列表或在构造函数体内对其进行赋值没什么大的区别。
A::A(int const _id, string const& _name, string const& _address)
: id(_id), name(_name), address(_address)
{
}
这一次name和address就只分别调用了它们各自的复制构造函数一次,而免去了多余了那一次对operator = 的调用,对于非内置类型来说,这就大大提高了对象的初始化效率。同样对于内置类型来说这没有什么大的不同,但为了保持一致性,通常最好的做法就是也把它们放在初始化成员列表中进行初始化。
另外 = 操作符所表示的意思也不总是赋值,在对象定义声明时使用操作符 = 对象调用的就是其复制构造函数而不是operator = :
int main()
{
A a(1000, "Stanly", "WestRoadNo.12345"), b;
b = a; // 这是operator =
A c = b; // 这是A(const A& _A)
}
全部回答
- 1楼网友:等灯
- 2021-12-02 13:02
不是
不是
不建议使用初始化列表
因为很多编译器在内部实现有差别
不是
不建议使用初始化列表
因为很多编译器在内部实现有差别
- 2楼网友:渡鹤影
- 2021-12-02 12:53
是
不是
本质没有什么区别吧,就运行的速度问题。。。
不是
本质没有什么区别吧,就运行的速度问题。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯