收录日期:2021/02/27 19:48:02 时间:2016/07/13 20:56:07 标签:C++ 语言

class A
{
    public:
        A(string s){}
};

int main()
{
    A a("haha");
    A b = "haha";
}

我想问的就是A a("haha")和A b = "haha"究竟是不是一样都是。为什么A b = "haha"不能通过呢?
当然不一样啊。
因为在调用 
A b = "haha"的时候会调用类的默认构造函数。但是你的类里面没有。所以报错。而且你没有重载=号

http://blog.csdn.net/chenzhp/archive/2008/09/04/2879057.aspx
具体说说怎么不一样啊、、、
lz什么编译器?
我的vs2008下编译,========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
这个应该会隐式转换,没有问题的
如果你用的vc的话可能不太标准吧
这个不用=号重载吧
不一样的。
首先: A a("haha");   //声明类A的对象a塔传入参数为"haha"
      A b = "haha";  //这句要通过编译,要么在类中自定义函数使用 strcpy或者将指针赋值
                        //要么重载运算符 “= ”,使得能够进行这种格式的拷贝(即先创建临对象,再字符拷贝,
                        //最后返回*this)
刚刚在别人问题中解答的时候看到其他楼层出现的东东,我记得是一样的,这里看到是=,其实是不用等号的。
   而将 A(string s){}改为 A(int s){}, A b = "haha";改为A b = 123;完全没有问题。

貌似lz是有构造函数的
另外说明,我暂时用C-FREE,没有开VC,只是想简单试试,难道真的是编译器问题?
第二个也该是对的
用了隐式转换
首先是"haha"调用构造函数生成一个临时对象,然后调用系统生成的拷贝构造函数用临时对象来构造b,当然,因为编译器优化问题
,调用拷贝构造函数这一步可能显示不出来。
就你给的程序来看,是符合c++语法要求的。

1,
A a("haha");
这个很显然。

2,
A b = "haha";
先有一个隐式转换,也就是const char构造string对象,然后调用A(string s)创建一个临时对象,最后调用A的拷贝构造函数创建一个A的对象。
但实际编译之后,可能不会调用拷贝构造函数,而是和1没有区别。编译器会执行一个潜规则,也就是RVO,优化掉了中间的临时对象,而直接构造对象b
引用 13 楼 Jinhao 的回复:
1,
A a("haha");
这个很显然。

2,
A b = "haha";
先有一个隐式转换,也就是const char构造string对象,然后调用A(string s)创建一个临时对象,最后调用A的拷贝构造函数创建一个A的对象。
但实际编译之后,可能不会调用拷贝构造函数,而是和1没有区别。编译器会执行一个潜规则,也就是RVO,优化掉了中间的临时对象,而直接构造对象b

确实如此,只是编译器这样自作聪明,把正常的思维全搞乱了。
要是我写编译器,就让它分以下几步。
1. "haha"->临时string 对象
2. b 调用A类默认构造,例子中没有,可以自己生成一个。
3. = 为赋值拷贝操作,例子中没有,而且string类和A类不配套,报错。

我认为编译器自作聪明,就是多此一举,不按规则出牌。只不过我们只能适应罢了。
所以,还是要中止于编译器,忍受它的一些不算合理的做法。
引用 13 楼 Jinhao 的回复:
1,
A a("haha");
这个很显然。

2,
A b = "haha";
先有一个隐式转换,也就是const char构造string对象,然后调用A(string s)创建一个临时对象,最后调用A的拷贝构造函数创建一个A的对象。
但实际编译之后,可能不会调用拷贝构造函数,而是和1没有区别。编译器会执行一个潜规则,也就是RVO,优化掉了中间的临时对象,而直接构造对象b


应该没有问题,=会生成临时对象,再拷贝
引用楼主 kolige 的帖子:
C/C++ code
class A
{
    public:
        A(string s){}
        A(){}
       1> A(const A& s){}
       2>A& operator=(const A& s){....}
};

int main()
{
    A  c;         defaul构造函数
    string c="haha"; 
    A a("haha");  copy构造函数
    A b = "haha"; copy ssignment操作符
}



我想问的就是A a("haha")和A b = "haha"究竟是不是一样都是。为什么A b = "haha"不能通过呢?

class A
{
    public:
        A(string s){}
        A(){}
       1> A(const A& s){}
       2>A& operator=(const A& s){....}
};

int main()
{
    A  c;         defaul构造函数
    string c="haha"; 
    A a("haha");  copy构造函数
    A b = "haha"; copy ssignment操作符
}

你没有对=进行重载!
我的机子能通过。。。
A b="haha";
你这样需要发生两次转型:首先"haha"要转换成string
然后在string 转换成A
C++是不允许两次转型.
引用楼主 kolige 的帖子:
C/C++ code
class A
{
    public:
        A(string s){}
};

int main()
{
    A a("haha");
    A b = "haha";
}

我想问的就是A a("haha")和A b = "haha"究竟是不是一样都是。为什么A b = "haha"不能通过呢?

这个和楼主使用的编译器有关,如果你碰到这种情况,请显式定义一下拷贝赋值操作符“=”即可。请参考:
C++类中的4个特殊函数 - 缺省构造函数、拷贝构造函数、拷贝赋值操作符和析构函数
构造函数
这是类中的构造函数,不是字符串的输出输入
想明白了,和我帮人解答的原因一样,也就是18楼说的
 
    另外说下,这个例子需要用到=重载吗?据我所知,这个A b = "haha",理论上来说是先用“haha”转化为string构造一个临时对象,然后用复制构造函数构造b,而不是用=重载。

    谢谢各位大大了,结贴

特急...关系到饭碗....在线等... 各位仁兄!问一个asp.net在windows2003服务器版IIS6.0上配置的问题?在线散分? 大家注意了,小心新出来的病毒(是NT架构下的)影响svchost.exe!! 在winform中,如何对图片进行删改?? dbgrideh控件如何做下拉表 不用组件上传图片的问题,希望高手给看看这行代码的错误 ····难啊********!!!! ***多层C/S如何作到权限控制???用Session Bean,还是Java Beans……有意义的发言均有分!!! DataGrid中将数据库中的1和0转换为“是”和“否”,如何实现?请高手作答! 如何使用struts的bean:write写出多行内容啊? 小弟第一次问问题,感谢大家回答啊,挺着急的 希望各位高手能介绍几本好的初学的好书谢谢。 如何得到局域网中其他计算机的共享目录? 如何通过MAC地址(IP)获得局域网中其他用户正在访问的网页地址? C#: 怎么样得到上周的起始日期 明明检索出了记录结果,可偏偏为什么记录结果却不显示出来? 请帮忙 很急 关于排序的问题!小问题!在线等! 什么时间用指向指针的指针? 我应该选择哪个msdn? 一个经常遇到的问题? 如何禁用某窗体? 请问一些函数定义前面的 PASCAL 或者 winapi是什么意思? 怎样才可以学不好编程 身为男人十大不爽 ---哈哈! 笑翻我! 如何在VC程序中建立拨号连接,又如何建立MODEM呢 请指教:我这个UpdateCommand有无错误? 用过动态添加控件的高手请进! (原创)清除XP自动重启手记——中病毒的一定要来看看!!!! (XP 2000 2003 NT)