C++知识点总结
1、c++介绍
(1)c与c++的关系
》c++是c的增强版,也称为带类的c
》c++是完全向下兼容c语⾔的
》c++和c的最⼤区别是编程思想的变化
》c++更适合编写⼤型的应⽤程序
(2)c++的应⽤领域—很⼴泛
》嵌⼊式
》游戏
》服务器
》等等
(3)c++的三⼤特性
》封装 继承 多态
2、命名空间:解决命名冲突的问题
定义:
namespace 命名空间名
{
变量;
函数;
…
}
:
:–>作⽤域运算符
命名空间名::成员名;
标准命名空间 std
但是如果在使⽤某个命名空间中定义的名称之前,加了using namespace ***;那么在使⽤这个名称时,就可以不⽤加::了⽆名命名空间 — 与c语⾔中的static类似 只能在本⽂件内使⽤
3、标准输⼊输出流
头⽂件:iostream using namespace std;
对流的操作就是对⽂件的操作
cin:标准输⼊流—>键盘
cout:标准输出流—>显⽰屏
控制输出格式:需要加头⽂件 iomanip
新添加的数据类型:string 头⽂件:string
int a;
cin >> a; //通过键盘给a赋值
cout << a; //输出a的值到显⽰屏
注意:
cin和cout在使⽤时,会⾃动根据变量的类型来进⾏匹配
新的类型
bool:true false
string:字符串
4、引⽤:变量的别名
什么是引⽤?
1、引⽤就是变量的别名,对引⽤的操作就是对变量的操作
2、不会给引⽤分配内存空间,引⽤和被引⽤的变量共享同⼀块内存空间
3、⼀个变量可以有多个引⽤,⼀个引⽤只能对应⼀个变量
int a = 10;
给a起别名:
int &k = a; //k是a的别名
定义引⽤:数据类型 &引⽤名 = 变量名;
注意:
1、变量必须存在
2、在定义引⽤时,⼀定要初始化
(1)对引⽤的操作就是对变量的操作
(2)定义引⽤不会开辟内存空间,和变量共享⼀块空间
(3)引⽤也可以有引⽤
(4)引⽤必须初始化
(5)引⽤只能是⼀个变量的别名
》常引⽤
const 数据类型 &引⽤名 = 变量/常量;
const:只读,使⽤const修饰的变量不能被修改
(1)const修饰的引⽤不能被修改
(2)const修饰的引⽤可以是常量的别名,但是⾮常引⽤不能是常量的别名
》引⽤⼀般⽤来作为函数的形参或者返回值类型
作⽤:不⽤再开辟新的临时的空间,节省资源,减少开销
》&什么时候是取地址,什么时候是引⽤?
前⾯有数据类型就是引⽤,没有数据类型就是取地址
注意:
指针和引⽤的本质区别:指针是⼀个定义的变量,需要专门分配内存空间,对于变量的
操作是间接访问,⽽引⽤不会专门分配空间,是变量的别名,对变量的操作是直接操作
指针和引⽤在使⽤时的区别:
1、指针占4个字节,引⽤不占空间
2、指针可以不⽤初始化,并且指向可以改变,⽽引⽤必须初始化,并且只能是⼀个变量的引⽤ 3、指针加1,向地址增⼤的⽅向移动了⼀个数据,引⽤加+1,就是变量的值+1
4、指针有⼆级指针,但是没有⼆级引⽤
5、有void*类型的指针,但是没有void类型的引⽤
6、指针只能是字符串常量的地址,⽽常引⽤可以是任何常量的引⽤
7、有数组指针、函数指针,没有数组引⽤和函数引⽤
8、指针只能是字符串常量的地址,常引⽤可以常量的别名
5、函数重载
在函数功能类似,参数类型或者个数不同的情况下,函数名可以重名,这就叫函数重载
概念:在同⼀个作⽤域内(⽐同⼀个命名空间),函数名相同,⼊参不同(类型不同,个数不同,参数顺序不同),
跟返回值⽆关,称为函数重载
特点:
1、函数名相同
2、参数不同
3、与返回值⽆关
》函数重载实现的原理:
函数名在定义时可以重名,但是g++在编译时,其实对每个函数名按照参数进⾏了重命名
⽐如:
void fun();—>_Z3_funv,所以本质上函数名还是不⼀样的
void fun(int a, int b);—>_fun_int_int
void fun(float a, float b);—>_fun_double_double
在函数调⽤时,编译器会根据函数的实参来匹配调⽤哪个函数
注意:
如果在调⽤时,没有与之完全匹配的重载函数,那么就会调⽤与它相近的函数进⾏匹配,
如果匹配上多个函数,就会出现歧义,就会报错
6、默认参数:函数的形参可以有默认值
void fun(int a, int b, int c = 10);
在定义函数时,可以给不太重要的参数⼀个默认值,如果传递实参,该形参的值就是实参的值,
如果没有传递实参,形参的值就是默认值
注意:
1、函数的传参时,是从左往右传,当有多个默认参数时,默认参数的设置必须是从右往左
2、函数在声明时如果有默认参数,在定义时⽆需再有默认参数
3、默认参数和函数重载⼀起使⽤,容易产⽣⼆义性
总结:
1、如果只有函数的定义,那么此时默认参数出现在函数定义中
2、如果既有函数声明⼜有函数定义,此时默认参数只能出现在函数声明中
7、c和c++的混合编程:c++程序如何使⽤⾃定义c库中的函数
因为g++在编译时,会对函数进⾏重命名,所以在链接c库时,存在不到要调⽤的函数的问题
⽽因为c库是⽤gcc来编译的,不会对函数名重命名
解决⽅法:在.h⽂件中声明函数时告诉g++编译器(extern “C” void fun();),不要对函数重命名,即使⽤gcc编译但是:此时c程序就⼜使⽤不了这个库啦,那就需要判断是gcc还是g++,采⽤不要的⽅式声明函数
怎么区分是g++还是gcc?
g++中有__cplusplus这个宏,⽽gcc没有
所以区分⽅法如下:
#ifdef __cplusplus
extern "C" void fun();
#else
void fun();
#endif
8、new和delete运算符
new:在堆区申请内存空间
delete:释放堆区的内存空间
使⽤⽅法:
new–》申请⼀个变量的内存空间 :
数据类型 *指针变量名 = new 数据类型;
释放 delete 指针变量名;
申请⼀个数组的内存空间
数据类型 *指针变量名 = new 数据类型[元素个数];
释放 delete 指针变量名;—>只会释放⾸元素的内存空间
delete []指针变量名;
注意:
new和delete是运算符,⽽malloc和free是函数
int *p = (int *)malloc(sizeof(int));
int *p = new int; delete p;
int *p = (int *)malloc(sizeof(int) * 10);
int *p = new int[10]; delete []p; //如果没加[],只是将第⼀个元素释放了
与malloc和free的区别:
1、new和delete是运算符,不需要新添加头⽂件,malloc和free是函数,需要加对应的头⽂件
2、new申请的时候已经确定了内存中存放的数据的类型,⽽malloc不确定,所以需要对返回值进⾏强制类型转换 3、malloc所申请的内存空间的⼤⼩需要⼿动计算,⽽new不需要,只要指定数据类型和元素的个数即可
4、free在释放时,只需要知道⾸地址就可以,但是delete需要加[],否则只是释放⾸元素的内存空间
const的作用9、类和对象
》回顾c的结构体
c语⾔中结构体成员不能是函数
c++中成员可以是函数
类是⼀个⾃定义的数据类型,⽤来描述⼀类事物的信息(包括属性及⾏为)
类的定义不会开辟内存空间,但是定义变量是会分配内存空间的
对象:本质就是类这种⾃定义的数据类型定义的变量
类:是⼀个抽象的事物
对象:这类事物的真实存在
所以:在c++中,定义类的变量,我们叫做实例化⼀个对象
类的定义:
class 类名
{
成员变量;
成员函数;
};
实例化对象:类名 对象名;
封装:
把实现细节隐藏起来,只暴露出来⽤户关⼼的部分,就称为封装
怎么实现封装?—访问限定符:public protected private
public修饰的成员是被暴露出来的成员,既可以在类内部访问,也可以在类外部访问
protected&private修饰的成员时被隐藏的成员,只能在类的内部进⾏访问
public:可以实现暴露 可以在类外部通过对象来访问该类的成员
private:可以实现隐藏 只能在类的内部通过该类的成员函数来访问该类的成员
protected:受保护的 只能在类内部访问 不能通过对象在类外部访问
注意:c++中的结构体和类的区别:在结构体中,所有的成员默认是公有的,⽽在类中,
所有的成员默认是私有的
注意:protected与private只有在继承时会出现分化
注意:成员函数既可以在类内部定义,也可以在类外部定义,在类内部声明,在定义时注意需要加上作⽤域数据类型 类名::函数名()
{
…
}
10、this指针
this指针:当前类对象(谁正在调⽤⾮静态的成员函数谁就是当前类对象)的地址
存在于类中所有的⾮静态成员函数中(编译器⾃动加的)
本质:this指针实际上是所有的⾮静态的成员函数的第⼀个形参
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论