关于复制构造函数的两个问题
#include<iostream>
#include<string>
using namespace std;
struct NoName
{NoName(string a=""):p(new string(a)),i(0),d(0.0){}
NoName(const NoName &n);
NoName &operator=(const NoName &n);
~NoName(){delete p;}
private:
string *p;
int i;
double d;
};
NoName::NoName(const NoName &n):i(n.i),d(n.d),p(new string(*n.p)){}
NoName &NoName::operator=(const NoName &n)
{i=n.i;
d=n.d;
p=new string(*n.p);
return *this;}
int add(int x,int y)
int main(void)
{NoName a("1234");
NoName b(a);
const NoName c(a);
const NoName d=a;//这个地方d是const的为什么能传到重载=的const *NoName this里面去
getchar();
return 0;}
1.为什么不需要定义两个版本来进行复制构造
2.为什么可以一边声明const NoName d;就可以一边调用"="函数,"="和普通函数不一样吗
比如
关于复制构造函数的两个问题
void print(int a)
{a=3;}
int main()
{
print(int b)//这里和刚刚类似(边定义边使用),为什么这个报错,虽然这个会被自动回收
}
[解决办法]
用const声明的函数形参,可以传入const和不带const的实参。反之则不行。其实很容易理解,const形参表示在函数内该参数不可修改,这样传入实参是否可修改就不影响了。
[解决办法]
1.
NoName a("1234");//调用NoName(string a="")
NoName b(a);//下面三个都是调用了NoName(const NoName &n)
const NoName c(a);
const NoName d=a;//这个并没有使用重载=
楼主可以用下面的代码看看到底是调用了哪个构造函数或者可以断点看下:
#include<iostream>
#include<string>
using namespace std;
struct NoName
{
NoName(string a=""):p(new string(a)),i(0),d(0.0)
{
cout << "NoName(string a=\"\")" <<endl;
}
NoName(const NoName &n);
NoName &operator=(const NoName &n);
~NoName(){delete p;}
private:
string *p;
int i;
double d;
};
NoName::NoName(const NoName &n):i(n.i),d(n.d),p(new string(*n.p))
{
cout << "NoName::NoName(const NoName &n)" << endl;
}
NoName &NoName::operator=(const NoName &n)
{
cout << "NoName::operator=" << endl;
i=n.i;
d=n.d;
p=new string(*n.p);
return *this;
}
int main(void)
{
NoName a("1234");
NoName b(a);
const NoName c(a);
const NoName d=a;
system("pause");
return 0;
}
2.const NoName d=a;这里并没有调用重载=。在这里的用法是调用了拷贝构造函数,楼主可以好好看看一本全面的C++书籍,这样会好点,可以看TCPL或者《C++ Primer》
[解决办法]
const NoName d=a;
这句调用的是复制构造函数,不是 operator=,和后者没关系。