看下面一段代码,还是实现计算一个圆的面积的功能,
#include<iostream>
using namespace std;//c++的命名空间
class circle
{
public:
double r;
double pi = 3.1415926;
double area = pi*r*r;
};
// 2010编译不通过 但是在2013编译器能编译通过
int main()
{
circle c1;
cout << "please input your r" << endl;
cin >> c1.r;
cout << c1.area << endl; //乱码
system("pause");
return 0;
}
这段代码在早期的vs软件中不能被通过,而且在输出"c1.area"时,会出现乱码,那我们来分析一下这是为什么。顺着主函数的顺序从内存的角度来进行捋清,先是定义了一个对象c1,这个时候,开始进行circle类的初始化,在初始化这个类的时候,类本身,内存是不会提供分配的,只会进行到类里面的变量的初始化时,才会进行分配,先是,变量r,分配内存;再是pi,最后是area。这里要注意的是,r本身,没有给其初始化赋值,所以,其对应的内存空间内的值是随机值,同理,area因为牵扯到r的计算,其内存空间放的也是随机值。那么三个变量中,除了pi是有值存放的,其他俩个,都是随机值。好,当类中的语句进行完毕后,c1也算是初始化完毕了,接着再在主函中的顺序进行,当进行到"cout << c1.area << endl;"这里只是把类中的area给调用出来,而此刻,c1.area的值依旧是随机值,因为在这之前,虽然给c1.r存入新值,但并未执行"area = pi*r*r;"这就造成乱码的情况,内存示意图如下:
这是一个典型的从面向过程到面向对象的错误,而这该怎么解决呢?再看如下的代码:
#include<iostream>
using namespace std;//c++的命名空间
class circle
{
public:
double r;
double pi = 3.1415926;
double getS()
{
double area = pi*r*r;
return area;
}
};
// 2010编译不通过 但是在2013编译器能编译通过
int main()
{
circle c1;
cout << "please input your r" << endl;
cin >> c1.r;
cout << getS() << endl; //以成员函数的形式输出
system("pause");
return 0;
}
将求面积的部分写成一个成员函数,就把上面的问题给解决了。因为每次调用成员函数的时候,函数是都要执行一次的,所以,这样可以更新成员函数的输出,同时避免了之前的乱码问题。
如果一个类里面,不写成员函数,和写了成员函数的表现是不一样的,成员函数保证只要调用成员函数,就会执行成员函数中的语句,而这就是和面向过程思路编程的一个重要的不同。
好好体会一下,这就是从C语言面向过程开发,到C++面向对象开发的一个明显的区别。这个例子就是这两种编程差异的典型案例。