+ -
当前位置:首页 → 问答吧 → 这里的复制构造函数怎么不执行呢?

这里的复制构造函数怎么不执行呢?

时间:2011-12-12

来源:互联网

[code=C/C++][/code]#include<iostream>
#include<string>
using namespace std;

class cls
{
public:
cls(const string &str) : val(str)
{
cout<<"参数为string类对象\n";
}
cls(const char * str)
{
cout<<"参数为C风格字符串\n";
}
cls(const cls &pe) : val(pe.val)
{
cout<<"复制构造函数\n";
}

private:
string val;
};

int main()
{
cls a = "aaaaaaaaaaaaaaa";
cls b = string("AAAAAAAAAAAAAAAAA");
return 0;
}[code=C/C++][/code]


这里的复制构造函数怎么没效?

作者: Daisy_Chain   发布时间: 2011-12-12

哪里?

作者: Demon__Hunter   发布时间: 2011-12-12

你怎么调用的。
复制构造函数 跟 赋值函数是不一样的哦。

作者: relaxisland   发布时间: 2011-12-12

你没有调用构造函数啊,应该这样:

cls a = "aaaaaaaaaaaaaaa";
cls b = a;

作者: zero_226   发布时间: 2011-12-12

更改一下,你没有调用复制构造函数

作者: zero_226   发布时间: 2011-12-12

引用 2 楼 relaxisland 的回复:

你怎么调用的。
复制构造函数 跟 赋值函数是不一样的哦。

up一下,cls a = "aaaaaaaaaaaaaaa";
cls b = string("AAAAAAAAAAAAAAAAA");
这两句应该都是赋值函数,也就是对“=”的重载

作者: zero_226   发布时间: 2011-12-12

引用 1 楼 demon__hunter 的回复:

哪里?


不好意思搞错了,是这样的,我代码重新贴上:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class String{
char word[256];
public:
String(const char *ch = "") 
{
cout<<"Default constructor"<<endl;
strcpy(word , ch);
}
String(const String &str)
{
cout<<"Copy constructor"<<endl;
strcpy(word , str.word);
}

String& operator= (const String &str)
{
cout<<"Operator ="<<endl;
strcpy(word , str.word);
return *this;
}
};

int main()
{

String s = "AAAAAAAAAAAAA";

return 0;
}

s是复制初始化的吧?它是不是会先执行String(const char *ch = ""),然后执行String::String(const String &str),为什么我在VS2008上只显示Default constructor呢?


作者: Daisy_Chain   发布时间: 2011-12-12

因为“优化”

作者: taodm   发布时间: 2011-12-12

引用 7 楼 taodm 的回复:

因为“优化”


那我就搞不懂了:
如果你将
String::String(const String &str)
放入private:标号中的话就会产生错误,这说明编译器确实欲访问它啊!

作者: Daisy_Chain   发布时间: 2011-12-12

因为“规定”:即使优化也应该检查拷贝构造函数的可访问性。
另外,即使“规定”也很多编译器不依。
所以,没什么好折腾的。

作者: taodm   发布时间: 2011-12-12

引用 9 楼 taodm 的回复:

因为“规定”:即使优化也应该检查拷贝构造函数的可访问性。
另外,即使“规定”也很多编译器不依。
所以,没什么好折腾的。


恩 多谢。明天可以结贴了。

作者: Daisy_Chain   发布时间: 2011-12-12