类相关知识点(常更新)

私有成员和保护成员的区别在派生类是否可访问上。
C++在C的基础上在安全性和易用性上进行了升级,以下基本是围绕安全升级和易用升级来说的。
还有就是一句话:C++不太讲优先级,避免二义性。

命名空间

安全升级。
一句话总结:命名空间允许定义一个可在其中声明标识符的命名区域。这样做的目的是减少名称冲突,尤其当程序非常大,并使用多个厂商的代码时。可以通过使用作用域解析运算符(::强烈推荐,BUG也好找),using声明(这个也不错,也好找)或using编译指令(强烈不推荐,一股脑全接入,BUG不好找),来使名称空间中的标识符可用。
先找全局命名空间,再找using编译导入的命名空间。(这句话有点不准确,using编译后的命名空间导入了全局命名空间,算全局命名空间的一部分。)若是有全局变量char ch,using编译导入的命名空间a里存在ch变量,使用ch时这时会因二义性报错。全局变量ch因二义性没法使用,命名空间a里的ch变量可用a::ch避免二义性后使用。若是要2个ch都可以正常使用,就不要using编译导入命名空间a,直接使用a::ch来使用命名空间a里的ch变量,这时全局命名空间里只有一个ch,全局变量ch用ch就可以正常使用。
简而言之,要点是避免二义性,没有优先级之说。使用中会碰到二义性问题,但通过域解析运算符,using声明等给出了解决方案。
如果开发了一个函数库或者类库,将其放在一个命名空间中。事实上,C++提倡将标准函数库放在名称空间std中,这种做法扩展到了来自C语言中的函数。例如,头文件math.h是与C语言兼容的,没有使用命名空间。但C++头文件cmath应将各种数学库函数放在命名空间std中,实际上,并非所有的编译器都完成了这种过渡。

引用和指针的区别:

安全和易用的双升级。

  • 相同点:都是地址,间接的操作变量
  • 不同点:
  1. 引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。
  2. 引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。
  3. 引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节
  4. 引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
  5. 指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。

重载函数

易用升级。
定义:两个以上的函数,取相同的函数名,但是形参的个数和类型和顺序的不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪个函数,这就是函数的重载。
函数重载是对C语言函数的一个升级,重点在易用性上,较大程度上实现了代码重用。函数重载的本质是编译器编译时重写函数名,将函数名第一个形参类型第二个形参类型...作为函数名。
eg:

  int test(int a,int b)
{
 ... 
}

其编译重写后的函数名为test_int_int,故而函数重载与形参的个数、类型、顺序(test_double_int和test_int_double不是同一个函数)有关,和形参名、返回值无关。

递归函数

C语言本身就有的。
定义:函数调用自身。递归调用需满足以下条件:

  • 函数执行语句;
  • 确定函数是否递归调用的测试;
  • 递归调用语句。
    先测试后,再执行递归调用和函数执行语句。
    递归函数实质和函数内的for循环很类同。每一次递归调用都是一次循环,而循环前都要进行条件判断。下面是个实例:
#include
using namespace std;
void test(int a);
int main()
{
    int i=1;
    test(i);
//  int sum=0;
/*  for(;i<=10;i++)
    {
        sum+=i;
        cout<

以上例子分别用for循环和递归调用完成了一次累加10。

参数默认的函数

eg:

int add(int a=10,int b=20)
{
return a+b;
}

如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左定义,中间不能有中断;当调用函数时,只能从左至右匹配参数。
参数默认函数是二义性的重灾区,一定要加倍小心。

C++类与结构体只一点不同类默认成员为私有,结构体默认成员为公共。类通过私有成员和公共函数接口实现了封装和模块化重用,在易用性和安全性上提升很多。

你可能感兴趣的:(类相关知识点(常更新))