int a = 5和 int a(5)有什么区别

飞翔的薄荷 2011-09-04 12:04:45
如题
...全文
1097 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
crakme 2011-09-06
  • 打赏
  • 举报
回复
31楼正解
soulmate119 2011-09-06
  • 打赏
  • 举报
回复
研究深!
Enter空格 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 69 楼 ml232528 的回复:]
引用 60 楼 mymixing 的回复:

告诉楼主一个自己验证的方法。
随便找个VS系列编译器,对程序下断点。
调试起后,鼠标右键disassembly会进入反汇编界面。
之后你自己对比一下,问题中的两种赋值语句的反汇编代码。
如果你懂汇编的话,非常好理解,如果不懂的话,简单的对比两种赋值语句的指令是否一致就OK了。


汇编没有区别 因为被编译器优化了
但实际上是有区别的……
[/Quote]

呵,如果DEBUG版本的反汇编有点区别的话,拿还可能真是由点区别。
但是如果RELEASE版本反汇编之后完全没区别的话,那这两种初始化对CPU来讲就是完全没有区别的。
因为代码的本质是CPU指令,也就是说,他们的实质就是一个东西。
kkrmr 2011-09-05
  • 打赏
  • 举报
回复
我只知道都是在初始化,有没有区别还真不知道,来学习一下
linux-novice 2011-09-05
  • 打赏
  • 举报
回复
第一个是复制初始化,
第二个是直接初始化。
区别是有的。

c只支持第一个。第二个是标准c++里的吧使用了类的初始化器。
龙龙胖 2011-09-05
  • 打赏
  • 举报
回复
路过,最终是执行效率的区别
  • 打赏
  • 举报
回复
个人觉得楼主很有专研精神了,呵呵值得学习了!
看来我也需要向楼主好好学习了哦!
其实这个问题个人感觉问的比较深刻!
有个人的几点意见想说一说。
关于内置类型的赋值和初始化的区别是在后面C++新加入的特性,主要是为了支持template的运用,因为在模板的使用中会涉及到如下的一些表达式吧:
template<typename T>
void fun()
{
T a();
}
为了与内置类型保持一致,因此提出了这个概念!
其次对于内置类型:上面的两种操作应该不会影响程序运行的效率!
但是对于用户自定义类型的话,就涉及到了构造函数、拷贝构造函数、赋值操作符的重载等和explicit关键字的相关知识,在比较多的经典书上都有讲到合适将会被调用。

“class_b b3 = class_b(5);//检查复制构造 但不调用复制构造。如果复制构造为private 则编译通不过,但和复制构造的实现不实现没有任何关系”
关于这个我以前也没有注意到过,不过写代码测试了一下,楼主的说法是正确的
我个人理解(不知道对不对):这个可能是编译器为了用户代码的安全性考虑的吧,在进行编译的时候需要进行错误检查,但是上面的表达式满足拷贝构造函数的调用,但是你把它设置成了private,就会报错了!
但是编译器又是比较智能的,觉得这个代码完全可以优化为直接调用没有添加explicit的构造函数产生代码,
可能产生了优化吧!
个人理解,还请高人指点了!
tompaz 2011-09-05
  • 打赏
  • 举报
回复
恩,没啥区别,混分
only_lonely 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 kakane 的回复:]

int a=5;//复制初始化
int a(5);//直接初始化

直接初始化语法更灵活且效率更高。

C++ primer 第48页
[/Quote]

老黄历了。但还是提倡直接初始化。
v_table 2011-09-05
  • 打赏
  • 举报
回复
前者产生一个临时变量,后者就没有
半兽人写程序 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ml232528 的回复:]

引用 5 楼 jackyjkchen 的回复:

引用 4 楼 ml232528 的回复:

肯定是有区别的
MFC里面有个类CString

CString str("你好啊") ; //正确
CString str = "你好啊" ;//错误

谁告诉你第二个错误?


宽字符下错误
[/Quote]
如果第二个错的,第一个也是错的。
class A{
A(const A & other);
A & operator =(const A &other);
}
一个是拷贝构造函数,一个是 = 运算符重载。这个是对class而言的。至于效率哪个高,要看怎么实现的。
class A{
A(const A & other){
*this = ohter;
}
A & operator =(const A &other){
m_i = other.m_i;
return (*this);
}
我这样写,没啥区别。
class A{
A(const A & other):m_i(other.m_i){
}
A & operator =(const A &other){
m_i = other.m_i;
return (*this);
}
我这么写,就有区别。毕竟拷贝构造函数效率高点。

int m_i;
}

对int的确没区别。因为int不是class,是内置类型。很多语言都有内置的。
就int而言,对c++ c# java都是内置数据类型,和class完全不一样




ken_scott 2011-09-05
  • 打赏
  • 举报
回复
我的话 内置类型用=的方式 自定义的用()来做 看个人了
ken_scott 2011-09-05
  • 打赏
  • 举报
回复

#include <iostream>
using std::cout;
using std::endl;

class Test {
public:
Test(int i) : m_i(i) {
cout << "Test(int i)" << endl;
}

Test(const Test& rhs) : m_i(rhs.m_i) {
cout << "Test(const Test& rhs)" << endl;
}

Test& operator=(int i) {
m_i = i;
cout << "Test& operator(int i)" << endl;
}

Test& operator=(const Test& rhs) {
cout << "Test& operator=(const Test& rhs)" << endl;
if (rhs.m_i != m_i) {
m_i = rhs.m_i;
}
return *this;
}

~Test() {
cout << "~Test()" << endl;
}

private:
int m_i;
};

int main()
{
Test t1 = 1;
Test t2(2);
return 0;
}

用这个测测看 看有多少析构 都有哪些构造(或拷贝赋值)函数被调用
楼主把它们当相同理解好了 不用深究 如果谁说不同 让他写代码证明一下
不过好像是有书说有些许不同 C++Primer?ExceptionalC++?(有没有打错英文?)
king_ss_ 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
第二个借鉴了C++构造函数的语法,只有C++支持

C只支持前者

效果都是一样的
[/Quote]
=运算符 与 构造函数 赋值
飞翔的薄荷 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 mymixing 的回复:]

告诉楼主一个自己验证的方法。
随便找个VS系列编译器,对程序下断点。
调试起后,鼠标右键disassembly会进入反汇编界面。
之后你自己对比一下,问题中的两种赋值语句的反汇编代码。
如果你懂汇编的话,非常好理解,如果不懂的话,简单的对比两种赋值语句的指令是否一致就OK了。
[/Quote]

汇编没有区别 因为被编译器优化了
但实际上是有区别的 见49楼
ken_scott 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 ww506772362 的回复:]
这么easy的问题竟然会有这么多回帖的!哎!
[/Quote]
不累呗 基本上也不用动脑 都是经验(可能有些人看了什么书 知道(没)有区别)
ctreewang 2011-09-05
  • 打赏
  • 举报
回复
一个赋值,一个初始化~
ww506772362 2011-09-05
  • 打赏
  • 举报
回复
这么easy的问题竟然会有这么多回帖的!哎!
liutengfeigo 2011-09-05
  • 打赏
  • 举报
回复
木有~@
chen16501560 2011-09-05
  • 打赏
  • 举报
回复
厉害。。
加载更多回复(55)

65,170

社区成员

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

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