C++与C的区别
C++是C的增强版本
C++是完全兼容C,只要是合法的C的程序在C++中都是合法的!
C++中扩展了很多内容
数据类型:引用、类类型、布尔类型等!关键字:friend、class、bool、public等!
编程思想是不一样的
C语言是面向过程的结构化的程序设计语言,中级语言。
C++是面向对象的编程语言,更接近自然界的发展规律!
一、基本概念
命名空间
解决问题:解决命名冲突的问题!变量、函数、自定义的数据类型
命名空间格式:
namespace 命名空间的名字{可以有变量,也可以有函数,还可以有自定义的数据类型};
使用:
命名空间名字::变量等!
使用using namespace 命名空间名字; 切换到对应的范围中,直接使用即可!
C++中标准的命名空间 std 里包含了c++中所有的库--头文件
标准输入输出流
输入流对象: cin
使用: cin>> 变量;
输出流对象: cout
使用:cout<< 变量;
好处: 输入输出不需要做格式的限制,使用简单
引用
什么是引用: 就是给变量起别名,变量是已经存在的,别名和变量指的是同一块内存空间!
定义的格式: 数据类型 &引用名 = 变量名;
Int p = 10;
Int &pt = p; // 这里的pt就是给p起的别名
引用与指针的区别:
- 引用是给变量起别名;指针是用来保存地址;
- 定义指针变量系统会给分配内存空间,定义引用不会额外的分配内存空间;
- 指针变量定义完之后可以不进行初始化,但是一般为了避免野指针,会初始化为NULL;
引用定义完必须进行初始化
4.指针变量是可以改变指向,但是引用一旦初始化之后不可以改变指向。使用引用比使用指针安全!
5.应用:都可以设计成函数的参数类型。
说明一个常量的方法:
使用宏定义
使用const修改引用---通常应用在函数参数设计上!
函数重载
解决问题:函数功能相似,参数不同(参数类型不同)的一组函数,解决函数名命名困难的问题!(在C语言中不能出现同名函数)
函数重载定义: 函数名相同,函数功能要相似,参数不同(参数类型不同、参数个数不同、参数类型的顺序不同),与返回值类型无关的一组函数!
为什么在C中不可以有同名函数,而C++中允许有
使用gcc和g++分别去编译了同一个.c源文件,观察了可执行二进制文件,发现:
使用gcc编译完之后,函数名没有发生变化
使用g++去编译的时候,函数名发生变化了,函数名字根据函数参数类型以及个数进行重命名!
函数名不同,函数在内存中的地址就不同!
总结:
函数重载的原理: 使用g++进行编译的时候,函数名会根据参数类型以及参数个数进行重命名,函数名字不一样,函数在内存中的地址就不同,调用的时候执行的就是不同的函数体!
参数默认值
什么是参数默认值:就是在函数定义的时候给了形参一个初始值。
当我们在调用函数的时候,可以选择性的给这个参数值,可以给它值也可以不给它值!如果不给它值,按默认值参与函数体中的运算;如果给了它值,就按给的值参与函数体中的运算!
当函数参数有默认值,可以解决函数重载中 只有参数个数不同的而造成的代码冗余!
在设计函数参数默认值的时候要注意:
1.参数默认值给的顺序是 从右向左的;调用函数的时候参数匹配的顺序是从左向右的!
2.在函数重载中,当函数参数有默认值的时候要注意二义性,不然就会出错!
解决方案:保留参数个数多的函数 参数都给默认值
3.当函数声明和函数定义同时存在的时候,参数的默认值只能出现一次,建议放在函数声明的地方!
如何判读编译器是g++还是gcc?
方法1:
方法2:计算一个字符占的内存大小,也可以来区分!!!
动态内存分配
C中的动态内存分配:
malloc库函数
free库函数
C++中有提供另外的动态内存分配的方法:
New运算符 –开空间
Delete运算符—释放空间
书写格式:
数据类型 *指针变量 = new 数据类型; ==》 delete 指针变量;
数据类型 *指针变量 = new 数据类型[个数]; ==》 delete [] 指针变量
面试题目: new和malloc的区别?
- New是C++中的运算符,malloc是C中标准的库函数;
- 书写: new后面只要跟数据类型即可,并且开空间后不需要进行强制类型转换;
Malloc开空间:要给开空间的大小,并且开空间后要进行强制类型转换;
3.New开的空间用delete去释放; malloc开的空间free去做释放;
4.New开的空间可以让做初始化,malloc开的空间初始化要自己用memset去做;
5.对于类类型来说,new的方式去创建对象,会自动的调用构造函数;delete释放对象的时候会自动调用析构函数;
Malloc是不会执行构造函数的,free是不会执行析构函数的!!!
面试题目:为什么有了malloc和free还需要new和delete?
new的方式去创建对象,会自动的调用构造函数;delete释放对象的时候会自动调用析构函数;
Malloc是不会执行构造函数的,free是不会执行析构函数的!!
二、面向对象编程中的类与对象
-
C++中的结构体与C中结构体的区别?
<1>.c结构体中不能有函数;而C++结构体中是可以有函数的!
<2>.c中空结构体的大小为0字节;C++中空结构体的大小为1字节
C中的结构体面向对象不彻底,C++中面向对象,就是把属性和行为整合在一起来完整的描述一类事物! 可以用结构体,但是他有提供专门的一种数据类型类来表示的!
什么是类:为了描述一类事物的属性和行为而自定义的一种数据类型!
把属性和行为整合在一起 {}
类的关键字: class