Version 3.0
数据抽象第三章
2
回顾
引用
默认参数
内联函数
函数重载
3
目标
类
成员变量
成员函数
this 指针
对象数组
4
类
定义数据的类型以及操作这些数据的函数
类的实例称为对象
类中的变量和函数称为成员
5
私有和公 有 2-1
类成员可以在类的公有或者私有部分声明
数据成员通常在私有部分中声明
在公有部分中声明的成员可以被该类外部的函数访问
公有部分构成类的接口 private
public
6
私有和公 有 2-2
无法从类的外部访问私有数据
其他类的私有数据对于当前类也是隐藏的 类数据或函数数据或函数私有公 有不可从类的外部访问可以从类的外部访问
7
const成员变量
常量的值在程序的执行期间不会改变
常量必须初始化
const int num=100;
num = 200; //错误
num ++; //错误
8
成员函数 2-1
类的函数称为成员函数
成员函数通常放在类的公有部分
必须定义返回值及参数列表例如
void setdate(int,int,int);
9
成员函数 2-2
成员函数可以有局部变量、参数等
成员函数不应与数据成员同名
10
调用成员函数 2-1
通过调用成员函数与对象通信
object1.member_function1(200);
object1.member_function2();
调用成员函数是操作特定的对象,而不是类
使圆点操作符与特定对象关联
11
调用成员函数 2-2
访问类的成员函数的一般语法:
class_object.function_member();
成员操作符
12
构造函数 4-1
自动初始化对象的特殊的成员函数
与所属的类同名
可以在类中声明并定义构造函数,或在类中声明而在外部定义
13
构造函数 4-2
构造函数没有返回类型
默认构造函数是不带任何参数的构造函数
class username {
public:
username(); //构造函数
};
username::username() { }
14
构造函数 4-3
class date{
int month,day,year;
public:
date() //默认构造函数
{day=1; month=1; year=1999;}
date(int x) //仅指定 日
{day=x; month=1; year=1999;}
date(int x,int y,int z) //指定年月日
{day=x; month=y; year=z;}
};
15
构造函数 4-4
编译器根据参数调用不同的构造函数
date now;
date today(4);
date all(23,3,1998);
16
析构函数
在对象销毁时自动调用的成员函数
编译器会生成对析构函数的调用
与类同名,但是在函数名前有个波浪号 (~)
析构函数没有返回类型,也不带参数
class username {
public:
~username(); //析构函数
};
17
使用类 2-1
class exampleclass
{
private:
int data;
public:
member_function1(parameter)
{
assign value to data
}
member_function2()
{
display data
}
};
18
使用类 2-2
void main (){
//定义类 exampleclass的对象
exampleclass object1,object2;
//调用成员函数,将值 200赋给 data
object1.member_function1(200);
//调用显示数据的成员函数
object1.member_function2();
object2.member_function1(350);
object2.member_function2();
}
19
作用域 2-1
使用作用域解析操作符 (::)在类外定义成员函数
return_type class_name::member_functions
(arg1,arg2,..,argn)
{}
参数的类型必须与声明的类型完全匹配
20
作用域 2-2
作用域操作符左侧是类名
将函数标识为特定类的成员
在全局与局部变量同名的情况下引用全局变量
::global_variable
如果两个变量有不同的用途,它们的名称应该反映出这个区别
21
作用域表位置 动作
{ 定义时,调用构造函数
} 超出作用域,调用析构函数
22
静态成员 2-1
同一个类的所有对象共享数据项
只会为整个类创建一个静态数据项
只在类的内部可见
生命周期贯穿整个程序
static data_type variable;
23
静态成员 2-2
应该在 main( ) 程序开始之前创建并初始化
class race_cars{
private:
static int Count;
int car_number;
char name[30];
public:
race_cars(){count++;} //构造函数,用于增加 count
~race_cars(){count--;} //析构函数,用于 减 小 count
};
int race_cars::count;
24
关于 静态数据成员的更多内容
如果将一个静态成员声明为类的私有成员,
则非成员函数不能访问它
是类的全局数据
不是对象的一部分,没有 this 指针
25
静态成员函数
不是对象的一部分,没有 this 指针
只能操纵类的静态数据成员
26
静态成员函数示例
class alpha
{
private:
static int count; //静态数据
public:
alpha() //构造函数
{
count++;
}
static void display_count()
//静态成员函数
{
cout << count;
cout << endl;
}
};
int alpha::count = 0;
int main()
{
//在创建任何对象之前
alpha::display_count();
alpha obj1,obj2,obj3;
//在创建了三个对象之后
alpha::display_count();
return 0;
}
27
this指针
编译器把调用成员函数的对象的地址赋给
this指针
可以像其他指向对象的指针一样使用 this
this -> age = 5;
this -> getdata();
28
this的用法
class person{
private:
int age;
public:
void display();
};
void Person::display(){
this -> age = 25; // 与 age = 25一样
cout << this -> age; // 与 cout << age一样
cout << endl;
};
int main(){
Person Jack;
Jack.display();
return 0;
}
29
对象
每个对象对类中的数据成员都有其自己的副本
给定类的所有对象都使用相同的成员函数
在定义每个对象时数据就会存入内存,所以每个对象都有一个数据集
30
对象声明对象 1
数据 1
数据 2
对象 2
数据 1
数据 2
对象 3
数据 1
数据 2
成员函数 1()
成员函数 2()
31
new 2-1
用于为类的对象创建内存空间
如果成功,返回指向所分配内存空间的指针
data_type pointer_variable = new data_type;
例如
int *p; //指向 int类型的指针
float *f; //指向 float 类型的指针
p = new int; //为 int类型分配内存
f = new float; //为 float类型分配内存
32
new 2-2
内存空间不足或者检测到错误,返回空
new类似于 C语言中所使用的 malloc()函数
对于对象也是同样的语法
Student *stu_ptr; //指向 Student类型对象的指针
stu_ptr = new Student; //指向新的 Student对象
33
delete 2-1
delete显式销毁由 new创建的对象
int *ptr;
ptr = new int;
*ptr = 12;
cout << *ptr;
delete ptr;
使用完内存后,使用 delete将其释放
不要使用指向已经释放的内存的指针
34
delete 2-2
分配由变长数组组成的内存块
int *ptr;
ptr = new int[100];
delete [] ptr;
使用 new分配对象数组,必须在 delete语句中使用 [ ]
使用 delete删除由 malloc分配的内存是错误的
使用 free释放由 new分配的内存也是错误的
35
对象数组
对象数组声明
class_name object_array[length];
对象数组使用
object_array[index].func();
对象数组初始化
class_name object_array[length] =
{
class_name(arg1,arg2,…argn);
class_name(arg1,arg2,…argn);
……
}
36
对象指针
指针也可以指向对象
date *today_ptr;//指向 date类型的对象的指针
today_ptr = new date;//指向新的 date对象
使用箭头操作符 (->) 访问成员
today_ptr -> getdate();
37
总结
类
成员变量
成员函数
this 指针
对象数组
数据抽象第三章
2
回顾
引用
默认参数
内联函数
函数重载
3
目标
类
成员变量
成员函数
this 指针
对象数组
4
类
定义数据的类型以及操作这些数据的函数
类的实例称为对象
类中的变量和函数称为成员
5
私有和公 有 2-1
类成员可以在类的公有或者私有部分声明
数据成员通常在私有部分中声明
在公有部分中声明的成员可以被该类外部的函数访问
公有部分构成类的接口 private
public
6
私有和公 有 2-2
无法从类的外部访问私有数据
其他类的私有数据对于当前类也是隐藏的 类数据或函数数据或函数私有公 有不可从类的外部访问可以从类的外部访问
7
const成员变量
常量的值在程序的执行期间不会改变
常量必须初始化
const int num=100;
num = 200; //错误
num ++; //错误
8
成员函数 2-1
类的函数称为成员函数
成员函数通常放在类的公有部分
必须定义返回值及参数列表例如
void setdate(int,int,int);
9
成员函数 2-2
成员函数可以有局部变量、参数等
成员函数不应与数据成员同名
10
调用成员函数 2-1
通过调用成员函数与对象通信
object1.member_function1(200);
object1.member_function2();
调用成员函数是操作特定的对象,而不是类
使圆点操作符与特定对象关联
11
调用成员函数 2-2
访问类的成员函数的一般语法:
class_object.function_member();
成员操作符
12
构造函数 4-1
自动初始化对象的特殊的成员函数
与所属的类同名
可以在类中声明并定义构造函数,或在类中声明而在外部定义
13
构造函数 4-2
构造函数没有返回类型
默认构造函数是不带任何参数的构造函数
class username {
public:
username(); //构造函数
};
username::username() { }
14
构造函数 4-3
class date{
int month,day,year;
public:
date() //默认构造函数
{day=1; month=1; year=1999;}
date(int x) //仅指定 日
{day=x; month=1; year=1999;}
date(int x,int y,int z) //指定年月日
{day=x; month=y; year=z;}
};
15
构造函数 4-4
编译器根据参数调用不同的构造函数
date now;
date today(4);
date all(23,3,1998);
16
析构函数
在对象销毁时自动调用的成员函数
编译器会生成对析构函数的调用
与类同名,但是在函数名前有个波浪号 (~)
析构函数没有返回类型,也不带参数
class username {
public:
~username(); //析构函数
};
17
使用类 2-1
class exampleclass
{
private:
int data;
public:
member_function1(parameter)
{
assign value to data
}
member_function2()
{
display data
}
};
18
使用类 2-2
void main (){
//定义类 exampleclass的对象
exampleclass object1,object2;
//调用成员函数,将值 200赋给 data
object1.member_function1(200);
//调用显示数据的成员函数
object1.member_function2();
object2.member_function1(350);
object2.member_function2();
}
19
作用域 2-1
使用作用域解析操作符 (::)在类外定义成员函数
return_type class_name::member_functions
(arg1,arg2,..,argn)
{}
参数的类型必须与声明的类型完全匹配
20
作用域 2-2
作用域操作符左侧是类名
将函数标识为特定类的成员
在全局与局部变量同名的情况下引用全局变量
::global_variable
如果两个变量有不同的用途,它们的名称应该反映出这个区别
21
作用域表位置 动作
{ 定义时,调用构造函数
} 超出作用域,调用析构函数
22
静态成员 2-1
同一个类的所有对象共享数据项
只会为整个类创建一个静态数据项
只在类的内部可见
生命周期贯穿整个程序
static data_type variable;
23
静态成员 2-2
应该在 main( ) 程序开始之前创建并初始化
class race_cars{
private:
static int Count;
int car_number;
char name[30];
public:
race_cars(){count++;} //构造函数,用于增加 count
~race_cars(){count--;} //析构函数,用于 减 小 count
};
int race_cars::count;
24
关于 静态数据成员的更多内容
如果将一个静态成员声明为类的私有成员,
则非成员函数不能访问它
是类的全局数据
不是对象的一部分,没有 this 指针
25
静态成员函数
不是对象的一部分,没有 this 指针
只能操纵类的静态数据成员
26
静态成员函数示例
class alpha
{
private:
static int count; //静态数据
public:
alpha() //构造函数
{
count++;
}
static void display_count()
//静态成员函数
{
cout << count;
cout << endl;
}
};
int alpha::count = 0;
int main()
{
//在创建任何对象之前
alpha::display_count();
alpha obj1,obj2,obj3;
//在创建了三个对象之后
alpha::display_count();
return 0;
}
27
this指针
编译器把调用成员函数的对象的地址赋给
this指针
可以像其他指向对象的指针一样使用 this
this -> age = 5;
this -> getdata();
28
this的用法
class person{
private:
int age;
public:
void display();
};
void Person::display(){
this -> age = 25; // 与 age = 25一样
cout << this -> age; // 与 cout << age一样
cout << endl;
};
int main(){
Person Jack;
Jack.display();
return 0;
}
29
对象
每个对象对类中的数据成员都有其自己的副本
给定类的所有对象都使用相同的成员函数
在定义每个对象时数据就会存入内存,所以每个对象都有一个数据集
30
对象声明对象 1
数据 1
数据 2
对象 2
数据 1
数据 2
对象 3
数据 1
数据 2
成员函数 1()
成员函数 2()
31
new 2-1
用于为类的对象创建内存空间
如果成功,返回指向所分配内存空间的指针
data_type pointer_variable = new data_type;
例如
int *p; //指向 int类型的指针
float *f; //指向 float 类型的指针
p = new int; //为 int类型分配内存
f = new float; //为 float类型分配内存
32
new 2-2
内存空间不足或者检测到错误,返回空
new类似于 C语言中所使用的 malloc()函数
对于对象也是同样的语法
Student *stu_ptr; //指向 Student类型对象的指针
stu_ptr = new Student; //指向新的 Student对象
33
delete 2-1
delete显式销毁由 new创建的对象
int *ptr;
ptr = new int;
*ptr = 12;
cout << *ptr;
delete ptr;
使用完内存后,使用 delete将其释放
不要使用指向已经释放的内存的指针
34
delete 2-2
分配由变长数组组成的内存块
int *ptr;
ptr = new int[100];
delete [] ptr;
使用 new分配对象数组,必须在 delete语句中使用 [ ]
使用 delete删除由 malloc分配的内存是错误的
使用 free释放由 new分配的内存也是错误的
35
对象数组
对象数组声明
class_name object_array[length];
对象数组使用
object_array[index].func();
对象数组初始化
class_name object_array[length] =
{
class_name(arg1,arg2,…argn);
class_name(arg1,arg2,…argn);
……
}
36
对象指针
指针也可以指向对象
date *today_ptr;//指向 date类型的对象的指针
today_ptr = new date;//指向新的 date对象
使用箭头操作符 (->) 访问成员
today_ptr -> getdate();
37
总结
类
成员变量
成员函数
this 指针
对象数组