C++-Record02—为什么要引用成员函数?

看下面一段代码,还是实现计算一个圆的面积的功能, 

#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++面向对象开发的一个明显的区别。这个例子就是这两种编程差异的典型案例。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值