c++入门 构造函数 求解答!!!!追加财富值!
#include <iostream>
using namespace std;
class A{
public:
A(){
cout<<"construct A() is called!!"<<endl;
}
A(coust A &a)
{
x=a.x;
y=a.y;//此两行保证拷贝构造不被覆盖,xy哪里来的???
cout<<"construct A(a&) IS called!"<<endl;
}//屏蔽掉这一段结果是对的,系统也有默认的拷贝构造函数
void setxy(int x;int y){
this->x=x;
this->y=y;//这是什么意思
}
void show(){
cout<<"x="<<x<<",y="<<y<<endl;}
private:
int x;
int y;
};
//void printxy(A &a)
void printxy(A a){//此操作导致拷贝构造只被调用1次 加速
a.show();
}
A getA(int x,int y){
A a;
a.setxy(x,y);
return a;}//什么情况下要返回值
int main()
{ A a1,a2;//调用构造函数到底是怎么调用的 先写A 再写a 这是格式么?
a1.setxy(3,5);//第一次调用构造函数 系统默认 会覆盖原来的基类
printxy(a1);//也调用了??
A a3(a1);//显式调用拷贝构造 通过a1构造a3
printxy(a3);//也调用了 加上系统那次共4次
A* a4=getA(5,6);
printxy(*a4);
cout << "Hello world!" << endl;
return 0;
} 展开
你的问题我都回答再程序的解释中,每一步怎么执行都写了
//构造函数
#include <iostream>
using namespace std;
class A{
public:
A()
{
cout<<"construct A() is called!!"<<endl;
}
A(const A &a)
{
x=a.x;
y=a.y;//此两行保证拷贝构造不被覆盖,x,y是private中定义的类成员
cout<<"construct A(a&) IS called!"<<endl;
}//屏蔽掉这一段结果是对的,系统也有默认的拷贝构造函数
void setxy(int m,int n)
{
this->x=m;
this->y=n;//this是指向类定义的对象的一个隐含指针,这就相当于给类中的参数赋值!我改成了m,n好认了吧
}
void show()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
private://这里定义的是有类类型对象的几个参数
int x;
int y;
};
void printxy(A a)//而调用这个函数就要传递一个实参给形参吧,相当于a=a1这样就执行单形参构造函数A(const A &a)
{
a.show();
}
A getA(int x,int y)
{
A a;//调用这个函数时这边要执行默认构造函数A()
a.setxy(x,y);
return a;//执行这一句是相当于把a返回给一个A类型的对象,执行单形参构造函数A(const A &a)
}
int main()
{
A a1,a2;//这一句执行两次默认构造函数A()
a1.setxy(3,5);//这一句给a1的两个元素赋值a1.x=3,a2.x=5
printxy(a1);//这一句先执行A(const A &a)最后输出x=3,y=5
A a3(a1);//这一句直接执行A(const A &a),相当于a3=a1
printxy(a3);//这一句先执行A(const A &a)最后输出x=3,y=5
A a4;//这一句执行A()
a4=getA(5,6);//先执行A(),再执行A(const A &a)
printxy(a4);//这一句先执行A(const A &a)最后输出x=3,y=5
cout << "Hello world!" << endl;
return 0;
}
下面的再给一个图是你说的将A(const A &a)去掉
不懂再问
谢谢亲 好感人啊...
再问一句...那个this指针 在你改成mn之后是不是可以不用了呢? 还是赋值的时候都要加->这个?
还有这段也不是很懂
A getA(int x,int y)//这个函数是干嘛的啊 不是取a的值么 为什么不叫geta
{
A a;////这里在干嘛啊?构造谁啊....
a.setxy(x,y);
return a;////讲的再通俗一点就好了 我是初学==
}
this可以不要的,不要一样可以
A a;就是定义一个A类型啊,因为要调用A类里的类成员函数a.setxy(x,y),这些就是加深你对类的理解。你return a不就是相当于执行力a4=a吗,这就要执行单行参的构造函数来啊
构造函数就是对他声明的对象进行值初始化,
加这个getA其实就是让你对类有更深的了解,它返回也就是一个A类型,其实类它就是一种类型,正如我们经常用的int,string这些类型,多用就行了
可以采纳吗????
第二个问题:this->x 代表这个类的变量x,this->x=x; 就是把这个类的私有x变量赋值,y同理。
第三个问题:A getA(x,y) 这个函数就是设置一个A类对象,x,y值是通过参数传进去的,并返回设置的这个对象。所以是任何时候都返回此值,这个要需要的A类变量。
第四个问题:A a1,a2; 这句相当于声明变量,类似于 int b,c; 此时的b,c是int型变量,而a1,a2 是A类型的变量。
第五个问题:应该是也调用了,应为会创建一个A类型的对象a,此时会调用A类的构造函数。
亲好快啊!谢谢~
再问一句 a是怎么变成A的对象了呢
A getA(int x,int y){
A a;
a.setxy(x,y);
return a;}
这段是啥意思啊...
就是因为声明时候 是“ A a;” 是这么声明的,所以就是A类的对象。 原理和 “ int b;” 是一样的,把 “A” 看成 “int” 就可以了。
那是一个函数, 函数的返回值是A类型的对象, 函数名:getA, 函数参数是 x,y , 在函数里面声明了一个A类的对象名字是a, 通过调用A类的函数setxy()来对对象a的x,y值进行重新复制,最后返回对象a。
比如当你想要一个x=5,y=6的A类对象名字是d 时,就可以这么写:
A d=getA(5,6); 就可以了