![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
咔Boom !!!
一个在校学生的笔记
展开
-
迭代器和函数对象
c++STL的泛型算法,参数为什么接收的都是迭代器?泛型算法:模板写的,全局的,针对所有容器使用的,不管泛型算法实现什么功能操作,首先要获取或者遍历容器所有元素 因此泛型算法,必须找到一种统一的方式:用相同的方式可以遍历所有的容器,访问容器元素 operator[]只能访问数组类容器 所以使用容器迭代器的原因:用迭代器访问任何容器,其代码形式时一模一样的!!! 但是底层遍历不同容器,遍历方式是不同的,但这个差异都被封装在迭代器的运算符重载函数中泛型算法= 模板 + 迭代器 +原创 2020-11-26 15:35:25 · 206 阅读 · 0 评论 -
类模板
类模板的实现一般构造和析构函数后面不加类型参数,但是其他的成员都需要加上类型参数<T>下面是一个链表的类模板而且node和Clink都是模板的名称只有node<T>,Clink<T>才是类的名称类模板是不支持推演的,只能明确指定需要实例化的类型 template<typename T> class Clink { public: Clink(); ~Clink(); void inserthead(T val); void原创 2020-11-26 15:30:39 · 244 阅读 · 0 评论 -
函数模板
c++模板 template 函数模板和类模板模板的意义:可以把类型参数化bool compare(int a,int b)//参数化实参的值{ return a>b?a:b;}bool compare(double a,double b)//非模板函数,普通函数{ return a>b?a:b;}//类模板的类型参数可以给默认值,从右向左给//但是函数模板是不能给默认值的//template<> :定义模板的参数列表,模板类型参数可以用typena原创 2020-11-26 15:26:20 · 191 阅读 · 0 评论 -
new和delete
malloc :void* malloc(size_t size); 1.返回值类型不安全 2.开辟内存由使用者控制空间浪费或者不足free :void free(void*)int main(){ int *p=(int*)malloc(sizeof(int)); if(p==null) { exit(0); } free(p); int**p=(int**)malloc(sizeof(int*)*3);//C语言动态开辟二维数组 for(int i=0;i<3;i+原创 2020-11-26 15:19:06 · 129 阅读 · 0 评论 -
引用
引用:是一个别名,在底层以指针的形式来做支持,引用不参与类型int val=3;int &refval=val;引用必须被初始化,引用跟初始化时绑定关系类型 & 引用名称 = 被引用对象引用是要注意类型匹配,这点和指针的操作一样同理因为引用不是对象不占用空间,所以不存在引用的引用但是系统会自动开辟一个空间存放引用的指针信息所以应用在底层来看其实就是一个指针,在使用引用的地方系统会自动进行一个解引用的操作int a=10;int &b=a;int &c=原创 2020-11-26 15:10:57 · 90 阅读 · 0 评论 -
const成员和对象
class Foo{ void show()const{ cout<<"Sad"<end;}//const常方法}这样加了const的成员函数后,就会提示编译器,该成员函数不会对成员变量进行修改,而且也无法修改这个const修饰的是this指针,通过修改this指针的属性,进而修改函数功能************************************************************************************************原创 2020-11-26 14:51:21 · 99 阅读 · 0 评论 -
类中默认的函数
一个类在没手动添加函数的时候系统会默认添加一下几个函数1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载函数5.取地址操作符的重载函数6.const修饰的取地址操作符的重载函数1构造析构: 成员变量的构造先于本身的构造,而析构的时候则相反 class React { public: React(Point a, Point b); ~React() {} private: Point a, b; }; 上面的类中,Point类的构造函数原创 2020-11-26 14:44:09 · 139 阅读 · 0 评论 -
this指针
为什么存在this指针? 同一个类型实例化的每一个对象都有自己私有的一份成员变量,但是他们共享同一套成员方法,方法经编译后存放 在代码段中。 但是当调用成员方法时,能够知道该调用谁的成员函数,是因为this指针的存在, 当对象调用如add()的成员函数时,把该对象的地址当做实参和操作的参数共同传入函数 所以便在编译器编译后,所有的成员函数中都会存在一个this指针的参数。 并且在所有成员访问前,前面都会添加this->指向1.类成员方法的调用约定 thiscall: 成员方法调用原创 2020-11-26 14:40:01 · 92 阅读 · 0 评论 -
static
静态变量:是属于整个类的,而不是属于一个对象的,可以在外部直接访问他是所有对象共享的,只开辟一个空间,不会复制多份,操作的同一个数,不会因为其处于private而受到影响静态成员变量在数据区上,而普通对象开辟内存在栈上int class::mcount; 这时在data段的BSS段自动初始化为0,必须在类外初始化定义初始化:int Object::val = 0;使用方式:cout<<Obect::val<<endl;//建议使用第一种,静态方法用类作用域调用Obj原创 2020-11-26 14:34:25 · 92 阅读 · 0 评论 -
const
1.c中的const:const int a=10;int *p=&a;*p=30;这时在C语言.c文件中中程序是没错的。在C语言中const修饰的变量叫常变量常变量的处理规则在编译阶段,只是查看常变量有没有做左值,其他的处理和变量相同所以只要不是const int a;a=10;就不会出错,但是可以通过指针进行间接修改2.c++中的const:const修饰的变量叫做常量,不允许修改,并且常量一定要初始化;所以上面的程序在c++中错误const int a=100;int ar原创 2020-11-26 14:29:50 · 167 阅读 · 0 评论 -
对象的生存周期
临时对象的生存周期在表达式结束class point{}如果有代码出现》point p=10;这个过程会出现:1右操作数10 生成临时对象:point(10)=》生成临时对象2临时对象生成p这个新对象3表达式结束,临时对象销毁但是实际上并不会出现这么多操作,会直接进行一个对p对象的构造函数只是因为存在临时对象优化优化的前提是:临时对象的生成是为了生成新对象 以临时对象的方式来生成新对象临时对象的分类: 1.显示生成临时对象:明确指出生成什么样的临时对象 poi原创 2020-11-25 21:42:39 · 124 阅读 · 0 评论 -
类和对象
用C语言模拟c++面向对象的操作typedef struct data{int a;int b;void(func)(struct DATA, int, int);//函数指针与函数名无关,只和返回值和参数类型有关}DATA;void setvalue( DATA* d, int aa, int bb){d->a = aa;d->b = bb;}int main(){DATA data;data.func = &setvalue;data.func(&am原创 2020-11-25 21:39:54 · 105 阅读 · 0 评论 -
友元
友元必须在类的内部声明,而且尽可能将友元的声明放在同一位置,且友元不受public或private的修饰的限制1.友元是单向的不是双向的。class Human{public: friend void show(Human* xp);//在外部可以调用这个函数 friend class People;//这时People类就可以调用Human类中的任何成员,包括私有成员privare: int num;};class People{public: void show(Human*原创 2020-11-25 21:32:31 · 188 阅读 · 0 评论 -
c和c++的相互调用
由于c和c++的函数符号生成的规则是不同的,符号解析(链接阶段)的时候是不同的所以不能直接调用可以在.cpp文件中加上extern “c”{int sum(int a,int b);//这样就声明是以c的规则进行函数声明}如果想在.c文件中使用.cpp文件的函数,那么在.cpp文件中需要把整个函数的定义都放在extern "c"中如果我们需要写一个.c文件需要调用.cpp文件中的函数,但是哪个.cpp文件不能进行修改,这时我们可以写一个.cpp的中间层文件,如:int sum(int a,原创 2020-11-25 21:27:56 · 118 阅读 · 0 评论 -
内联
inline函数在编译阶段处理在调用点直接代码展开,不会生成符号,由于是直接代码展开的方式所以在另一个文件中无发调用这个函数,因为不会生成同名符号,所以无法调用inline int sum(int a,int b){return a+b;}1.inline和宏有什么区别?首先是处理时间的区别,编译阶段处理是有类型检查和安全检查的而宏是在预编译阶段处理的没有类型检查和安全检查的,所以内敛是安全的所以在c++中inline是一种更安全的宏编译是以编译单元为单位的,所以inline函数是本原创 2020-11-25 21:24:37 · 797 阅读 · 0 评论 -
函数的默认参数和函数重载
一旦某个形参被赋予了默认值,那么他之后的形参都需要有默认值函数的实参和形参匹配是自左向右的,而函数的调用过程,实参的入栈顺序是自右向左的合理设计形参顺序,尽量让不使用默认值的参数放在前面例如:void foo(int x,int y,int z=10){}int main(){foo(1,2)//没有给z值,z会使用默认值//但是如果有一个重载的函数foo,它有两个参数,那么则会精确匹配使用重载的函数foo(1,2,10)}CComplex(int r=10,int m=10)//原创 2020-11-25 21:21:52 · 404 阅读 · 0 评论 -
右值引用
引用: 左值引用&和右值引用&&左值引用:有名字,有内存,生命周期不会马上结束int a=10;int &b=a;int &c=20;//错误,因为20没有地址,无法将20的地址放入引用c的寄存器中引用必须被初始化,引用跟初始化时绑定关系访问引用会自动进行解引用操作,在底层和指针的操作基本相同右值引用:临时量,没名字,没内存,生命周期马上到了==>右值int &&d=20;//产生一个 内存空间,把20放入 内存空间,再把 内存空原创 2020-11-25 21:16:04 · 133 阅读 · 0 评论 -
基本I-O
首先了解的是cout,cin是两个对象,分别是ostream类型和istream类型的对象mian.cpp编译器根据后缀名决定编译规则#include //IO属于c++库,而不是语言的一部分int main(){std::cout<<“hellow”<<std::endl;}// std::out 将数据送到标准输出,目前的标准输出对应的是显示器// std::endl 换行// 命名空间-std// 命名空间的主要目的是减少名称污染,例如两个空间内存在相同名字原创 2020-11-25 21:10:31 · 130 阅读 · 0 评论 -
new和深浅拷贝,禁止拷贝,强制堆空间创建对象
c++四种new:int *p=new int//throw bad_allocint *p=new nothrow int;//nullptr,#include //必须使用new头文件const int *p=new const int(20); //不可修改值int *p=new (buf) int(40);//定位newPoint *p1 = new Point();Point *p2 = new Point(1, 1);p1->show();p2->show();de原创 2020-11-25 21:07:33 · 227 阅读 · 0 评论 -
编译链接原理
1.预编译阶段预编译阶段主要处理那些源代码文件中的以“#”开头的预编译指令,并生成.i文件,.i文件属于文本文件 。处理的主要包括:删除#define并进行文本替换#if #endif #elseif递归展开#include删除注释 添加行号和文件标识保留#pragma2.编译阶段编译阶段将高级语言转成汇编代码并生成.s文件,.s文件属于文本文件。要处理的主要包括:词法分析:利用扫描器将原代码的字符序列分割成一系列记号(关键字、标识符、特殊符号等)并标记。将标识符放在符号表中,常量在原创 2020-08-17 14:10:26 · 202 阅读 · 0 评论 -
虚拟地址空间
任何编程语言产生两种东西:指令和代码下面实在x86体系,32位linux环境下的情况int a=1;int b=0;int c;static int a1=1;static int a2=0;static int a3;//上面的变量都叫数据在符号表中都会生成对应的符号,只有a和a1是位于.data段,而其余四个都位于.rodata段int main(){int aa=1;int bb=10;int cc;//而main函数中的变量并不会在符号表中产生符号,他们叫做指令,最终是原创 2020-08-17 13:21:52 · 104 阅读 · 0 评论