构造函数
构造函数的名字必须与类名相同。
构造函数没有返回类型--包括void类型
在创建对象时,构造函数就被调用,它的作用就是初始化对象
#include <iostream>
const double PI = 3.14159;
using namespace std;
class Circle{
public:
double radious;
public:
Circle(){
radious = 1;
}
Circle(double newRadious){
radious = newRadious;
}
double getArea(){
return radious*radious*PI;
}
};
int main(){
Circle c1;
Circle c2(2);
cout<<c1.radious<<" "<<c1.getArea()<<endl;
cout<<c2.radious<<" "<<c2.getArea()<<endl;
return 0;
}<span style="color:#ff0000;">
</span>
C++和java一样在给属性进行赋值的时候都必须要写在构造函数里面
数据域的封装
上述代码中radious数据域可以在主函数里直接修改,例如c1.radious = 5;这不是一个好的编程习惯。原因有二
1.首先,数据可能会被搞乱
2.其次,这种方式会使类难以维护,容易出现bug。
为防止客户程序直接修改类的属性,我们应该使用private关键字,将数据域声明为私有的,这就是所谓的数据域封装。
class Circle{
private:
double radious;
public:
Circle();
};
如果一个数据域是私有的,那么在类之外的程序中,无法通过直接饮用类对象来访问它。但客户程序尝尝需要提取,修改数据域。为了使私有数据域可以被访问,可定义一个成员函数get返回数据的值。为使私有数据域可以被修改,可提供一个成员函数set为数据域设置新值。
get函数具有如下的函数签名
returnType getPropertyName()
set:
public void setPropertyName(dataType propertyValue)
#include <iostream>
const double PI = 3.14159;
using namespace std;
/*class Circle{
public:
double radious;
public:
Circle(){
radious = 1;
}
Circle(double newRadious){
radious = newRadious;
}
double getArea(){
return radious*radious*PI;
}
};
int main(){
Circle c1;
Circle c2(2);
cout<<c1.radious<<" "<<c1.getArea()<<endl;
cout<<c2.radious<<" "<<c2.getArea()<<endl;
return 0;
}
class Circle{
private:
double radious;
public:
};*/
class Circle{
private:
double radious;
public:
Circle(double newRadious){
radious = newRadious;
}
void setRadious(double newRadious){
radious = (newRadious >= 0)? newRadious:0;
}
double getArea(){
return radious*radious*PI;
}
double getradious(){
return radious;
}
};
int main(){
Circle c1(5);
cout<<c1.getArea()<<endl;
c1.setRadious(5);
//cout<<c1.radious<<endl;//因为是private所以不能直接访问,所以要先获取
cout<<c1.getradious()<<endl;
return 0;
}
变量变为private后,不能直接在主函数里对其进行操作,一定要用成员函数set或者get对其进行操作。set是对其进行重新赋值,get是获取属性值。但是在JAVA中却可以。即在java中可以不需要用成员函数对其进行取值或者是重新赋值。
在堆栈中创建动态对象
当在一个函数中声明一个Circle对象时,对象是创建在栈中的。当函数返回时,对象会被销毁,为保留对象,我们可以使用new操作符在堆中动态创建对象。java中的对象是创建在堆中的
当程序结束时,动态对象会被销毁,也可以使用关键字delete显式销毁对象这个销毁时直接从内存中销毁,跟析构函数不一样,析构函数不能直接从内存中销毁