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都没有迭代器;




0 0
原创粉丝点击