类(Class)的基本
Page 1 of 1
类(Class)的基本
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分别个调用了一次析构函数
这个观念的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。
面向过程就是分析出解决问题所需要的步骤,然后用函数逐步实现,再依次调用就可以了
比如说,现在有一个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
- Posts : 31
Points : 66331
Reputation : 0
Join date : 2015-04-21
Age : 25
Location : Johor
Page 1 of 1
Permissions in this forum:
You cannot reply to topics in this forum