网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月06日漏签0天
c++吧 关注:618,114贴子:2,111,189
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1回复贴,共1页
<<返回c++吧
>0< 加载中...

关于类的拷贝构造函数的问题

  • 只看楼主
  • 收藏

  • 回复
  • 漂流瓶jz
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
HasPtr b=string("qqqqq");
类在这样初始化的时候是不需要拷贝构造函数的参与的么?
经过我如下测试
HasPtr(const string &s=string()):ps(new string(s)),i(0){cout<<*ps<<" 111"<<endl;}
HasPtr(const HasPtr &Has):ps(new string(*Has.ps)),i(Has.i){cout<<*ps<<" 222"<<endl;}
输出为
qqqqq 111
也证实了是不需要它参与
那我把拷贝构造函数中参数的const去掉
编译器就提示错误如下:
(编辑器为g++ )( -std=c++11 )
/cygdrive/c/Users/acer/Desktop/1.cpp:78:25: 错误:对‘HasPtr::HasPtr(HasPtr)’的调用没有匹配的函数
HasPtr b=string("qqqqq");
^
/cygdrive/c/Users/acer/Desktop/1.cpp:78:25: 附注:备选是:
/cygdrive/c/Users/acer/Desktop/1.cpp:12:3: 附注:HasPtr::HasPtr(HasPtr&)
HasPtr(HasPtr &Has):ps(new string(*Has.ps)),i(Has.i){cout<<*ps<<" 222"<<endl;}
^
/cygdrive/c/Users/acer/Desktop/1.cpp:12:3: 附注: no known conversion for argument 1 from ‘HasPtr’ to ‘HasPtr&’
/cygdrive/c/Users/acer/Desktop/1.cpp:11:3: 附注:HasPtr::HasPtr(const string&)
HasPtr(const string &s=string()):ps(new string(s)),i(0){cout<<*ps<<" 111"<<endl;}
^
/cygdrive/c/Users/acer/Desktop/1.cpp:11:3: 附注: no known conversion for argument 1 from ‘HasPtr’ to ‘const string& {aka const std::basic_string<char>&}’
明明是用HasPtr(const string &s=string()):ps(new string(s)),i(0){cout<<*ps<<" 111"<<endl;}匹配的,却告诉我没有匹配的构造函数...
(在做c++ primer 第五版 13.31习题是碰到的问题,习题能做出来)
求解答,谢谢拉


  • 漂流瓶jz
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是完整代码....好吧有很多没用的部分...
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
class HasPtr
{
public:
friend void swap(HasPtr &lhs,HasPtr &rhs);
friend bool operator<(const HasPtr &l,const HasPtr &s);
HasPtr(const string &s=string()):ps(new string(s)),i(0){cout<<*ps<<" 111"<<endl;}
HasPtr(HasPtr &Has):ps(new string(*Has.ps)),i(Has.i){cout<<*ps<<" 222"<<endl;}
//string ptr not const,so *ps not const,
void mod_str(const string &s);
const string & show_str();
HasPtr &operator=(const HasPtr &Has);
HasPtr &operator=(const string &s);
~HasPtr();
bool operator<(const HasPtr &s);
private:
string * ps;
int i;
};
bool HasPtr::operator<(const HasPtr &s)
{
if(*ps<*s.ps)
return true;
else
return false;
}
bool operator<(const HasPtr &l,const HasPtr &s)
{
if(*l.ps<*s.ps)
return true;
else
return false;
}
void swap(HasPtr &lhs,HasPtr &rhs)
{
using std::swap;
swap(lhs.ps,rhs.ps);
swap(lhs.i,rhs.i);
cout<<"swap()"<<endl;
}
HasPtr::~HasPtr()
{
delete ps;
}
HasPtr &HasPtr::operator=(const string &s)
{
auto p=new string(s);
delete ps;
ps=p;
return *this;
}
HasPtr &HasPtr::operator=(const HasPtr &Has)
{
auto p=new string(*Has.ps);
delete ps;
ps=p;
i=Has.i;
return *this;
}
void HasPtr::mod_str(const string &s)
{
delete ps;
ps=new string(s);
}
const string & HasPtr::show_str()
{
return *ps;
}
int main()
{
//vector<HasPtr> v{string("q"),string("w"),string("e"),string("r")};
//v.push_back(string("qqq"));
HasPtr b=string("qqqqq");
//sort(v.begin(),v.end());
//for(auto &a:v)
//cout<<a.show_str()<<endl;
return 0;
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示