本文用的是docker C++镜像 twoixter/gcc48-dev:latest
C++ 与C 有什么不同
很多人认为 C++是C 的超集,可以通过extern C 来处理C++ 与C的函数接口,实现C++ 调用C函数,从某种程度上来说,C++是在C语言基础上 进行拓展和改进,所有合法的C程序都是合法的C++程序。但是个人还是认为他们是两种语言。 1. 面向对象: C++是一种面向对象的语言,支持类,对象,继承,多态等面向对象编程的特性,C语言面向过程语言,没有直接面向对象编程。
-
标准库: C++提供了一个丰富的标准库,包括:容器,算法,输入输出,字符串处理,异常处理等功能,C语言的标准库比较小,主要包括一些基本的输入输出和字符串处理函数。
-
异常处理:C++ 引入了异常处理机制,可以通过抛出和捕获异常来处理错误情况。C语言没有内置的异常处理机制,通常使用错误码或返回值表示错误。
-
泛型编程:C++ 支持泛型编程,通过模板可以实现通用的数据结构和算法。C语言中没有泛型编程的特性,需要借助宏来实现一些功能。
-
命名空间:C++支持命名空间,可以将相关的代码组织在一起,避免命名冲突。C语言没有命名空间的概念。
-
运算符重载:C++允许对运算符进行重载,使得用户可以自定义运算符的行为。C语言不支持运算符重载。
-
默认参数:C++允许在函数声明时指定默认参数,调用函数时可以省略这些参数。C语言不支持默认参数。
-
类型检查:C++在编译时进行更严格的类型检查,能捕捉到一些潜在的类型错误。C语言类型检查比较弱。
-
内存管理: C++ 可以更好的控制内存管理,可以使用new 和delete 关键字来动态内存分配和释放,或者利用智能指针来进行自动管理。在C中使用malloc() 和free ()函数来手动完成。
C++ const 关键字
const 关键字一般来说有几个作用:
1.作为关键字。
修饰变量的时候,表示该变量不可以被修改。它可以修饰指针,普通变量,引用,函数等。
修饰指针时候,需要注意 char * const a 指针常量,可以通过*a 来调整; char const * a常量指针,可以通过 a= &c 来调整;
修饰引用的时候,例如形参引用的时候,避免拷贝,避免对值的修改。
修饰成员函数的时候,分为两种情况,一种在函数之前,一种放在函数的后面,放在函数的前面时候,表明返回的值不能为左值,防止返回值被直接赋值,但是一般变量无法修改函数返回值,其实为了防止函数返回类型为指针类型时,
通过指针对返回值进行修改,非指针函数的返回类型前加const是没有意义。
放在成员函数后面表面禁止对非mutable成员变量进行修改,同时也不能调用其他非const的成员函数。
2.修饰作用域。
- c++ const 修饰的全局常量具有根static相同的特性,有条件的,const放在只读静态存储区,即他们只能作用域本编译模块中 可是const 可以与extern 连用声明常量可以作用域其他编译模块中。
- c++ const正常情况下是在编译期产生的,编译器不会分配空间,只是在编译的时候将值保存在名字表中,适当时候折合在代码中, 在C中,const是不能改变的普通变量。
- 其次,C++中的const 修饰的全局常量作用域local,只在本文件中,并不是真正的全局变量,在C中作用域是GLOBAL,作用于整个编译工程中。
const 使用注意事项:
不可同时使用 static const 来修饰成员函数,static 表示的是静态函数,可以对类中的静态变量进行处理,而const函数不能对非mutable 变量进行处理,所以会产生冲突。像 static void func() const {}会报错。
const 和 define 的区别: 1. 分配不同,const 需要具体的类型才能分配内存,存储在数据段,并且在栈中分配了空间,define不需要分配内存,只需要替换即可,存储在代码段。 2. 类型不同, const常量是常量的声明,有类型的区别,需要在编译期进行确定。define 没有类型检查,只是简单的替换。