代码1 sum.cpp intgdata=10; intsum(inta,intb){ returna+b; } main.cpp externintgdata; intsum(int,int); intdata=20; intmain(){ inta=gdata; intb=data; intret=sum(a,b); return0; } 1:编译 需要关注的几个点1:.o文件的格式组成是什么样子?2:.exe文件的组成格式是什么样子?3:"所有.o文件段的合并符号表合并后,进行符号解析"4:"符号的重定位(重定向)"5:"符号表的输出"=>"符号"6:符号什么时候分配虚拟地...

  xs9mrAcZVTZn   2023年11月02日   75   0   0 C++

下面代码中备注部分为从汇编指令角度看形参带默认值得函数调用 include<iostream> usingnamespacestd; intsum(inta=10,intb=20){ returna+b; } intmain(){ inta=1; intb=2; / moveax,dwordptr[ebp-8] pusheax参数b压栈 movecx,dwordptr[ebp-4] pushecx参数a压栈 callsum / intret1=sum(a,b); / push14H//立即数直接压栈 movecx,dwordptr[e...

  xs9mrAcZVTZn   2023年11月02日   68   0   0 C++

如下代码 usingnamespacestd; intsum(inta,intb){ returna+b; } intmain(){ inta=1; intb=2; intret=sum(a,b); return0; } 上面sum函数调用,会涉及到参数压栈,函数栈帧的开辟及回退过程,因此在函数调用的过程时候是会有开销的sum函数的核心功能转成汇编指令即1:将x的值放入寄存器2:再将y的值和寄存器内容相加为了使用这个非常简单的功能,我们需要做许多额外的动作,例如压函数参数入栈,压下一条执行指令地址入栈,将main函数的栈底指针压栈,为sum函数开辟栈帧,这一些系列动作产生的汇编指令远...

  xs9mrAcZVTZn   2023年11月02日   72   0   0 C++

C函数重载代码如下 include<iostream> usingnamespacestd; boolcompare(inta,intb){ cout<<"compare_int_int"<<endl; returna>b; } boolcompare(){ cout<<"compare_double_double"<<endl; returna>b; } boolcompare(constchara,constcharb){ cout<<"compare_char_char"<<endl;...

  xs9mrAcZVTZn   2023年11月02日   102   0   0 C++

const怎么理解?const修饰的变量不能够在作为左值!!初始化完成后,值不能被修改!! C和C中const的区别? 在C程序中test.cconstinta;只定义,不做初始化(C中允许),如果不做初始化,那么后面就不能再赋值了.在C语言中const修饰的量,可以不用初始化,这个不叫常量,叫做常变量,本质还是变量,只是不能作为左值被修改值了 例如1:在.c的程序中constinta=100;intarray[a]={};是不可以的,因为a不是常量,他还是个变量 例如2:在.c的程序中 constinta=100; intp=(int)&a; p=300; printf("%d%d%...

  xs9mrAcZVTZn   2023年11月02日   105   0   0 C++

C中Const修饰的量叫常量,与普通变量的区别是什么?C中有两点1:编译方式不同,在编译的过程中,所有在程序中出现名字的地方都会被初值替换掉2:不能作为左值了 const修饰的量常出现的使用错误有1:常量作为左值修改值(因为这种方式可以直接修改常量的值)2:把常量的地址泄漏给一个普通的指针或普通的引用变量(因为这种方式可以间接修改常量的值如下示例1代码)示例1: constinta=10; intp=&a;//p=20;编译报错不能将constint(整型常量的地址)赋值给int(普通的int指针) const和一级指针结合方式有如下种类C的语言规范:const修饰的是离他最近的类型...

  xs9mrAcZVTZn   2023年11月02日   74   0   0 C++

1:C的引用,引用和指针的区别?1:从汇编指令角度上看,引用和指针没有区别,引用也是通过地址指针的方式访问指向的内存int&b=a;是需要将a的内存地址取出并存下来,b=20;(通过引用修改值时,也是先取出指向的地址,然后访问该地址的值并修改它,和通过指针修改值一样)在定义引用的时候,必须初始化,并能够对a取地址。所以int&c=20编译错误的,因为20取不了地址.2:引用只有一级引用没有多级引用,指针有一级指针和多级指针3:定义一个引用变量和定义一个指针变量,其汇编指令是一样的.通过引用变量修改所引用内存的值和通过指针修改所指向内存的值其底层指令也是一样的.4: intarr...

  xs9mrAcZVTZn   2023年11月02日   74   0   0 C++

new和malloc区别?delete和free区别?malloc和free是C语言的库函数new和delete叫做运算符malloc是否开辟成功是通过返回值和空指针比对判断.而new开辟失败会抛出异常bad_alloc new不仅可以做内存开辟,还可以做内存初始化操作. intp=(int)malloc(sizeof(int)); //malloc按照字节开辟空间,返回的是void,需要自己强转到指定类型. //malloc只负责空间开辟,不负责初始化 if(pnullptr){ return-1; } p=20; //释放malloc申请的空间地址,只需要将p地址传入即可 free(p)...

  xs9mrAcZVTZn   2023年11月02日   55   0   0 C++

C类:实体的抽象类型实体(属性,行为)->ADT(abstractdatatype) 类(属性->成员变量,行为->成员方法) OOP语言4大特征抽象封装/隐藏(通过publicprivateprotected)继承多态 classStudent{ //属性一般都是私有的成员变量 private: charNAME[20]; intage; //提供给外部的公有方法 public: //在类体内实现方法,自动实现成内联方法 voidsetAge(int_age){ this.age=_age; } voidsetName(constchar_name){ strcpy(N...

  xs9mrAcZVTZn   2023年11月02日   96   0   0 C++

构造函数和类名相同,可以带参数,参数可以有多个定义对象时,自动调用,构造完成了,对象就产生了构造函数执行完成后,内存开辟完成,同时可以完成初始化工作. 析构函数Test();析构函数可以自己调用,不带参数,只有一个析构函数,析构函数调用后,对象不存在了.自己调了析构函数后,就不能在调用对象的方法了.不建议自己调用析构函数 示例代码1: classstudent{ private: intage; charNAME[20]; }; students1 intmain(){ students2; studentps3=newstudent(); } 上面的代码s2数据位置在栈上,ps3...

  xs9mrAcZVTZn   2023年11月02日   89   0   0 C++

先看示例代码 include<iostream> include<cstring> usingnamespacestd; classStudent{ public: Student(int_age,constchar_name) { this->age=_age; intlen=strlen(_name)+1; chartep=newchar[len]; this->pName=tep; strcpy(this->pName,_name); } Student(){ delete[]this->pName; this-&gt...

  xs9mrAcZVTZn   2023年11月02日   65   0   0 C++

示例代码1 classCDate{ public: CDate(int_year,int_month,int_day){ this->year=_year; this->month=_month; this->day=_day; } private: intyear; intmonth; intday; }; classStudent2{ public: Student2(constchar_name,int_id,int_year,int_month,int_day){ this.ID=_id; strcpy(name,_name); } private: ch...

  xs9mrAcZVTZn   2023年11月02日   29   0   0 C++

类的各种成员->成员方法&成员变量 普通的成员方法=>编译器会添加一个this形参变量1:属于类的作用域2:调用该方法时,需要依赖一个对象,而且常对象不能调3:可以任意的访问对象的私有成员变量 const常成员方法=>conststudentthis1:属于类的作用域2:调用依赖对象,普通对象和常对象都可以调用3:可以任意访问对象的私有成员,但是只能读,不能写. static静态成员方法=>编译器不会添加this形参变量1:属于类的作用域2:用类名作用域来调用方法3:可以任意访问对象的私有成员,仅限于不依赖对象的成员(只能调用其他的static静态成员) 注意:...

  xs9mrAcZVTZn   2023年11月02日   35   0   0 C++

指向类成员(成员变量和成员方法)的指针 1:定义一个指针指向类的普通成员变量 示例代码1 classTest2{ public: intma; staticintmb; voidf1(){cout<<"Test::voidf1()"<<endl;} staticvoidstatic_f(){ cout<<"Test::voidstatic_f()"<<endl; } }; intTest2::mb=0; intmain(){ intp=&Test2::ma; return1; } 上面intp=&Test2::ma;可以这样...

  xs9mrAcZVTZn   2023年11月02日   82   0   0 C++

函数模板模板的意义:对类型也参数化intsum1(inta,intb){returna+b;}doublesum2(doublea,doubleb){returna+b;} 几个概念函数模板模板的实例化模板函数 模板类型参数模板非类型参数 模板实参推演模板的特例化模板函数,模板的特例化,非模板函数的重载关系 点击查看代码 template<typenameT,typenameE>//定义一个模板参数列表或者用classT也可以 boolcompare(Tx){//compare是一个函数模板,它目前只是个模板 cout<<"TemplateCompare"<&...

  xs9mrAcZVTZn   2023年11月02日   45   0   0 C++

类模板=>实例化=>模板类 通过类模板实现栈,点击查看代码 include<iostream> include<cstring> usingnamespacestd; template<typenameT> //template<typenameT=int>也可以这样写,写个默认类型 //这是个模板名称,模板名称+类型参数列表=类名称 classMyStack{ public: //在构造和析构函数名字后面可以不加<T> MyStack<T>(int_size=10): size(_size), ...

  xs9mrAcZVTZn   2023年11月02日   83   0   0 C++

使用类模板简单实现STLVector include<iostream> usingnamespacestd; template<typenameT> classMyVector{ public: //构造函数 MyVector<T>(intsize=10){ T_tep=newT[size](); first=_tep; last=_tep; end=first+size;// cout<<"构建Vector,首地址"<<first<<endl; } //拷贝构造 MyVector<T>(...

  xs9mrAcZVTZn   2023年11月02日   31   0   0 C++

.在上一节我们实现的MyVector存在哪些问题? 问题1 现在有Student类 classStudent{ public: Student(){cout<<"构造Student对象"<<endl;} Student(){cout<<"析构Student对象"<<endl;} private: intage charNAME[20]; charpAddress; } MyVector<Student>v1[1000]; 我只是希望创建一个能放1000个Student的Vector,但是开始并不放任何内容,但是发现编译器除分配了1...

  xs9mrAcZVTZn   2023年11月02日   50   0   0 C++

C的运算符重载:使对象的运算表现得和编译器内置类型一样如下代码,如果T是整形,那很好理解,但是如果T是一个Student类,a+b?怎么操作,两个学生类怎么相加?这个就是我们要说的运算符重载问题 template<typenameT> Tsum(Ta,Tb){ returna+b;//a.+(b)=>a.operator+(b)operator+就是我们需要的函数 } CComplexoperator+(constCComplex&lhs,constCComplex&rhs){ reutrnCComlex(lhs.x+rhs.x,lhs.y+rhs.y);...

  xs9mrAcZVTZn   2023年11月02日   66   0   0 C++

我们结合运算符重载知识实现string类在自己实现的String类中可以参考C中string的方法例如构造,加法,大小比较,长度,[]等操作.当前的MyString类中,暂时不加入迭代器,我们将在下一节中加入迭代器的代码. include<iostream> usingnamespacestd; classMyString{ public: //构造函数 MyString(constcharpSource=nullptr){ if(pSource!=nullptr){ pString=newchar[strlen(pSource)+1]; strcpy(p...

  xs9mrAcZVTZn   2023年11月02日   49   0   0 C++
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~