形参为引用,为创建临时对象吗?该如何处理
形参为引用,为创建临时对象吗?
class Person
{
public:
Person(string nam) : name(nam)
{};
string Getname() const;
string Getaddr() const;
private:
string name;
string addr;
};
void f(const Person &p1)
{
cout < < p1.Getname();
cout < < p1.Getaddr();
}
定义了一个Person类,和一个f函数,main函数代码如下:
int main()
{
string name = "hello world ";
f(name);
return 0;
}
照理说f(name)的形参是Person类的引用,应该不会创建临时对象,但是程序可以执行,并输入“helloworld”,说明调用了构造函数,并创建了临时对象。
我觉得调用构造函数的条件得有临时对象,但是这里又是个引用,前后矛盾,求高手解释。
------解决方案--------------------
没啥矛盾的,你输入的是string引用,函数f要的是Person引用,而Person又有String参数的构造函数,就给你创建了一个Person对象,保证满足函数f的参数类型正确
------解决方案--------------------
void f(const Person &p1)
形参是person引用
你实参却是string
这里发生了 string到Person 的隐式转换。 自然会有一次构造发生。
------解决方案--------------------
楼上两位高手说的很清楚了,形参既然是Person的引用,你实参至少给人家一个Person的对象撒。
人家要雪糕,你给了一块钱,人家只好拿着这一块钱自己去买了。
class Person
{
public:
Person(string nam) : name(nam)
{};
string Getname() const;
string Getaddr() const;
private:
string name;
string addr;
};
void f(const Person &p1)
{
cout < < p1.Getname();
cout < < p1.Getaddr();
}
定义了一个Person类,和一个f函数,main函数代码如下:
int main()
{
string name = "hello world ";
f(name);
return 0;
}
照理说f(name)的形参是Person类的引用,应该不会创建临时对象,但是程序可以执行,并输入“helloworld”,说明调用了构造函数,并创建了临时对象。
我觉得调用构造函数的条件得有临时对象,但是这里又是个引用,前后矛盾,求高手解释。
------解决方案--------------------
没啥矛盾的,你输入的是string引用,函数f要的是Person引用,而Person又有String参数的构造函数,就给你创建了一个Person对象,保证满足函数f的参数类型正确
------解决方案--------------------
void f(const Person &p1)
形参是person引用
你实参却是string
这里发生了 string到Person 的隐式转换。 自然会有一次构造发生。
------解决方案--------------------
楼上两位高手说的很清楚了,形参既然是Person的引用,你实参至少给人家一个Person的对象撒。
人家要雪糕,你给了一块钱,人家只好拿着这一块钱自己去买了。