c++类的问题

#include<iostream>
#include<stdlib.h>
using namespace std;

class circle
{
public:
circle();
circle(float);
circle(circle &c);

float area()
{return radius*radius*3.14159;}

float getradius()
{return radius;}

static int getnumofcircle()
{return num;}

private:
float radius;
static int num;
}

int circle::num=0; //编译显示有错误,该怎么改

circle::circle(float r)
{
if(r>0)
radius=r;
else
radius=0;
num++;
}

circle::circle(circle &c)
{
radius=c.radius;
num++;
}

int main()
{
circle c1;
circle c2(10.5);
cout<<"创建对象c3前,共有"<<circle::getnumofcircle()<<"个circle类对象\n";
circle c3=c2;
cout<<"创建对象c3后,共有"<<circle::getnumofcircle()<<"个circle类对象\n";

system("pause");
return 0;
}

①编译不通过,该怎么改
②另外我想问一下,拷贝类的构造函数到底有什么用?
③这是书上的程序,运行结果显示是
"……共有2个……"(省略了)
"……共有3个……"(省略了)
为什么会有"2个" 即 为什么num会自加两次?

第1个回答  2012-02-29
①编译不通过是因为你这一行上面的class最后没用分号结尾,还有一个问题是你的circle类的无参数构造函数circle();并没有定义一个函数体,但是却又有声明,编译之后可能会无法链接

②拷贝构造函数的作用一般是这样,例如
circle a;
circle b(a);//调用拷贝构造函数用a初始化b
circle c = a;//这个时候一般也会调用拷贝构造函数,而不是operator=

③这个问题我猜想是你忽略了circle的无参数构造函数吧,仔细看看书怎么写的,假设circle的这个无参数构造函数里面也有一次num++,就说得通了。
第2个回答  2012-02-29
回答1: 你class circel声明的最后忘记分号了
private:
float radius;
static int num;
}; //<<<<这里有个分号,你忘记了

回答2:
作用就是直接用另一个已经实例好的类来生成另一个类,
回答3:

生成c1,加一次,生成c2加一次
注意,静态变量,在内存里放在静态存储区,整个内存中只有一个副本,不论你实例化多少个类,都只有一个静态变量。也就是说c1和c2,c3中,num这个静态变量,就是他们共有的。正因为这个特性,所以静态变量才要在类外赋值,因为他没有this指针,必须事先给他赋值。
第3个回答  2012-02-29
我的结果是1次,2次
////////////处是我改的,class {}要以分号结束

#include<iostream>
#include<stdlib.h>
using namespace std;

class circle
{
public:
circle()////////////////////////
{
}
circle(float);
circle(circle &c);

float area()
{return radius*radius*3.14159;}

float getradius()
{return radius;}

static int getnumofcircle()
{return num;}

private:
float radius;
static int num;
};////////////////////////

int circle::num=0; //±àÒëÏÔʾÓдíÎ󣬸ÃÔõô¸Ä

circle::circle(float r)
{
if(r>0)
radius=r;
else
radius=0;
num++;
}

circle::circle(circle &c)
{
radius=c.radius;
num++;
}

int main()
{
circle c1;
circle c2(10.5);
cout<<"´´½¨¶ÔÏóc3Ç°£¬¹²ÓÐ"<<circle::getnumofcircle()<<"¸öcircleÀà¶ÔÏó\n";
circle c3=c2;
cout<<"´´½¨¶ÔÏóc3ºó£¬¹²ÓÐ"<<circle::getnumofcircle()<<"¸öcircleÀà¶ÔÏó\n";

system("pause");
return 0;
}追问

我漏了分号,而且少了一段
circle::circle()
{
radius=1.0;
num++;
}

所以请直接帮我解释一下后两个问题,谢谢

追答

那应该就对上了把,
circle c1;调用默认构造函数,num 加1
circle c2(10.5);调用带float参数的构造函数 num再加1
不就是2了?

circle c3=c2;调用拷贝构造函数,num又加了1

由于num是静态数据,所有对象共享,所有一直在加,每个对象都能看得到

本回答被提问者采纳
第4个回答  2012-02-29
问题这么多,代码这么长,先马克,待会回答你追问

我漏了分号,而且少了一段
circle::circle()
{
radius=1.0;
num++;
}

所以请直接帮我解释一下后两个问题,谢谢

相似回答
大家正在搜