c++学习笔记
来源:互联网 发布:audition cs6 mac破解 编辑:程序博客网 时间:2024/04/29 22:53
内联函数:inline可以处理好类型
inline只是对于编译器的建议,编译器不一定采纳
一般情况是编译器,inline,
一旦检测到取寄存器地址,寄存器优化为内存变量,
一旦检测到取函数地址,吧内联函数处理为非内联函数
new 内存分配 delete释放内存
delete
[]p;
//针对对象数组的时候,非基本数据类型,[]会调用每个对象的析构函数,没有[]只调用第一个
new delete在内存管理中的应用
c++结构体:具备类的所有特点(继承,构造,析造,公有,私有,保护);结构体默认数据成员为公有,类默认的数据成员为私有;
构造与析构
c++深浅拷贝:默认的拷贝构造是浅拷贝(对于指针类型共享内存地址),如果要实现深拷贝需要自己手工分配内存;
函数将对象作为参数里有副本机制,会自动调用对象的拷贝构造方法
const
关键字与类:const可以修饰成员变量,成员函数,指针.如果const修饰对象,则对象只能读取不能修改;类的构造与析构不能被const修饰
const与指针位置的关系:
如:const int*p(new int(5));//const在*左边,限定指向的数据不可以改,可以改变指向
int * const p(new int(12)); //const在*右边,限定指向的数据可以修改,不可以改变指向
int const * const p(new int(5));//p是一个指向常量的常量指针,指向的数据,还有指向都不点击打开链接可以改
静态成员:任何一个对象都可以访问,不创建对象可以访问,静态成员与类的对象初始化无关;(一般可以用于控制对象数量)
静态函数:对象也可以直接引用 /无需对象可以引用,静态函数内部不能使用this
引用与类:
友元与类:友元主要用于访问类的私有成员;
运算符重载:赋值运算符重载 ,赋值运算符重载深浅拷贝 ,友元函数重载 ,基本运算符重载, 盒子重载
基类的静态成员:
基类定义的静态成员,将被所有派生类共享
构造可以重载,析构不可以重载
继承的内存原理:构造的时候
,先构造父类,后构造子类,析构则相反;如果子类重写父类的构造方法,子类会覆盖父类
的方法
protected
关键字声明的成员,继承可以访问,外部不能
继承与静态函数
继承中的类大小
类型转换:显示转换:如父类要转换为子类,隐式转换:如子类与父类为隐式转换
重载与继承:
父类与子类指针问题:参考
1,父类指针引用父类对象,完全正常引用2,子类指针引用子类对象,子类会覆盖父类的同名函数,覆盖同名变量
3,父类指针引用子类对象,只能访问子类对象中包含的父类对象,父类对象的函数成员可以访问,子类的不可以访问,无法正常释放内存
4,子类指针引用父类对象(子类可能把不属于父类的内存给delete,从而可能造成野指针),不可以,野指针内存冲突 ;访问父类对象可以通过指针->父类::方法或者成员
static_cast可以实现把父类强制转换为子类
为什么要用虚函数?
虚函数(virtual)意义:一个接口完成多个功能 (virtual是c++实现多态的关键,可以通过父类的指针访问具体子类的方法,如果没有virtual父类的指针将访问不到子类的方法)==>接口固定,具体的实现不定;
static_cast可以实现把父类强制转换为子类
函数区是共享的,空指针可以访问不引用成员变量的函数
虚函数是通过指针类型转换来的
虚函数必须是成员函数,因为虚函数要靠this指针的转换来实现(故也不能是static函数);虚函数不可以是外部函数,不可以是友元函数;
没有this指针的函数(包括成员函数)绝对不能是虚函数,只有非静态成员函数才可以是虚函数;
当我们对虚函数进行重载时,如果虚函数重写,参数不一样或返回值不一样,都会丢失虚特性
虚函数如果要实现覆盖生效,函数名一致,参数一致,返回值一致;
如果函数名一致,参数不一致,虚函数特性丢失;
返回值一致,参数一致,返回值不一致,会报错;
虚函数指针表的地址:无论有多少个虚函数,都只占4个字节(这个4个字节保存的是虚函数表的地址);参考 虚函数原理
虚函数特点
虚函数表:它的本质是一个函数指针表;
如何取出虚函数地址?
myclass *p=new myclass;
cout<<(int*)p<<endl;打印虚函数表地址的地址
cout<<(void *)(*((int*)p))<<endl;打印虚函数表的地址
cout<<(void *)(*(int*)(*((int*)p)+0))<<endl;打印第一个虚函数的地址
纯虚函数与抽象类:
纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本;
纯虚函数为派生类提供一个公共的接口,凡是子类必须实现纯虚函数;
抽象类(不能实例化,没有构造函数):有纯虚函数的类;
类变量不可以作为参数返回值,因为副本机制调用拷贝
函数做为参数都有副本机制(副本机制会拷贝,调用构造)
虚函数与构造,析构函数
静态联编与动态联编
类模板:
模板的本质:把算法变得与类型无关;
类模板(tmplate <class T>):主要用于实现类所需数据类型参数化(数组,表,图等数据结构以及智能指针),使用的时候必须明确指定类型
函数模板:不需要指定类型,根据参数自动判断
静态数组与模板:
stl标准库 学习步骤:容器->迭代器(begin,end)---->算法-->仿函数
stl容器特点:
1),所有容器存放的都是值而非引用,即向容器插入值时内部执行的是拷贝操作;因此容器内的每个元素都必须能被拷贝,如果不希望存放副本,那么只能存放指针;
2),所有元素都形成一个次序,可以按相同的次序一次或多次遍历;
迭代器的本质:智能指针,可以实现随机访问
反向迭代器:如 for(auto rb=vector.rbegin,re =rend;....)
线性结构采用迭代器可以随机访问,而非线性则不能
vector:堆上,连续内存,线性容器,可以随机访问
list:内部采用双向链表实现,无法随机访问(采用迭代器也无法随机访问), 添加删除速度快,可以向里面添加任何元素,但必须具备值拷贝的能力
array:栈上,连续内存. 迭代器可以随机访问
红黑树(自动平衡的二叉树)特点:自动调节平衡(普通的二叉树不能自动平衡,查找算法可能不稳定),增删改查都很方便,增加删除的性能和链表一样;由于是二叉树,采用二分法查找
set:采用红黑树实现
mutiset:采用红黑树实现,树的每一个节点又采用链表实现(每一个节点可以包括多个元素)
hashSet:内部不会排序,采用哈希算法实现,查找快;
bitset:用于位操作的set
deque:线性结构,双端队列,内部采用分块存储,可以在任意位置插入; push_back尾部插入 push_font前端插入,insert中间插入;删除的时候小块移动,提升了性能;
优先队列:priority_queue 内部自动排序
stack:由于只能在一端操作,故没有迭代器
map: 键值对存储 key -->value, 不允许重复的键
multimap
:与 map 类似,允许重复键
链式栈:stack<int,list<int>> mystack;无论是数组栈还是链表栈都没有迭代器
队列:队列无法大括号初始化; push:压入数据,pop头部弹出;front:
链式队列:queue<char * ,list <char *>> myq;
为了数据的高效封装,stack,queue都没有迭代器;
- C++/C学习笔记
- 【C/C++】STL学习笔记
- C/C学习笔记/导言
- C/C学习笔记/结构
- 【c/c++】学习笔记1
- C学习笔记1
- TPC-C学习笔记
- c语言学习笔记
- C语言学习笔记
- C语言学习笔记
- 学习笔记之c
- C#-学习笔记
- Objective-C学习笔记
- C++PRIMER学习笔记
- C学习笔记
- C 学习笔记
- C/C++学习笔记
- 1.C学习笔记
- 正式开启博客
- How to get kernel messages from Android?
- 偷心锁屏--一款简洁的锁屏社交工具
- Android电源管理
- ubuntu 14.04 gnome desktop
- c++学习笔记
- 窗口管理机制之输入机制
- 关于一个try、finally的问题解释
- 设置JVM内存命令
- hdu 1879 继续畅通工程
- 二十一、oracle pl/sql分类一 存储过程
- node.js学习(HTTP)
- ANDROID窗口管理服务实现机制
- 《深入理解Java虚拟机》读书笔记5——类加载及执行子系统的案例与实战