类的真正形态(上)
问题:经过不停的改进,结构体struct变得越来越不像它在C语言中的样子了。
在C语言中,struct中是不能定义成员函数的,你如果实在想用成员函数,只能定义成函数指针的形式。这种方式在内核中太普遍了。
struct 在C语言中已经有了自己的含义,因此C++也得必须继续兼容,但是在兼容的基础上又有了改进,比如说可以定义成员函数了。
在C++中提供了新的关键字class用于类定义
class和struct的用法是完全相同的
class和struct有什么本质区别?
在用struct定义类时,所有成员的默认访问级别为public
在用class定义类时,所有成员的默认访问级别为private
struct A
{
//default to public
int i;
//default to public
int getI()
{
return i;
}
};
class A
{
//default to private
int i;
//default to private
int getI()
{
return i;
}
};
好的习惯:不管是用class定义类,还是用struct定义类,必须显示的指明成员变量和成员函数的访问级别。
类的真正形态(下)
小实例
需求:开发一个用于四则运算的类
-提供setOperator函数设置运算类型
-提供setParameter函数设置运算参数
-提供result函数进行运算
其返回值表示运算的合法性
通过引用参数返回结果
C++中的类支持声明和实现的分离
声明就是类的使用方式,实现就是类的实现细节
将类的实现和定义分开
-.h 头文件中只有类的声明
.成员变量和成员函数的声明
-.cpp源文件中完成类的其它实现
.成员函数的具体实现
实例分析
Operator类的分析
Operator.h
1 #ifndef _OPERATOR_H_ 2 #define _OPERATOR_H_ 3 4 class Operator 5 { 6 private: 7 char mOp; 8 double mP1; 9 double mP2; 10 11 public: 12 bool setOperator(char op); 13 void setParameter(double p1, double p2); 14 bool result(double& r); 15 }; 16 17 #endif
Operator.cpp
1 #include "Operator.h" 2 3 bool Operator::setOperator(char op) 4 { 5 bool ret = false; 6 7 if( (op == '+') || (op == '-') || (op == '*') || (op == '/') ) 8 { 9 ret = true; 10 mOp = op; 11 } 12 else 13 { 14 mOp = '\0'; 15 } 16 17 return ret; 18 } 19 20 void Operator::setParameter(double p1, double p2) 21 { 22 mP1 = p1; 23 mP2 = p2; 24 } 25 26 bool Operator::result(double& r) 27 { 28 bool ret = true; 29 30 switch( mOp ) 31 { 32 case '/': 33 if( (-0.000000001 < mP2) && (mP2 < 0.000000001) ) 34 { 35 ret = false; 36 } 37 else 38 { 39 r = mP1 / mP2; 40 } 41 break; 42 case '+': 43 r = mP1 + mP2; 44 break; 45 case '*': 46 r = mP1 * mP2; 47 break; 48 case '-': 49 r = mP1 - mP2; 50 break; 51 default: 52 ret = false; 53 break; 54 } 55 56 return ret; 57 }
类已经定义好了,接下来进行类的使用
1 #include <stdio.h> 2 #include "Operator.h" 3 4 int main() 5 { 6 Operator op; 7 double r = 0; 8 op.setOperator('/'); 9 op.setParameter(9,3); 10 11 if (op.result(r)) 12 { 13 printf("r = %lf\n",r); 14 } 15 else 16 { 17 printf("Calculate error!\n"); 18 } 19 20 return 0; 21 }
小结:
C++引进了新的关键字class用于定义类
struct 和class的区别在于默认访问级别的不同
C++中的类支持声明和实现的分离
在头文件中声明类
在源文件中实现类