类(class)是面向对象程序设计(OOP)实现信息封装的基础。
类是用户定义类型,也称为类类型。
每个类包含数据说明和一些操作数据或传递消息的函数。类的实例称为对象。
C++的类有C的结构类型演变而来。本章首先介绍结构类型,然后讨论C++的类和对象。
5.1结构
结构由数目固定的成员构成。
各成员可以具有不同的数据类型。
一个结构变量在内存占有一片连续的存储空间。
5.1.1定义结构和访问结构
1.定义结构
可以用不同方法定义一个结构变量
(1)声明类型之后声明变量
(2)声明类型的同时声明变量
(3)直接声明结构类型变量
//C++的结构的数据成员可以默认有默认的值
//匿名结构体,限量版
1 #include <iostream> 2 3 struct MyStruct 4 { 5 int num; 6 double db = 10.8;//C++的结构的数据成员可以默认有默认的值 7 }; 8 9 struct 10 { 11 int num; 12 double db = 10.8;//C++的结构的数据成员可以默认有默认的值 13 }sx, sy;//匿名结构体,限量版 14 15 void main() 16 { 17 MyStruct s1; 18 19 std::cout << s1.db << std::endl;//10.8 20 21 system("pause"); 22 }
一个结构类型的成员可以是另一个已定义的结构类型
1 struct MyStruct 2 { 3 int num; 4 double db = 10.8; 5 void boss()//函数 6 { 7 8 } 9 }; 10 11 struct 12 { 13 int num; 14 double db = 10.8; 15 MyStruct boss1;//一个结构类型的成员可以是另一个已定义的结构类型 16 }sx, sy;
错误:不能实现的无穷递归结构
//error C2460: “MyStruct::sx”: 使用正在定义的“MyStruct”
1 struct MyStruct 2 { 3 int num; 4 double db = 10.8; 5 MyStruct sx;//error C2460: “MyStruct::sx”: 使用正在定义的“MyStruct” 6 };
5.2类与对象
面向对象编程的程序基本单位是类。
类是数据和操作数据的函数的封装。
类的对象使用自己的方法完成对数据的操作。
类可以隐藏数据和操作细节,对象通过类接口与外部通信。
C面向过程管理进程
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <windows.h> 4 5 void open(const char *path, const int mode)//输入名称和打开模式,打开一个程序 6 { 7 ShellExecuteA(0, "open", path, 0, 0, mode); 8 } 9 10 void all()//显示所有进程 11 { 12 system("tasklist"); 13 } 14 15 void closebyname(const char *name)//通过进程名,关闭进程 16 { 17 char cmdstr[100] = { 0 }; 18 sprintf(cmdstr, "taskkill /f /im %s", name); 19 system(cmdstr); 20 } 21 22 void closebypid(const int num)//通过PID,关闭进程 23 { 24 char cmdstr[100] = { 0 }; 25 sprintf(cmdstr, "taskkill /pid %d", num); 26 system(cmdstr); 27 } 28 29 void main() 30 { 31 all();//显示所有进程 32 33 open("notepad", 1);//输入名称和打开模式,打开一个程序 34 35 all();//显示所有进程 36 37 Sleep(2000);//暂停 38 39 //closebyname("notepad.exe"); 40 41 int num; 42 43 scanf("%d", &num); 44 45 closebypid(num);//通过PID,关闭进程 46 47 system("pause"); 48 }
//C++类的继承实现代码重用,C的代码重用主要依赖函数
//类的封装实现权限,封装,数据与代码合为一体,C的封装主要是函数
//封装可以锁定代码的权限,锁定的数据的权限,避免被随意调用
//类的多态,一个接口根据实际需求完成很多不同的功能
C++面向对象管理进程
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 #include <windows.h> 4 5 //C++类的继承实现代码重用,C的代码重用主要依赖函数 6 //类的封装实现权限,封装,数据与代码合为一体,C的封装主要是函数 7 //封装可以锁定代码的权限,锁定的数据的权限,避免被随意调用 8 //类的多态,一个接口根据实际需求完成很多不同的功能 9 10 class cmduse 11 { 12 private: 13 char cmduser[100];//存储用户名 14 char cmd[100];//存储命令 15 public: 16 void setuser(const char *name)//设置用户名 17 { 18 strcpy(cmduser, name); 19 } 20 char *getuser()//返回用户名 21 { 22 return this->cmduser; 23 } 24 void open(const char *path, const int mode)//输入名称和打开模式,打开一个程序 25 { 26 ShellExecuteA(0, "open", path, 0, 0, mode); 27 } 28 void all()//显示所有进程 29 { 30 system("tasklist"); 31 } 32 void closebyname(const char *name)//通过进程名,关闭进程 33 { 34 memset(this->cmd, 0, sizeof(this->cmd)); 35 sprintf(this->cmd, "taskkill /f /im %s", name); 36 system(this->cmd); 37 } 38 void closebypid(const int num)//通过PID,关闭进程 39 { 40 memset(this->cmd, 0, sizeof(this->cmd)); 41 sprintf(this->cmd, "taskkill /pid %d", num); 42 system(this->cmd); 43 } 44 }; 45 46 void main() 47 { 48 cmduse cmduse1; 49 50 cmduse1.setuser("hello");//设置用户名 51 52 std::cout << cmduse1.getuser() << std::endl;//返回用户名 53 54 cmduse1.open("calc", 1);//输入名称和打开模式,打开一个程序 55 cmduse1.open("notepad", 1);//输入名称和打开模式,打开一个程序 56 57 Sleep(2000);//暂停 58 59 cmduse1.all();//显示所有进程 60 61 cmduse1.closebyname("calc.exe");//通过进程名,关闭进程 62 63 int pid = 0; 64 65 std::cin >> pid; 66 67 cmduse1.closebypid(pid);//通过PID,关闭进程 68 69 system("pause"); 70 }
//union本质也是一个类,可以内部有函数
//union同一对象内部数据是共享的,不同对象之间是独立的,代码是共享的
//union具备结构体所有功能
//时时刻刻共用体只有一个变量存在
//某些节约内存的类,需要用到共用体
1 #include <iostream> 2 3 //union本质也是一个类,可以内部有函数 4 //union同一对象内部数据是共享的,不同对象之间是独立的,代码是共享的 5 //union具备结构体所有功能 6 //时时刻刻共用体只有一个变量存在 7 //某些节约内存的类,需要用到共用体 8 9 union MyUnion 10 { 11 int a; 12 int num; 13 double db; 14 void go() 15 { 16 17 } 18 }; 19 20 void main() 21 { 22 std::cout << sizeof(MyUnion) << std::endl;//8 23 24 MyUnion union1;//创建一个联合的对象 25 26 union1.num = 20;//赋值 27 28 std::cout << union1.num << std::endl;//20 29 30 union1.db = 10.9;//赋值 31 32 std::cout << union1.num << std::endl;//乱码 33 34 system("pause"); 35 }
//内部数据是共享的,不可以继承
//error C2570: “MyUnionA”: 联合不能有基类
1 union MyUnion 2 { 3 int a; 4 private: 5 int num; 6 double db; 7 void go() 8 { 9 10 } 11 }; 12 13 //内部数据是共享的,不可以继承 14 15 union MyUnionA :public MyUnion//error C2570: “MyUnionA”: 联合不能有基类 16 { 17 18 };
//空类占一个字节,表明类的存在
//代码不计入sizeof
不能取类的地址,可以取类的对象的地址
//error C2275: “kong”: 将此类型用作表达式非法
1 #include <iostream> 2 3 class kong 4 { 5 6 }; 7 8 //空类占一个字节,表明类的存在 9 //代码不计入sizeof 10 11 void main() 12 { 13 std::cout << sizeof(kong) << std::endl;//1 14 15 //std::cout << &kong << std::endl;//error C2275: “kong”: 将此类型用作表达式非法 16 17 kong kong1; 18 19 std::cout << &kong1 << std::endl; 20 21 system("pause"); 22 }