#include
"stdafx.h"
#include
"iostream.h"
class circle
{
private:
int x,y,r,s;
public:
void print();
void circle::addarea(circle p1,circle p2);
void circle::display();
circle();
circle(int a,int b,int c);
~circle();
};
void circle::print()
{
cout<<
"圆心:"<<
"("<<x<<
","<<y<<
")"<<endl;
cout<<
"半径:"<<r<<endl;
}
void circle::addarea(circle p1,circle p2)//计算两圆面积和
{
s=3.14*(p1.r*p1.r)+3.14*(p2.r+p2.r);
}
void circle::display()
{
cout<<
"面积和为:"<<s<<endl;
}
//构造函数能够重载,当本身有写新的构造函数,系统原来默认的构造函数消失,若是还想要,则要本身去重载;只能系统调用,不能由程序调用
circle::circle()
{
}
circle::circle(int a,int b,int c)
{
x=a;y=b;r=c;
}
//析构函数和构造函数同样,一旦有写新的析构函数,系统原来默认的析构函数消失,而且不能重载;能够由系统自动调用,也能够由程序调用
circle::~circle()
{
cout<<
"析构:"<<x<<
","<<y<<
","<<r<<endl;
}
int main(int argc, char* argv[])
{
circle p1(0,0,6);
p1.print();
circle *p2=
NULL;
p2=
new circle(0,0,7);
p2->print();
circle p3;//由于有重载构造函数的存在
p3.addarea(p1,*p2);
p3.display();
delete p2;
p2=
NULL;
return 0;
}
程序执行结果及分析:
圆心:(0,0)
半径:6
//这是执行circle p1(0,0,6);p1.print();的结果
圆心:(0,0)
半径:7
//这是执行circle *p2=NULL;p2=new circle(0,0,7);p2->print();的结果
析构:0,0,6
析构:0,0,7
//这是执行p3.addarea(p1,*p2);的结果
//首先这个函数的两个形参利用重载构造函数中的一个来建立了实实在在的对象,而后由于调用的缘故,p1,p2做为实参拷给了两个形参,初始化的数据也给了形参,因而形参的数据成员就有了值。可是这两个形参是栈变量,函数执行完毕以后要销毁的,因此就执行到了析构函数那里,就有了这个
面积和为:157
//这是执行p3.display()的结果
析构:0,0,7
//这里执行delete p2;p2=NULL;的结果,
析构:-858993460,-858993460,-858993460
//由于程序要接受了,这种对象都会自动销毁的,因而销毁到了p3这里,但是p3的建立的时候,调用的构造函数但是没有给数据成员复制的啊,因而,销毁的时候也是一堆不肯定数据
析构:0,0,6
//最后销毁p1
刚才在程序中,也看到了,那个做为参量的类的对象赋给另一个被建立的同类对象,能够作对象的初始化之用
那它究竟是怎么实现的,首先这个是系统自带的,编译系统会自动生成一个缺省的拷贝初始化构造函数,其实现的大体原理是引用,基本上以下代码
#include
"stdafx.h"
#include
"iostream.h"
class circle
{
private:
int x,y,r;
public:
void print();
circle(int a,int b,int c);
circle(circle &p);
};
void circle::print()
{
cout<<
"圆心:("<<x<<
","<<y<<
")"<<endl;
cout<<
"半径:"<<r<<endl;
}
circle::circle(int a,int b,int c)
{
x=a;
y=b;
r=c;
}
circle::circle(circle &p)
{
x=p.x;
y=p.y;
r=p.r;
}
int main(int argc, char* argv[])
{
circle p1(0,0,1);
circle p2(p1);
p1.print();
p2.print();
return 0;
}
其结果以下:
圆心:(0,0)
半径:1
圆心:(0,0)
半径:1
可见,利用引用来实现拷贝初始化构造函数