赞
踩
类通常分为以下两个部分
注:当使用类时,不需要关心其实现细节;当创建一个类时,才需要考虑其内部实现细节;
使用手机时,只需要知道如何发短信,打电话,拍照等等即可,不需要关心手机是如何开发出来的。手机开发工程师就需要考虑手机内部的实现细节,如硬件细节和软件细节。
根据日常生活中的经验:并不是类的每个属性都是对外公开的
如:女孩子不希望外人知道自己的年龄和体重
如:一些男孩子不希望别人知道自己的身高和收入
而一些类的属性是对外公开的
如:人类的姓名,学历,国籍等
因此,需要在类的表示法中定义属性和行为的公开级别,类似文件系统中文件的权限
成员变量
C++中用于表示类属性的变量;
成员函数
C++中用于表示类行为的函数;
在C++中可以给成员变量和成员函数定义访问级别
public:成员变量和成员函数可以在类的内部和外界访问和调用
private:成员变量和成员函数只能在类的内部被访问和调用
注意:C++中通过定义类成员的访问级别实现封装机制
类成员的访问属性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;
- }
编译运行结果如下:
注: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有什么区别?
- #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成员只能够在类内部使用;
类的定义和实现可以分开到不同的文件中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。