下面类的两种不同的构造函数的区别(在线等。。)

simondavier 2009-02-23 07:29:16
Sample::Sample(string name):_name(name){}
Sample::Sample(string name){_name=name;}


第一种会比第二种效率高,原因是第二种会产生局部变量,不知道我理解的对否,请高手指正~!
...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用楼主 simondavier 的帖子:]
Sample::Sample(string name):_name(name){}
Sample::Sample(string name){_name=name;}


第一种会比第二种效率高,原因是第二种会产生局部变量,不知道我理解的对否,请高手指正~!
[/Quote]
构造函数列表效率应该高点吧.
因为构造函数列表里是初始化,而构造函数里是赋值.
leo315 2009-02-23
  • 打赏
  • 举报
回复
说到效率高,我想知道能高多少?
chxy85 2009-02-23
  • 打赏
  • 举报
回复
初始化和赋值
疯哥哥 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 MooreChen 的回复:]
引用楼主 simondavier 的帖子:
Sample::Sample(string name):_name(name){}
调用string类的拷贝构造函数;

Sample::Sample(string name){_name=name;}
先调用string类的默认构造函数,再调用赋值函数;


初始化列表的效率比较高。
[/Quote]
是这样的.up.
MooreChen 2009-02-23
  • 打赏
  • 举报
回复
顺便说一下,
执行拷贝构造函数时,由于数据成员尚未初始化,所以可以直接申请内存空间,
而对于赋值函数,首先要判断是否是自赋值,再释放已经申请的内存空间,然后申请存储空间进行初始化。

以string类的拷贝构造函数和赋值函数为例:

//copy constructor
String::String(const String &other)
{
this->m_data = (char *)malloc(sizeof(char) * strlen(other.m_data) + 1);

if( this->m_data == NULL)
{
exit(1);
}

strcpy(this->m_data, other.m_data);
}

//Assignment operator
String & operator=(const String &other)
{
if(this == &other) //self assignment
{
return *this;
}

delete this->m_data;
this->m_data = (char *)malloc(sizeof(char) * strlen(other_m_data) + 1);

if(this->m_data == NULL)
{
exit(1);
}

strcpy(this->m_data, other.m_data);

return *this;
}
arong1234 2009-02-23
  • 打赏
  • 举报
回复
你的理解是错误的,效率高是没错的,错误的是解释。效率高是在第一种情况下,_name只有一次初始化,第二种情况下,_name除了一次初始化之外,还要被赋值一次。它多一次运算,自然效率低

[Quote=引用楼主 simondavier 的帖子:]
Sample::Sample(string name):_name(name){}
Sample::Sample(string name){_name=name;}


第一种会比第二种效率高,原因是第二种会产生局部变量,不知道我理解的对否,请高手指正~!
[/Quote]
MooreChen 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 simondavier 的帖子:]
Sample::Sample(string name):_name(name){}
调用string类的拷贝构造函数;

Sample::Sample(string name){_name=name;}
先调用string类的默认构造函数,再调用赋值函数;
[/Quote]

初始化列表的效率比较高。
simondavier 2009-02-23
  • 打赏
  • 举报
回复
了解,谢谢指导~!
waizqfor 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 simondavier 的帖子:]
Sample::Sample(string name):_name(name){}
Sample::Sample(string name){_name=name;}


第一种会比第二种效率高,原因是第二种会产生局部变量,不知道我理解的对否,请高手指正~!
[/Quote]
Sample::Sample(string name):_name(name){} //这是利用构造函数 初始化列表来初始化类的成员变量
Sample::Sample(string name){_name=name;} //这是普通的初始化 构造函数里
第一种使用初始化列表的话,成员的建立和初试化同时进行,而第二种则必须先等成员变量建立以后,然后在初始化。 所以推荐用第一种 还有就是const类型,引用类型 不支持第二种赋值
yangch_nhcmo 2009-02-23
  • 打赏
  • 举报
回复

Sample::Sample(string name):_name(name){} //只需进行一次初始化
Sample::Sample(string name){_name=name;} //_name要先进行初始化,然后进行赋值

------------------------
第一种写法效率上比第二种高.
eatsweetpotato 2009-02-23
  • 打赏
  • 举报
回复
Sample::Sample(string name){_name=name;} //这种形式仍然会执行 参数列表 ,即 :_name(name)
也就是说name被赋了两次值,一次是初始化,一次是赋值

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧