#include <iostream>
using namespace std;
class Point //Point 类的声明
{
public: //外部接口
Point(int xx=0, int yy=0) {X=xx;Y=yy;} //构造函数
Point(Point &p); //拷贝构造函数
int GetX() {return X;}
int GetY() {return Y;}
private: //私有数据
int X,Y;
};
//成员函数的实现
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
cout<<"拷贝构造函数被调用"<<endl;
}
//形参为Point类对象的函数
void fun1(Point p)
{ cout<<p.GetX()<<endl;
}
//返回值为Point类对象的函数
Point fun2()
{
Point A(1,2);
return A;
}
//主程序
int main()
{
Point A(4,5); //第一个对象A
Point B(A); //情况一,用A初始化B。第一次调用拷贝构造函数
cout<<B.GetX()<<endl;
fun1(B); //情况二,对象B作为fun1的实参。第二次调用拷贝构造函数
B = fun2(); //情况三,函数的返回值是类对象,函数返回时,调用拷贝构造函数
cout<<B.GetX()<<endl;
return 0;
}
DEV环境
using namespace std;
class Point //Point 类的声明
{
public: //外部接口
Point(int xx=0, int yy=0) {X=xx;Y=yy;} //构造函数
Point(Point &p); //拷贝构造函数
int GetX() {return X;}
int GetY() {return Y;}
private: //私有数据
int X,Y;
};
//成员函数的实现
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
cout<<"拷贝构造函数被调用"<<endl;
}
//形参为Point类对象的函数
void fun1(Point p)
{ cout<<p.GetX()<<endl;
}
//返回值为Point类对象的函数
Point fun2()
{
Point A(1,2);
return A;
}
//主程序
int main()
{
Point A(4,5); //第一个对象A
Point B(A); //情况一,用A初始化B。第一次调用拷贝构造函数
cout<<B.GetX()<<endl;
fun1(B); //情况二,对象B作为fun1的实参。第二次调用拷贝构造函数
B = fun2(); //情况三,函数的返回值是类对象,函数返回时,调用拷贝构造函数
cout<<B.GetX()<<endl;
return 0;
}
DEV环境
正解:
Point(Point &p)这个构造函数要求的是左值,而你传进去的是右值,所以说类型不匹配。
所谓左值对象,可以理解为能放在赋值号左边的对象。
改成Point(const Point &p)或者Point(Point p)就过了,因为这两种形式匹配参数是右值。
--
所谓左值对象,可以理解为能放在赋值号左边的对象。
改成Point(const Point &p)或者Point(Point p)就过了,因为这两种形式匹配参数是右值。
--
改后:
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx,int yy)
{
X=xx;
Y=yy;
}
Point(const Point &p);
int GetX(){return X;}
int GetY(){return Y;}
private:
int X,Y;
};
using namespace std;
class Point
{
public:
Point(int xx,int yy)
{
X=xx;
Y=yy;
}
Point(const Point &p);
int GetX(){return X;}
int GetY(){return Y;}
private:
int X,Y;
};
Point::Point(const Point &p)
{
X=p.X;
Y=p.Y;
cout<<"拷贝构造函数被调用"<<endl;
}
{
X=p.X;
Y=p.Y;
cout<<"拷贝构造函数被调用"<<endl;
}
void fun1(Point p)
{
cout<<p.GetX()<<endl;
}
{
cout<<p.GetX()<<endl;
}
Point fun2(void)
{
Point A(1,2);
return A;
}
{
Point A(1,2);
return A;
}
int main()
{
Point A(4,5);
Point B(A);
cout<<B.GetX()<<endl;
fun1(B);
B=fun2();
cout<<B.GetX()<<endl;
system("pause");
}
{
Point A(4,5);
Point B(A);
cout<<B.GetX()<<endl;
fun1(B);
B=fun2();
cout<<B.GetX()<<endl;
system("pause");
}