C和C++的区别
C语言语法简单,但使用不易
C++语法非常庞大复杂,但使用方便,更注重的是它的编程思想(面向对象)。
一.第一个C++程序
1.文件扩展名
C++源文件扩展名 .cpp,C,cxx,c(需要指定编译语言)
C++自定义的头文件依然保留.h
2.头文件
C++标准库的头文件,不带.h,最常用的是iostream,
C语言的东西依然可以继续使用 ,比如stdio.h,也可以改为cstdio
3.输入输出语句
cout <<输出
cin >> 输入
不在使用占位符,它可以自动识别数据类型
scanf和printf可以继续使用
4.编译器
gcc也可以编译C的源码,但是需要添加额外的参数
g++是编译C++源码的最简单的编译器,在LINUX和Unix下使用比较方便,一般操作系统没有安装
ubuntu下的安装指令:sudo apt-get install g++
之前gcc的编译参数依然可以继续使用
ps:C++编译时的错误提示不是很精准,一个错误可能产生大量的错误提示
5.引入了命名空间
using namespace std;
二.C++中的基本数据类型
1.C++完全兼容C语言中的所有数据类型(C++兼容C语言中基本所有语法)
2.添加了bool类型,字节宽度是1,数值true(非0值),false
3.在显示bool变量前,使用boolalpha可以用true或false形式显示bool值
4.void *与其他类型的指针转换受到限制
void *不可以直接给其他类型的指针赋值,必须经过强制类型转换
任意类型的指针都可以直接给void *赋值
三.C++中的联合,枚举,结构
1.在C++中,结构,联合,枚举一旦设计成功,在之后的使用就不需要关键字了
2.枚举的检查更为严格(C++中是一种独立的数据类型)
3.结构成员中可以有函数,在函数中可以直接访问结构成员
4.结构对象可以继续使用.或->访问成员和成员函数。
5.结构中的成员添加了访问属性:
public:公有的,任何位置,都可以访问
private:私有的,只能在成员函数中使用
protected:
6.结构体在创建的时候,会自动调用构造函数
a.没有返回值
b.名字与结构相同
c.参数是任意的
7.结构体在释放的时候会自动调用析构函数
a.无返回值,参数
b.~结构名
四.引用
1.引用就是起别名,为一个标识符另外再取一个名字
2.引用必须要初始化,否则编译错误。
3.引用不光可以引用标识符,也可以引用立即数(右值,字面值,常量),但必须加const
4.不能定义空引用,但是野引用或者悬空引用是存在的。(引用对内存的数据,当堆内存释放后就不应该再使用)
5.引用只能是一次性,无法再更改(引用一旦成功之后就是一个变量了,之后身份至死不变)
6.引用也可以当作函数的参数,它引用的对象就是函数的实参,引用可以达到指针的效果
a.函数之间共享变量
b.提高参数的传递效率,效率比指针还要高
c.可以获取参数
注意:能使用引用的就不要再使用指针了
引用不能完全替代指针(比如申请堆内存返回的是一个指针)
7.引用也可以当作函数的返回值,但绝不能返回局部变量的引用
练习1:使用引用定义一个交换两个变量的函数
练习2: 定义一个函数,计算一个整数的最大公约数和最小公倍数,最大公约数使用返回值返回,最小公倍数使用引用返回
五.C++中的内存管理运算符
1.在C++中使用new/delete来管理内存,new用来申请内存,delete来释放内存
2.new在申请内存时候允许对内存进行初始化
3.使用new在创建对象结构对象时,会自动调用构造函数,delete时会自动调用析构函数
总结:malloc/free与new/delete的区别?
1.malloc,free,是标准库中的函数,使用时,需要添加头文件,而new和delete是C++自带的运算符。
2.malloc返回的是void *指针,而new返回的是有类型的指针
3.malloc创建对象时,不会调用构造函数,free时不会调用析构函数,但new/delete会自动调用构造和析构函数
4.使用malloc申请内存大小时,需要自己计算字节数,而new会自动计算
4.[]可以配合new和delete申请或释放数组
new[]与delete混用,必须使用delete[]释放。
使用new[]/delete[]创建多少个对象就会调用多少此构造和析构函数
5.new/delete 和malloc/free不能混用
6.delete不可以重复释放,但是可以释放空指针
7.如果使用new申请内存失败,会产生异常 "std::bad_alloc"
六.C++中的函数
1.C++中的函数可以在main函数之前执行,C语言中不可以。
2.C++中函数名字可以相同,只要参数不同即可(这叫做函数重载,不只是参数)
函数可以同名,并不是真正意义上的同名,它只是在编译期间把函数的名字添加了额外信息,这些额外信息就是函数的参数,返回值不算在内
3.内联函数
内联函数就是把函数编译成二进制代码,然后再调用的位置把函数直接拷贝过去,而不是跳转过来后再执行,这样可以减少进栈,出栈和调用,以此提高程序的执行效率,但是这样会增加可执行文件的大小。
内联函数与宏函数的区别:从本质上来说,它们是一样的,但是内联函数会检查参数是否合法,也可以具有返回值。
inline 返回值类型 函数名(参数)
{
}
4.C++中函数的参数可以具有默认值,默认参数要尽量少用,否则可能会引起重载错误。
1.函数的默认参数要靠右
2.默认参数要尽量少用,因为可能会导致重载错误
3.默认参数是编译器在编译时帮助赋值的,所以只能由全局变量,静态变量,字面值对参数进行赋值