Evo. G Tech Team Forum
Welcome to Evo. G Tech Team Forum. We have moved to a new website : www.evogtechteam.com

Thanks you.

by Evo. G Tech Team Management.

Join the forum, it's quick and easy

Evo. G Tech Team Forum
Welcome to Evo. G Tech Team Forum. We have moved to a new website : www.evogtechteam.com

Thanks you.

by Evo. G Tech Team Management.
Evo. G Tech Team Forum
Would you like to react to this message? Create an account in a few clicks or log in to continue.

类(Class)的基本

Go down

类(Class)的基本 Empty 类(Class)的基本

Post by too wei May 24th 2015, 15:22

C++是使用面向对象编程(Object Oriented Programming)的观念。
这个观念的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。
面向过程就是分析出解决问题所需要的步骤,然后用函数逐步实现,再依次调用就可以了


比如说,现在有一个dog类。然后我们创建一个对象叫topi。


class dog              //创建类(世界上有一种动物叫小狗)
{
  dog()    {...}          //构造函数 constructor
  ~dog()  {...}          //析构函数destructor
  void move()  {...}  //成员函数            (dog可以移动)
  void bark()    {...}  //成员函数             (dog可以汪汪叫)
  //...
};
dog topi;              //创建对象(现在有一只叫topi的小狗出现了)
topi.move();        //调用move成员函数(topi开始移动了)
topi.bark();         //调用bark成员函数(topi开始汪汪叫了)

dog larry;           //创建对象(突然又出现了一只叫larry的小狗)
larry.bark();       //调用bark成员函数(larry也开始汪汪叫了)



PS: '//' 符号代表 //过后的文字都是注释,注释不会影响程序,用来做笔记方便以后不会忘记自己写了什么
/*.......
.........
..........*/
/*和*/里的...都是注释

构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行
构造函数的名字必须与类名同名,以便编译系统能识别它并把它作为构造函数处理。
它不具有任何类型,不返回任何值。
构造函数的功能是由用户定义的,如果用户没有准备构造函数,系统会使用默认的构造函数,就是什么也不做。
构造函数最主要的目的就是初始化成员变量member variable

析构函数会在类过期时自动调用
通常在程序结束时,或函数里的局部变量在离开函数时,类变量会过期
析构函数的名字必须和类名一样,并在前面加上~
析构函数是用来delete的(可以防止内存泄露),但如果在构造函数中没有使用new分别内存,那么析构函数可能是多余

现在我们再来加强dog类,让dog变得更加完整


class dog //创建类(世界上有一种动物叫小狗)
{
public:
dog(string n) {name = n;}//构造函数 constructor
~dog()     {printf("Destructor is running\n");}        //析构函数destructor
void move()  {printf("%s is moving\n",name);} //member function 成员函数 (dog可以移动)
void bark()    {printf("%s is barking\n",name);}  //member function 成员函数 (dog可以汪汪叫)

private:
string name;     //member variable成员变量
};
dog topi("Topi");       //创建对象(现在有一只叫topi的小狗出现了)
topi.move();             //调用move成员函数(topi开始移动了)
topi.bark();              //调用bark成员函数(topi开始汪汪叫了)

dog larry("Larry");      //创建对象(突然又出现了一只叫larry的小狗)
larry.bark();              //调用bark成员函数(larry也开始汪汪叫了)



有没有发现多了一些东西?让我们一个个的看吧
string name;   
name 是 member variable成员变量,每个对象里的成员变量都不同(每只小狗的名字都不一样)

dog(string n) {name = n);  
在这里的string n是参数parameter,另外当成员函数执行时,就会运行{}里的statement,比如topi.move() 执行了 printf("%s is moving",name);
n传递了进去后就被赋值给了name,于是name就是n值了,name就被储存起来了

dog topi("Topi");
dog larry("Larry");              
这里把"Topi" 和 "Larry" 作为参数,传递了进去,然后就被储存在name里了

另外,有没有注意到 public 关键字和private关键字?

被声明为public的成员函数或成员变量,可以被类内部和外部使用,也就是 bark()和move()成员函数

被声明为private的成员函数或成员变量,只可以被类内部使用,也就是只有在class里的声明才能用到,所以如果在外部写出 topi.name 类似这样的东西就会出现error
private关键字保护了一个类的包装性,避免了误改数据的情况

还有一种关键字叫protected
被声明为protected的成员函数或成员变量,不可以被外部使用,但可以被类内部,友元和子类使用(友元和子类的概念这里还没介绍)

然后呢,运行结果如下
Topi is moving
Topi is barking
Larry is barking
Destructor is running
Destructor is running

这里运行2次析构函数,因为有topi和larry分别个调用了一次析构函数


Last edited by too wei on June 28th 2015, 15:14; edited 1 time in total (Reason for editing : 修改和增加)

too wei
Sponsor
Sponsor

Posts : 31
Points : 66331
Reputation : 0
Join date : 2015-04-21
Age : 25
Location : Johor

Back to top Go down

Back to top


 
Permissions in this forum:
You cannot reply to topics in this forum