#include"iostream" using namespace std; #define PI 3.1416 class SimpleCircle{ private: int *itsRadius; //int *itsRadius=NULL;为什么这样不行啊? public: SimpleCircle(); SimpleCircle(int); SimpleCircle(const SimpleCircle &); ~SimpleCircle(){} void setRadius(int); int getRadius()const; }; SimpleCircle::SimpleCircle(){ itsRadius=new int(5); //*itsRadius=5;为什么这样不行 } SimpleCircle::SimpleCircle(int radius){ itsRadius=new int(radius); //*itsRadius=radius;为什么这样不行 } SimpleCircle::SimpleCircle(const SimpleCircle &rhs){ int val=rhs.getRadius(); itsRadius=new int(val); //itsRadius=rhs.getRadius()const;为什么这样不行 } int SimpleCircle::getRadius()const{ return *itsRadius; } int main() { SimpleCircle CircleOne,CircleTwo(9); cout<<"CirclrOne:"<<CircleOne.getRadius()<<endl; cout<<"CircleTwo:"<<CircleTwo.getRadius()<<endl; return 0; }
1.不能在类里直接给数据成员赋值
2.
*itsRadius=5; 这个指针并没有初始化,没有指向任何内存区域,对它解引用会出现未知错误。
为什么private int *itsRadius;可以不初始化呢?这样不会危险吗?
类的声明,好比用户自己定义了一种新的类型,而这种类型就好比int,double等类型,它在没有实际的对象之前,在内存中并没有相对应的实际的对象的存在,也就是说类中的int等对象并不相当于类外的int等对象,在内存中并没有被分配相应的空间,因此不能直接给它赋值,因为不知道到底要将这个值给谁的嘛~~为什么要new一下,而不能直接赋值也是同样的道理啦。当然当类定义一个对象的后,如,SimpleCircle clc;,此时若成员变量改为public,则能够通过int a=8; clc.itsRadius=&a 进行直接赋值了(当然得将默认构造函数中的itsRadius=new int(5);这句话给删除啦~)。
个人理解,可能有误~~
//int *itsRadius=NULL;为什么这样不行啊?
这样不行是因为类的定义不允许初始化数据成员,除了静态数据成员外。
而下面三个不行则是因为itsRadius是一个指针,由于没有初始化,将会指向一个未知的空间,对这个未知内存空间赋值是很危险的,如果是一块只读空间,将会运行时出错。
1.//int *itsRadius=NULL;为什么这样不行啊?
因为类中的数据成员不能直接赋初值,必须通过类的构造函数或初始化函数赋初值。
//*itsRadius=5;为什么这样不行
2.指针没有动态分配内存时,不允许赋值,否则运行会出错。