c++中关于拷贝构造函数 和const的相关问题,希望有关于const,&的专业知识共享 50

#include<iostream>#include"string.h"usingnamespacestd;classString{private:intlen;char... #include <iostream>

#include "string.h"

using namespace std;

class String

{

private:

int len;

char *p;

public:

String():len(0)

{

p=new char[len+1];

strcpy(p,"");

}

String(char *s)

{

if(!s)

{

len=0;

s=new char[len+1];

strcpy(p,s);

}

else

{

len=(int)strlen(s);

p=new char[len+1];

strcpy(p,s);

}

cout<<"lei xing zhuan huan !"<<endl;

}

const String(const String&a)

{

len=a.len;

p=new char[len+1];

strcpy(p,a.p);

cout<<"copy";

}

~ String()

{

delete []p;

p=NULL;

}

friend void print(String &s);

//friend void print(const String &s);//为什么加了const就可以了????

};

void print(String &s)

//void print(const string &s)//为什么加了const就可以了????

{

cout<<s.p<<" ";

cout<<endl;

}

int main(int argc, char * argv[])

{

char *a="we are the world";

print(a);

return 0;

}
展开
 我来答
lkjhggv
2015-08-12 · TA获得超过3063个赞
知道大有可为答主
回答量:1550
采纳率:66%
帮助的人:1325万
展开全部
因为你调用的参数是 char* ,而函数的参数是string,必须发生隐式转换。
而隐式转换生成的结果是string临时变量,而你又是引用,所以形参引用的是临时变量。
但只有const引用才能引用临时变量,所以这里必须加const才能编译通过。
追问
求详解,
我想的是:这里&是为了不为行参开辟内存,和实参共享,行参是实参的别名
const是为了不改变实参的值。还是不太懂加const的其他作用
追答

注意你的实参和形参的类型不一致,所以会发生隐式转换,而隐式转换生成的是临时变量,临时变量是不允许修改的,所以在引用临时变量时,必须是const引用

 int a = 10;

 int& b = (a + 1); // 错误,a+1是临时变量,右值不能被引用,error C2440: “初始化”: 无法从“int”转换为“int &”

 const int& c = (a + 1); // 正确
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式