05_类与对象、Class Struct Union、类中的函数指针
来源:互联网 发布:what color is it 编辑:程序博客网 时间:2024/06/03 15:56
- 目录
- 一C结构体
- 二类与对象
- 三Class Struct Union
- 四const mutable explicit
- 五拷贝构造
- 六类中引用
- 七类中的函数指针
【目录】
一、 C++结构体 2
1、 结构体里面的成员及方法默认是公有的; 2
2、 结构体里面的成员可以默认初始化;(c不可以) 2
3、 匿名结构体不可以默认初始化,这样是为了只创建一个对象; 2
4、 结构体的数据相互独立,占用一片连续的内存空间; 2
5、 结构体内部不能定义自己;(可以定义指针,形成链表) 2
6、 C与c++同种类型的结构体可以整体赋值; 2
二、 类与对象 2
1、 C++类的继承实现代码重用,C重用函数; 2
2、 类的封装实现权限,封装,数据与代码合为一体;C封装主要是函数; 2
3、 封装可以锁定代码的权限,锁定的数据的权限,避免被随意修改; 2
4、 类的多态,一个接口根据实际需求完成很多不同的功能; 2
5、 封装可以实现代码权限,不可以随便调用; 2
6、 封装解决的问题: 2
三、 Class Struct Union 4
1、 Class 4
2、 Struct 4
3、 Union 4
四、 const mutable explicit 5
五、 拷贝构造 5
1、 delete可以禁用默认生成的函数,禁用构造函数可以实现类无法实例化; 5
2、 定义类时,在拷贝构造后加=delete,表示禁用拷贝构造,可以实现禁止别人拷贝你的类对象; 5
3、 定义类时,在构造函数后边加=default表示默认存在。 5
4、 类默认是浅拷贝,深拷贝必须自己实现。 5
六、 类中引用& 5
七、 类中的函数 6
1、 类中的常规函数void (my::*p1)() = &my::run ; 6
2、 类中的静态函数void (*p2)() = &my::go ; 6
一、C++结构体
1、结构体里面的成员及方法默认是公有的(类是默认私有的);
2、结构体里面的成员可以默认初始化;(c不可以)
3、匿名结构体不可以默认初始化,这样是为了只创建一个对象;
4、结构体的数据相互独立,占用一片连续的内存空间;
5、结构体内部不能定义自己;(可以定义指针,形成链表)
6、C与c++同种类型的结构体可以整体赋值;
二、类与对象
1、C++类的继承实现代码重用,C重用函数;
2、类的封装实现权限,封装,数据与代码合为一体;C封装主要是函数;
3、封装可以锁定代码的权限,锁定的数据的权限,避免被随意修改;
4、类的多态,一个接口根据实际需求完成很多不同的功能;
5、封装可以实现代码权限,不可以随便调用;
6、封装解决的问题:
①.类的,代码与数据,一体化;
②.代码的封装,限定代码谁可以执行谁不可以执行的权限;
③.数据的封装,防止数据被意外修改。
#include<iostream>#include<string>#include <windows.h>class cmduse{private: char cmduser[100];//用户名 char cmd[100];//存储指令public: void setuser(const char * name) { strcpy(cmduser, name); } char * getuser() { return this->cmduser;//返回用户名 } void open(const char *path, const int mode) { ShellExecuteA(0, "open", path, 0, 0, mode); } void all() { system("tasklist"); } void closebyname(const char *name) { memset(this->cmd, 0, 100);//清空字符串 sprintf(this->cmd, "taskkill /f /im %s", name); system(this->cmd); } void closebypid(const int num) { memset(this->cmd, 0, 100);//清空字符串 sprintf(this->cmd, "taskkill /pid %d", num); system(this->cmd); }};void main(){ cmduse cmduse1; cmduse1.setuser("yincheng"); std::cout << cmduse1.getuser() << std::endl; cmduse1.open("calc",1); cmduse1.open("notepad",0); Sleep(2000); cmduse1.all(); cmduse1.closebyname("calc.exe"); int pid; std::cin >> pid; cmduse1.closebypid(pid);//根据编号关闭 std::cin.get(); std::cin.get();}
三、Class Struct Union
1、Class
①.成员和方法默认情况下是私有的;
2、Struct
①.成员和方法默认情况下是公有的;
3、Union
①.成员和方法默认是公有的,且不可以改变,共享同一块内存空间,拥有的起始地址都是一样的;
②.本质也是一个类,可以内部有函数;
③.内部数据是共享,不同对象之间是独立的,代码是共享;
④.也具备结构体所有功能;
⑤.某些节约内存的类需要用到共用体;
⑥.内部数据是共享内存,不可以继承;
⑦.时时刻刻共用体仅有一个变量存在
#include<iostream>//union 本质也是一个类,可以内部有函数,//union,内部数据是共享,不同对象之间是独立的,代码是共享//union,也具备结构体所有功能//某些节约内存的类需要用到共用体union MyUnion{ int num; double db; void go() { }};//内部数据是共享内存,不可以继承union MyUnionA { int num; double db; void go() { }};void main(){ std::cout << sizeof(MyUnion) << std::endl; MyUnion union1;// union1.db = 10; union1.num = 20; std::cout << union1.num << std::endl; union1.db = 10.9;//时时刻刻共用体仅有一个变量存在 std::cout << union1.num << std::endl; std::cin.get();}
四、const mutable explicit
五、拷贝构造
1、delete可以禁用默认生成的函数,禁用构造函数可以实现类无法实例化;
2、定义类时,在拷贝构造后加=delete,表示禁用拷贝构造,可以实现禁止别人拷贝你的类对象;
3、定义类时,在构造函数后边加=default表示默认存在。
4、类默认是浅拷贝,深拷贝必须自己实现。
六、类中引用&
#include<iostream>class my { public: int &age ; public: my( int a ):age(a){ } ~my(){ }};int main( int argc , char** argv ) { int num = 5 ; my m1( num ) ; std::cout<<m1.age<<std::endl; /* 这里输出是地址,如果换成 std::cout<<m1.age;输出是内容, 差别就在于最后的std::endl; */ std::cout<<std::endl; system("pause") ; return 0 ;}
(己注:endl有刷新缓存的作用,所以刷新缓存后内容就不存在了。这里涉及到成员变量的生命周期,当num的变量传入my类的构造函数时会创建一个副本,内容跟num一样,但是地址不一样,这个副本num的生命周期就跟构造函数同生共死,所以如果不调用endl的话,在缓存中有这个副本 的内容,age就可以打印出来,否则不行)
七、类中的函数指针:
1、类中的常规函数void (my::*p1)() = &my::run ;
#include<iostream>class my { public: int &age ; public: my( int a ):age(a){ } ~my(){ } void run() { std::cout<<"run"<<std::endl ; } static void go() { std::cout<<"go"<<std::endl ; }};int main( int argc , char** argv ) { int num = 5 ; my m1( num ) ; void (my::*p1)() = &my::run ; void (*p2)() = &my::go ;(m1.*p1)() ; system("pause") ; return 0 ;}
2、类中的静态函数void (*p2)() = &my::go ;
#include<iostream>class my { public: int &age ; public: my( int a ):age(a){ } ~my(){ } void run() { std::cout<<"run"<<std::endl ; } static void go() { std::cout<<"go"<<std::endl ; }};int main( int argc , char** argv ) { int num = 5 ; my m1( num ) ; void (my::*p1)() = &my::run ; void (*p2)() = &my::go ;(m1.*p1)() ;P2() ; system("pause") ; return 0 ;}
- 05_类与对象、Class Struct Union、类中的函数指针
- class,struct与union异同
- 细说 class类中的this指针与 构造函数
- C中的struct与union
- java中的Class类与Class对象
- C#面象对象学习:类(class)与结构(struct)
- C++类与对象(3) - 空class&struct的大小
- 联合、结构和类(Union, Struct, Class)
- struct与class关键字在定义类中的区别
- C++中的结构(struct)与类(class)的区别
- struct与class关键字在定义类中的区别
- class, struct, union
- struct,class,union
- 类中的函数指针和函数对象
- 类对象与类指针_虚函数与多态
- C语言多继承时子类与基类指针关系,union与struct区别,volatile修饰符作用
- C++中的struct与class
- Swift中的struct与class
- Android4.2耳机插拔检测实现方法
- 动态生成层级字段
- fopen及读写权限
- Centos解除端口占用
- (二)任务堆栈
- 05_类与对象、Class Struct Union、类中的函数指针
- 练习69
- Python练习题 15-1立方
- 安卓开发Serverce用法直接点击UnBindService按钮崩溃问题
- 6.5-Python-语言及其应用-笔记-模块,包--未完!
- 最大似然估计算法(简单,通俗易懂)
- vim使用备忘
- bzoj 4411 USACO16FEB 负载平衡Load Balancing(扫描线,树状数组,三分答案,前缀和)
- ajax跨域问题