C语言重点知识笔记样本.docx
- 文档编号:30521199
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:24
- 大小:1.20MB
C语言重点知识笔记样本.docx
《C语言重点知识笔记样本.docx》由会员分享,可在线阅读,更多相关《C语言重点知识笔记样本.docx(24页珍藏版)》请在冰豆网上搜索。
C语言重点知识笔记样本
1,内联函数,核心字inline,内联函数实既有两种办法,一种是把函数声明和定义写在一起,另一种办法是在类里用核心字inline声明函数,然后在类外定义内联函数,内联函数和普通函数区别是内联函数只是把函数体复制到调用该函数地方,而普通函数则是在调用函数时跳转到该函数执行,内联函数好处就是减少运营时间,但是会增长程序体积,因此规定函数体积尽量小且调用次数多才划算。
2,域属符号,“:
:
”voidA:
:
print();//A为类,
3,函数声明和定义区别,声明批示告诉编译器有这个符号,不会占用内存,定义则相称于函数实现,在内存中是要占位置。
4,头文献和源文献,可以把类声明和定义放在一种头文献中而把执行放在c++文献中,
5,const函数,对于不想变化对象成员变量成员函数,在函数体前面可以用const修饰,这样做可以以便用于查错,就是对于这个函数本来不打算修改私有数据值时候就可以用const修饰。
6,构造函数,构造函数就是函数名和类名同样函数,构造函数都是内联函数,在创立对象时候,可以直接调用构造函数来创立对象,例子rectanglea(3,4);就是在创立对象时候对其进行初始化。
构造函数是没有返回值。
一种类中可以有各种构造函数,区别就是参数不同,参数个数不同或者参数类型不同。
7,默认构造函数,该函数没有参数,并且不执行任何代码,没有任何功能A(){},只是用于创立一种对象。
当咱们创立一种构造函数时候就可以覆盖默认构造函数。
每个对象在创立时候都要调用构造函数来自己初始化,如果你没有提供一种构造函数,那么编译器就会自动建立一种默认构造函数,如果你创立了一种构造函数,不论你创立是默认构造函数还是带参构造函数,编译器都不会再为你提供任何默认构造函数,如果你还需要一种不带参构造函数,你就必要自己写,否则当你在调用没有参数构造函数时候就会出错。
8,析构函数,销毁一种对象,释放对象内存,析构函数没有参数和返回值,并且只能有一种析构函数,
9,对象数组,Aa[2],
10,this指针,this指针保存是该对象地址,默认状况下,this指针式省略不写,就是说在成员函数中调用数据时候都是省略了this指针,
11,常量指针,int*constp=&a;常量指针必要初始化。
常量指针是可以变化指针指向内容,但是不能变化指针值,这里需要注意是指针有关知识,就是指针类型和指针指向内容类型以及指针值和指针所指向内容值。
12,堆中对象,堆中指针式通过new来创立,因此堆中对象是通过指针来进行访问,
13,引用,引用就是别名,相称于大名和小名,intnum;int&mun=num;‘&‘,这是引用运算符,不是取值运算符,取值运算符可以用在任何时候,引用运算符则不能,尚有一种办法区别’&‘是取值运算符还是引用运算符办法就是看其是左值还是右值。
引用一定要记得初始化。
尚有引用是常量,只能初始化不能赋值。
int&mun;mun=num;是错,这是赋值而没有初始化。
引用应用重要还可以用在函数传参,在函数定义时候,若是参数是‘&’,则表达是这个参数是别名参数,就就可以想用指针指针同样进行有关操作,而不用那么麻烦。
这才是引用最佳作用吧,
14,引用地址,引用地址和被引用变量地址是同样,无论变化哪一种都是对变量进行修改。
引用一旦使用就相称于是指针常量,只会指向引用变量,后续操作都相称于是赋值操作,也就是变化引用变量值,就和常量指针概念一致了。
15,引用对象,HumanMike;Human&rMike;引用不能使用于类,其实很简朴,就是类是没有实际内存地址,就相称于int类型同样,
16,空引用,引用不用像指针那样对内存进行相应操作。
17,按值传递,其实就是函数传参是传递是数值而不是地址。
实质是传参过程中,编译器为为传递参数创立副本,就是说创立了新数据。
18,按址传递,就是函数传参时候传递指针。
19,按别名传递,就是函数在传参时候简便方式,简朴说就是,在函数定义时候,参数是‘&a’,在函数传参时候,这个符号是别名符号而不是取地址符号。
20,运用指针返回多值,当传递实参变化时候实质上就相称于返回了函数值,因此想要返回各种值就可以对参数进行变化,这里就可以用传递指针和传递引用。
这也是引用传参用处。
固然尚有其她办法。
但是这种办法可以就是进行各种运算,例如一种函数需要运算一种圆形面积和周长等。
就可以用一种函数来实现了。
21,运用引用来返回多值,这种办法和用指针来返回多值是同样,并且这种办法更简朴。
还是有一点需要注意就是当函数定义时候,当参数是‘&’形式时候,这是别名符号,这点牢记,并且在函数定义时候是不会浮现取地址符号,因此当函数定义时候有‘&’符号时候就一定传递别名参数。
22,按值传递对象,咱们懂得传递值时候,是要对该值进行拷贝(副本),这样话当值很大(例如对象很大),这种开销就很大,对象就是一种变量,这点是可以理解,尚有就是对象在拷贝时候,该对象构造函数和析构函数都会被执行,这样系统开销就很大。
返回对象时候,相应开销也是同样。
这里尚有一种复制构造函数概念,
23,按地址传递对象,Aa;func(&a);只有在返回一种对象地址时候才不会进行复制,但是这种办法可以对该对象进行修改了,这就破坏了数据安全性了。
24,使用const指针来传递对象,constA*constfunc(constA *constone){},这个函数定义可以较好看出函数返回值常量定义。
对于这个函数,用于接受这个函数返回值指针也是需要一种常量指针。
常量指针批示阐明了不能通过这个指针来变化指向对象值,但是原始对象是可以通过原始对象对其进行修改。
25,按别名来传递对象,A&func(A&one){};A&b=func(a);,
26,指针别名,
27,引用惯用错误,当引用对象不存在时候,
28,析构函数和delete运算符,记得当在函数中调用了new函数时候一定要调用delete,delete运算符会自动调用析构函数来销毁相应内存空间。
29,默认析构函数,~A(){},
30,调用构造函数进行类型转换,咱们可以把数字当做对象赋给另一种对象(z=1000,隐式转换),等价于a=A(1000),明示转换,强制类型转换,把1000转换为int型,,这样在对该复制表达是进行计算式,一方面要对数字进行类型转换,同步判断该类构造函数参数与否与数字类型匹配,如果匹配则调用构造函数创立一种暂时对象,最后调用析构函数删除暂时对象。
取消类型转换函数,在前面加上explicit核心字就可以让其不能强制转换
31,函数重载,函数名相似参数不同。
参数不用是指函数个数不同和参数类型不同,
32,成员函数重载,
33,函数缺省参数(默认参数函数),voidfunc(intn=0,intm=0),也可以写为voidfunx(int=0,int=0);当在调用函数时候若没有传递值(func();),则用默认值,若传递了参数则用传递值。
重要就是用在类中设立函数,这种方式和函数重载有一定相似地方。
34,重载函数和缺省参数函数区别,重载函数使用以便,易于理解,默认参数函数如果不加标注话很容易被忽视,并且容易被有参数同名函数覆盖;具备默认参数函数重载是参数数值,而重载函数重载是参数类型。
35,构造函数重载,
36,成员变量初始化,在构造函数中初始化,尚有一种就是在构造函数函数头进行初始化:
例子,rectangle():
length(3),width(4){….},
37,rectangle(inti,intj):
length(i),width(j){….},这两种办法区别就是如果成员变量被const修饰话,则第一种会出错,实质上是第一种方式是对变量赋值,二第二种方式则是对变量初始化,因此如果有成员变量是常量(const)或者引用话,必要用第二种方式。
当成员变量有父类对象时,可以直接调用父类构造函数,实现办法就和对本类成员变量初始化同样,rectangle():
father(23),length(3),width(4){….},
34,成员变量初始化和构造函数调用,当成员变量是对象时候,这调用构造顺序是按成员变量顺序来,而不是按照
如上图所示,析构函数则相反,
35,复制构造函数,A(){},A(constA&one){this->n=one.n},this指针可以省略,每一种类均有一种默认复制构造函数。
上面程序不是浅拷贝,代码应当是
上面程序delete会浮现问题,delete会调用析构函数,则会删除x内存,则在main函数返回时候,又会再次调用析构函数,但是这时候X指针所指内存已经删除了,则程序就会崩溃。
这种方式就是浅拷贝,这种拷贝话,若是成员变量中有指针话,则很容易浮现问题,下面则是另一种方式。
1,继承和派生,继承是指子类和父类相似成员变量,派生是指子类从父类那继承过程中具备新特性过程就叫做派生。
继承方式有单一继承和多重继承。
Class儿子:
public爸爸
2,
3,单一继承,例子(事实上变量是不能是中文,下面只是一种范例)
class爸爸
{
private:
int爸爸身高,爸爸体重:
public:
void设立爸爸身高(int爸爸身高){爸爸身高=爸爸身高;}
void设立爸爸体重(int爸爸体重){爸爸体重=爸爸体重;}
void输出爸爸身高体重(){...}
};
class儿子:
public爸爸
{
private:
int儿子肩宽,儿子臂长:
public:
void设立儿子肩宽(int儿子肩宽){儿子肩宽=儿子肩宽;}
void设立儿子臂长(int儿子臂长){爸爸臂长=爸爸臂长;}
void输出儿子肩宽臂长(){cout<<"肩宽="<<儿子肩宽<<...}
}
intmain()
{
儿子李明;
李明.设立爸爸身高(180);
李明.设立爸爸体重(80);
李明.设立儿子臂长(134);
李明.设立儿子肩宽(100);
李明.输出爸爸身高体重();
李明.输出儿子臂长肩宽();
return0;
}
1,保护型成员,对于普通类来说是不能访问,但是对于子类是可以访问,这是protect核心会有因素,就是为了给子类用。
2,公有派生,class儿子:
public爸爸
//公有派生公有成员例程如下:
/*
#include
usingnamespacestd;
classfather
{
public:
voidroom(){cout<<"爸爸大房子我可以享有\n";}
};
classson:
publicfather
{
};
intmain()
{
sona;
a.room();
return0;
}
*/
//公有派生保护权限例程如下:
/*
#include
usingnamespacestd;
classfather
{
protected:
voidroom(){cout<<"爸爸大房子我可以享有\n";}
};
classson:
publicfather
{
public:
voidenjoy(){room();}
};
intmain()
{
sona;
a.enjoy();
return0;
}
*/
//公有派生私有成员例程如下:
/*
#include
usingnamespacestd;
classfather
{
private:
voidsecret(){cout<<"爸爸秘密\n";}
};
classson:
publicfather
{
public:
voidenjoy(){secret();}
};
intmain()
{
sona;
a.enjoy();
return0;
}
*/
//2.私有派生,基类所有东西都是private类型,因此需要间接方式访问
#include
usingnamespacestd;
classfather
{
public:
voidroom(){cout<<"爸爸大房子我可以享有\n";}
};
classson:
privatefather
{
public:
voidenjoy(){room();}
};
intmain()
{
sona;
a.enjoy();
return0;
}
1,多重继承,classson:
publicfather,publicmother,classson:
publicfather,privatemother
2,继承构造和析构函数,构造函数调用顺序是按照继承时给定顺序,从左到右,西沟函数则是相反。
3,想基类构造函数传递参数,一种是直接在构造函数体重实现变量(继承致父类变量和子类自身变量,成员变量可以是基本数据类型,也是可以是类创立对象)赋值,但这种办法有缺陷,会调用父类构造函数,却没有进行有效工作,增长系统开销;另一种就是调用父类构造函数,在父类构造函数中对父类成员变量进行赋值,也许这就是构造函数有各种用处吧,后一种办法也使代码可读性大大增强。
4,多继承容易产生两义性,是指也许调用函数不清晰是从哪个父类继承来,解决办法是用c.A:
:
hello(),加上域属核心字就可以了,作用域操所符。
5,继承中重载,当咱们在子类中定义一种与基类同名函数时,那么等于是告诉编译器,用子类函数覆盖掉基类同名函数,同步将她重载函数隐藏起来。
6,指向对象指针,const修饰对象只能调用const函数。
father*p=newson;,一种子类对象可以赋值给父类指针(多态性),这样就建立了子类和父类联系,尚有需要注意是这个指针在调用函数时候问题,这个指针只能调用父类所占内存所在大小内存中成员函数,这是由于指针性质决定,可以用内存思想来考虑下。
7,虚函数,virtualvoidrun()const{cout<<”爸爸可以跑万米\n”;},就是说在函数前面加上virtual核心字。
father*p=newson;对于这种形式,由于在函数run()前面加virtual,表达该函数是有各种形态,即该函数也许被各种对象所拥有,并且功能不一,换句换说各种对象在调用同一名字函数时产生效果也不同样。
那么系统在执行有核心字virtue函数时候就会自动判断是哪个对象调用了它,然后调用该对象同名函数。
8,虚函数用处,对于不同拳击选手都会有beat功能,但是每个拳击选手beat功能确是不同,一种函数被声明为虚函数,则在派生类中覆盖了该函数,那么该函数也是个虚函数,固然你也可以加上virtue核心字,换句话说就是只要一种函数定义为虚函数,那么它派生后就只能是虚函数了。
下面是例子。
#include
usingnamespacestd;
classposer
{
public:
virtualvoidbeat()const{cout<<"普通选手一拳力量为260磅\n";}
protected:
intage;
};
classAli:
publicposer
{
public:
voidbeat()const{cout<<"阿里一拳力量为420磅\n";}
};
classLewis:
publicposer
{
public:
voidbeat()const{cout<<"刘易斯一拳力量为480磅\n";}
};
classTyson:
publicposer
{
public:
voidbeat()const{cout<<"泰森一拳力量为500磅\n";}
};
classholy:
publicposer
{
public:
voidbeat()const{cout<<"霍利菲尔德一拳力量为350磅\n";}
};
voidmain()
{
poser*a[5];
poser*p;
intchoice,i;
for(i=0;i<5;i++)
{
cout<<"
(1)阿里
(2)刘易斯(3)泰森(4)霍利菲尔德:
";
cin>>choice;
switch(choice)
{
case1:
p=newAli;//选取1时,新建Ali对象,并用指针p来指向它
break;//跳出switch语句
case2:
p=newLewis;
break;
case3:
p=newTyson;//选取3时,新建Tyson对象,并用指针p来指向它
break;
case4:
p=newholy;//选取4时,新建holy对象,并用指针p来指向它
break;
default:
p=newposer;//默认时,也就是选其她数字,新建poser对象,并用
//指针p来指向它
break;
}
a[i]=p;//将p指针赋给数组元素,元素中保存是对象地址,
//关于数组概念背面还要详细解说。
a[i]->beat();//通过数组中保存指针来访问函数,由于是间接访问,因此要
//加指向成员运算符->
}//for循环结束
}
这个代码思想可以借鉴一下(循环某些),
9,继承与否能实现多态性,在不使用virtue之前,c++对重载函数使用静态联编,而使用了virtue后来,C++则对该函数进行动态联编,
10,系统是如何调用虚函数,
11,虚构造函数和虚析构函数
12,纯虚函数和抽象类,例子:
virtualvoidsleep()=0;
13,静态成员变量,静态成员变量是属于类而不属于某一种对象,换句话说就是静态成员变量需要分派内存。
静态成员变量和构造函数和析构函数一起用可以标记这个类创立对象个数。
静态成员在没有对象之前就存在。
1,静态成员,静态成员特性是不论这个类创立了多少个对象,而其静态成员只有一种拷贝,这个拷贝被所有属于这个类对象共享。
静态成员数据不能在类中进行初始化,由于在类中不能为其分派空间,静态成员实在编译时创立并初始化。
私有静态数据成员不能被类外函数访问,也不能用对象进行访问。
用静态成员一种重要因素就是不必使用全局变量。
静态数据成员重要用途就是定义类中各个对象所共用数据,如记录总数,平均数等。
2,函数指针,
4,成员函数指针,
11,包括,一种类中包括另一种类对象,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 重点 知识 笔记 样本