C++ 基础笔记

对于C++笔记的一些温习内容.

 


关键字:  namespace: 解决命名冲突,是c++中一种新的作用域;  

//1.普通命名空间
namespace N1
{
    int a = 10;
    int Add(int left,int right)
    {
        return left+right;
    }
}

//2.嵌套
namespace N2
{
    int a = 20;
    int Sub(int left,int right)
    {
        return left-right;
    }
    namespace N3
    {
        int a = 30;
        int b = 20;
        int Mul(int left,int right)
        {
            return left*right;
        }
    }
}

//同一个工程中,可以定义多个相同名称的命名空间
//编译器会将多个相同名称的命名空间合并成一个,如果有相同的会重定义报错
namespace N1
{
    int c = 0;
    int d = 0;
    int Div(int left,int right)
    {
        if(0 == right)
        exit(0);
        return left/right;
    }
}

int a = 50;

//使用成员
//方式一: 命名空间名字::成员名字
//方式二: using 命名空间名字::成员名字  
//      场景 : 当前命名空间中个别成员多次在某个文件中被使用
//      缺陷 : 可能会和全局造成命名冲突
//方式三: using namespace 命名空间名字
//      场景 : 当前命名空间中多个成员多次在某个文件中被使用    
//      缺陷 : 冲突率比较高 
using N1::a;
using namespace N1;

int main()
{
    int a = 60;
    printf("%d\n",a);     //局部
    printf("%d\n",::a);   //全局
    printf("%d\n",N1::a);  //namespace N1
    
    return 0;
}

  


 缺省参数:   缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参

1.最好放在声明位置
2.必须是常量或者全局变量
3.半缺省参数必须从右往左依次来给出,不能间隔
4.C语言不支持

//缺省参数分类
//1.全缺省参数 : 实参想给几个给几个,从左往右传值
void Func1(int a=2,int b=3,int c=4);
//2.半缺省参数 : 只能从右往左依次给出缺省参数,不能跳着给
//            从左往右传值
void Func2(int a,int b=3,int c=4);

  


 函数重载: 名称相同,参数列表不同的函数,与返回值无关,需在同一作用域

原理: 名字修饰规则,编译器底层为重新修饰后的名称,包含作用域,函数名,参数类型等

 


 引用: 变量的别名,与引用的变量共用同一块内存空间

语法: 必须初始化

应用: 相当于替代了指针,传参,传返回值

底层:  引用就是指针 T& == T * const

 


 内联函数: inline修饰的函数,更安全的替代宏函数

 在编译器编译阶段,用函数体替换函数调用的位置,少了函数调用参数压栈以及栈帧创建的时间开销,提高了代码的运行效率

 特性: 1.空间换时间的做法,适合短小的代码

   2.对编译器来说只是一个建议

      3.不建议内联函数声明和定义分离,容易导致链接错误

 


 auto:  使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将

auto替换为变量实际的类型。

auto使用细则 :
    1.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

    2.当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

auto不能使用的场景 :

    1. auto不能作为函数的参数

    2. auto不能直接用来声明数组(因为数组只有&和sizeof里才是数组,其他时候会退化成指针)

    3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

    4. auto在实际中最常见的优势用法就是跟C++11提供的新式for循环,还有lambda表达式等进行配合使用

 


 关键字 nullptr: 因为C语言NULL是宏,所以可能会出错,由此引入更安全的nullptr.

  c++把NULL、0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0.

  c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为 ((void*)0),

  当编译char *p = NULL;

  NULL只好被定义为0。

  还有:

  void    func(int);

  void    func(char*);

  如果NULL被定义为0,func(NULL)会去调用void    func(int),这是不合理的

  所以引入nullptr,专门用来区分0、NULL。

  nullptr的类型为nullptr_t,能够隐式的转换为任何指针。

  所以用空指针就尽可能的使用nullptr。

 

posted @ 2020-04-02 20:48  Duikerdd  阅读(186)  评论(0编辑  收藏  举报