C/C++辨析

开始复习C++,针对C与C++的一些关键不同和区别,做以下总结:

命名空间

c++诞生时,程序编写已经越来越复杂了,为了避免越来越长的函数和变量名称,防止重名,于是C++中加入了命名空间机制。
说白了,就是把一堆变量和函数的声明或者定义放在一起,然后起个集体的名字,就叫命名空间。

命名空间的用法

  • 当在命名空间外使用变量或者函数时,就需要指明是哪个命名空间,即需要加上作用域限定符说明。例如std::coutstd就是一个命名空间,::是限定符
  • 如果一个变量或者函数需要多次调用,每次使用都要加命名空间,会很烦,可以在程序开始加上一个using声明来告知程序,后面的所有该变量/函数都来自某个命名空间。例如using std:cout;在后续的调用中程序会自动识别coutstd::cout
  • 如果需要用到一个命名空间里的很多函数或者变量,一个个单独using声明又太麻烦,就可以直接声明命名空间,using namespace std;将整个命名空间的所有定义一股脑全搬过来。

匿名命名空间
命名空间还可以不定义名字,不定义名字的命名空间称为匿名命名空间。由于没有名字,该空间中的实体,其它文件无法引用,它只能在本文件的作用域内有效,它的作用域是从匿名命名空间声明开始到本文件结束。在本文件使用无名命名空间成员时不必用命名空间限定。其实匿名命名空间和static是同样的道理,都是只在本文件内有效,无法被其它文件引用。
可以利用匿名命名空间,把一个文件中的全局变量对外隐藏起来,不被外部访问,也避开了命名引起的变量重定义的问题。

引用和指针

在一篇旧文里详细写过,参见C++ 常量指针、指针常量、引用和常引用的用法解析
主要注意以下两点:

  • 引用是变量的别名。等同于直接调用引用指向的变量。而指针是变量的地址,需要解引用后才能访问变量
  • 引用一经初始化便不能改变指向的对象,而指针只要不是指针常量,可以改变其指向

new/delete

C++中引入了新的申请内存的机制,new/delete机制。
C++中的new运算分为两步,第一,开辟空间,第二,调用构造函数初始化。
所以,C++中的new更加高级,甚至可以在现有地址上直接构造对象,而不分配内存。
一般用法为new 类型[个数](初始化内容)
只进行初始化构造对象new(要构造对象的地址)类型[个数](初始化)

与malloc/free的区别

  • 申请的内存所处位置不同,new从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++的抽象数据区概念,专门用来指new申请的空间,既可以是堆,又可以是静态存储区
  • 性质不同,new/delete是一对运算符,而malloc/free是标准C库函数
  • 效率不同,new/delete效率更高
  • 安全性不同,new/delete更安全
  • 返回值不同,new/delete返回的是带类型的指针,malloc/free返回的是空类型的指针
  • new/delete可以对内存进行初始化,malloc/free不行
  • new/delete可以调用构造/析构函数,malloc/free不行
  • new可以不申请内存,malloc不行
  • malloc调用出错返回NULL,new则会直接抛出异常

函数重载

函数重载也是C++中特有的机制,是指两个不同的函数,函数名相同,但是函数形参不同,形参的不同可以是形参个数,也可以是形参类型。在发生函数调用时,编译程序根据函数调用的形参类型个数自动进行匹配,
C++中函数重载机制的实现依赖于C++的独特编译机制,在编译函数时会对函数名进行“改编”,从而区分出不同的重载函数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章