类通常分为以下两个部分
1. 类的实现细节 2. 类的使用方式
注:当使用类时,不需要关心其实现细节;当创建一个类时,才需要考虑其内部实现细节;
使用手机时,只需要知道如何发短信,打电话,拍照等等即可,不需要关心手机是如何开发出来的。手机开发工程师就需要考虑手机内部的实现细节,如硬件细节和软件细节。
根据日常生活中的经验:并不是类的每个属性都是对外公开的 如:女孩子不希望外人知道自己的年龄和身高 如:一些男孩子不希望别人知道自己会尿床 而一些类的属性是对外公开的 如:人类的姓名,学历,国籍等 因此,需要在类的表示法中定义属性和行为的公开级别,类似文件系统中文件的权限
成员变量 C++中用于表示类属性的变量; 成员函数 C++中用于表示类行为的函数; 在C++中可以给成员变量和成员函数定义访问级别 public 成员变量和成员函数可以在类的内部和外界访问和调用 private 成员变量和成员函数只能在类的内部被访问和调用
类成员的访问属性demo:
#include <stdio.h> struct Biology { bool living; }; struct Animal : Biology { bool movable; void findFood() { } }; struct Plant : Biology { bool growable; }; struct Beast : Animal { void sleep() { } }; struct Human : Animal { void sleep() { printf("I'm sleeping...\n"); } void work() { printf("I'm working...\n"); } }; struct Girl : Human { private: int age; public: void play() { printf("I'm girl, I'm playing...\n"); } void print() { age = 22; printf("Girl's age is %d\n", age); play(); sleep(); work(); } }; struct Boy : Human { public: int age; void play() { printf("I'm boy, I'm playing...\n"); } void print() { age = 23; printf("Boy's age is %d\n", age); play(); sleep(); work(); } }; int main(int argc, char *argv[]) { Girl girl; girl.print(); Boy boy; boy.print(); printf("Press any key to continue..."); getchar(); return 0; }编译运行结果如下:
类成员的作用域都只在类的内部,外部无法直接访问 成员函数可以直接访问成员变量和调用其它成员函数 类的外部可以通过类变量访问public成员 类成员的作用域与访问级别没有关系
注:C++中用struct定义的类的所有成员默认为public
类成员的作用域demo:
#include <stdio.h> int i = 1; struct Test { private: int i; public: int j; int getI() { i = 3; return i; } }; int main() { int i = 2; Test test; test.j = 4; printf("i = %d\n", i); printf("::i = %d\n", ::i); //printf("test.i = %d\n", test.i); printf("test.j = %d\n", test.j); printf("test.getI() = %d\n", test.getI()); printf("Press any key to continue..."); getchar(); return 0; }编译运行结果如下:
struct在C语言中已经有了自己的含义,只能继续兼容。在C++中提供了新的关键字class用于类定义。class和struct的用法是完全相同的。
class和struct有什么区别?
1. 在用struct定义类时,所有成员的默认属性为public; 2. 在用class定义类时,所有成员的默认属性为private;
#include <stdio.h> struct A { int i; int getI() { return i; } }; class B { int i; int getI() { return i; } }; int main(int argc, char *argv[]) { A a; B b; a.i = 1; a.getI(); b.i = 2; b.getI(); printf("Press any key to continue..."); getchar(); return 0; }编译运行结果如下:
要求: 1. 提供setOperator函数设置运算类型,如加,减,乘,除; 2. 提供setParameter函数设置运算参数,类型为整型; 3. 提供result函数进行运算,其返回值表示运算的合法性,通过引用参数返回结果;
//Operator.cpp #include "Operator.h" bool Operator::setOperator(char op) { bool ret = false; if( (op == '+') || (op == '-') || (op == '*') || (op == '/') ) { ret = true; mOp = op; } else { mOp = '\0'; } return ret; } void Operator::setParameter(double p1, double p2) { mP1 = p1; mP2 = p2; } bool Operator::result(double& r) { bool ret = true; switch( mOp ) { case '/': if( (-0.000000001 < mP2) && (mP2 < 0.000000001) ) { ret = false; } else { r = mP1 / mP2; } break; case '+': r = mP1 + mP2; break; case '*': r = mP1 * mP2; break; case '-': r = mP1 - mP2; break; default: ret = false; break; } return ret; } //Operator.h #ifndef _OPERATOR_H_ #define _OPERATOR_H_ class Operator { private: char mOp; double mP1; double mP2; public: bool setOperator(char op); void setParameter(double p1, double p2); bool result(double& r); }; #endif //main.cpp #include <stdio.h> #include "Operator.h" int main(int argc, char *argv[]) { Operator op; double r = 0; op.setOperator('/'); op.setParameter(8, 4); if( op.result(r) ) { printf("Result is %f\n", r); } printf("Press any key to continue..."); getchar(); return 0; }编译运行结果如下:
类的精华在于封装 1. 将实现细节和使用方式相分离;
C++中通过public和private实现类的封装 1. public成员可以通过变量被外界访问; 2. private成员只能够在类内部使用;
类的定义和实现可以分开到不同的文件中。
