声明:Q&A系列的文章是我在平时自己遇到的或者看到的一些问题,本着再小的问题也需要有人解答的想法,将这些问题和答案整理出来。
欢迎和我讨论问题,同时也欢迎转载Q&A系列的文章。
在C语言中,“数据”和“数据处理”是分开来声明的,也就是说语言本身并没有支持“数据和函数”之间的关联性,这样的程序方法称为程序性的,也就是面向结构的。它们由一组“分布在各个功能为导向的函数中“的算法所驱动,它们处理的是共同的外部数据。(摘自:深度探索C++对象模型)
按照一般入门的人的理解,就有了下面的例子:
bool print(char name[20], int hight, int age)
{
printf("people:\n");
printf("name:%s\n", name);
printf("hight:%dcm\tage:%dyear\n", hight, age);
return true;
}
int main()
{
char people1[10] = "angle";
int hight = 180, age = 300;
print(people1, hight, age);
system("PAUSE");
return 0;
}
再来个书上的小改后的例子:
#include <stdio.h>
typedef struct point3d
{
float x;
float y;
float z;
}Point3d;
void Point3d_print(const Point3d *pd)
{
printf("(%g, %g, %g)\n", pd->x, pd->y, pd->z);
}
int main()
{
Point3d point;
point.x = point.y = point.z = 1;
Point3d_print(&point);
system("PAUSE");
return 0;
}
而在C++中,数据和函数可以封装起来,形成一个整体(抽象数据类型),即class。
先上个小改后的书上的例子:
#include <iostream>
class Point3d
{
public :
Point3d(float x = 0.0, float y = 0.0, float z =0.0)//默认构造函数,有默认参数
: _x(x), _y(y), _z(z)//初始化列表
{
}
//常成员函数,用于常对象的调用
float x() const {return _x;}
float y() const {return _y;}
float z() const {return _z;}
//重载上面的常成员函数,用于被一般对象调用
float x() {return _x;}
float y() {return _y;}
float z() {return _z;}
void x(float xval){_x = xval;}
private:
float _x;
float _y;
float _z;
};
//重载<< 操作符
inline std::ostream& operator << (std::ostream &os, const Point3d &pt)
{
return os << "(" << pt.x() << ","
<< pt.y() << "," << pt.z() << ")";
}
int main()
{
Point3d point(1.1, 2.2, 3.3);
std::cout << point ;//调用上面重载版本的操作符
std::cout << std::endl;
system("PAUSE");
return 0;
}
通过class ,我们就可以把”数据“和”处理数据的操作“声明在一起,并且通过public和private等访问修饰符封装class里面的内容。可以稍微从这里窥探一下面向过程和面向对象的区别。
参考资料:《
深度探索C++对象模型》