C++: 语法知识

extern C

  • 按C语言风格编译代码

  • 实现: 告诉编译器不要对函数名称进行修饰

命名空间

  • 功能:用来减少命名冲突的情况
  • 使用:
namsespace code {
    ...
    void func();
} 

使用命名空间中的代码
a.指定命名空间code::func() 
b.展开命名空间using namespace code;
c.指定成员using 命名空间名称::成员名字
  • 注意:
    • 1.一个命名空间就定义了一个新的作用域, 其内容限定于命名空间中                                  
    • 2.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

缺省参数

  • 缺省参数:声明和定义函数的时候, 给函数函数一个缺省值.若调用该函数时, 有实参用实参,没有就用缺省值
  • 使用:
int add(int a = 3, int b = 2)
{
    return a + b;
}
  • 注意
    • 缺省参数有全缺省和半缺省(必须从右往左连续给缺省值, 不然会有歧义)
    • 声明和定义的时候,不要同时给缺省值(否则有歧义), 一般是在声明给

内联函数

  • 内联函数: 展开函数无内存的开销, 适合频繁调用短小函数适合
  • 内联函数只是建议, 编译器不一定采纳
  • 内联失效  
    • 虚函数 (入虚表, 但内联函数会展开, 不会有函数地址)

    • 递归 (消耗过大, 编译器不一定采纳)

    • 函数体过大

函数重载

  • 函数重载:在同一作用域中,允许多个函数名相同, 但是它们的参数列表需要不同
    • 参数列表不同:a.类型不同 b.参数个数不同 c.参数顺序不同
  • 使用
int add(int a , int b)
{
    return a + b;
}

float add(float a , float b)
{
    return a + b;
}
  • C++支持函数重载原因: 有函数命名规则, 在链接的时候不会出现冲突

引用

  • 引用: 就是起别名
  • 使用
//1.引用做参数:比传值效率更高(没有临时对象的产生)
int add(int& a, int& b){
    return a + b;
}
//2.做返回值:运算符[]的重载, 链式调用

int main(){
    int a = 10;
    int b = 20;
    int& ra = a;//改变ra也会改变a(引用)
}
  • 语法特点       
    • 引用声明的时候必须初始化
    • 引用只能引用一个实体, 一个变量可以有多个引用
  • 引用和指针的区别
    • 语法上:引用是一个变量的别名, 指针存储一个变量的地址
    • 引用声明的时候必须初始化, 指针不用
    • 引用只能引用一个实体, 而指针可以随意修改指向
    • 没有空引用, 但是有空指针
    • 引用++使引用的实体+1, 指针++向后偏移一个指针类型的大小
    • sizeof: 引用的大小是该类型的大小, 指针一直是4/8个字节
    • 底层上: 引用本质上也是使用的指针

内联函数

  • 内联函数: 被inline修饰的函数, 在编译的时候会自动展开, 没有函数栈帧的开销
  • 特点
    • 没有函数栈帧的开销, 效率提高, 但是会占用额外的空间(函数被展开)
    • 内联只是建议, 编译器不一定采纳(和函数的代码长度有关)
    • 内联函数不要声明和定义分离,否则在连接的时候找不到该函数(被展开了)会报错

访问限定符(类与对象)

  • public: 类外可见
  • protected : 继承的子类可见, 类外不可见
  • private : 类外不可见, 子类不可见

友元(类与对象)

  • 功能: 使其能够访问类的私有成员
  • 语法: 给要访问该类的函数或类加上friend

this指针(类与对象)

  • 功能:用来区别类实例化的对象,知道是那个对象在调用成员函数
  • this指针存在于成员函数的参数列表中(第一个参数), 在栈上或寄存器
  • this指针的类型:类类型* const,即成员函数中,不能给this指针赋值
  • this指针只能在"成员函数"内部使用

重载,重定义, 重写(类与对象)

匿名对象

  • 没有名字,生命周期只有一行,通常用于仿函数,传参

范围for(C++11)

  • 功能:遍历容器等(底层是迭代器)
  • 使用
int arr[10] = {1,2,3,4,5,6};
for(auto num : arr)
{
    cout << num <<" ";
}

关键字

nullptr(C++11)

  • nullptr: 空指针是指针类型 , C语言中的NULL是0(数字), 用以区别

auto(C++11)

  • 功能:用于自动识别类型(根据初始化的值推导), 一些比较难写的类型可以使用auto, 如迭代器
  • 注意:auto不能作为形参, 不能用来声明数组(是编译器在编译的时候完成类型的推导)

decltype(C++11)

  • 功能: 类型推导(根据类型名来推导)

override(C++11)

  • 功能: 用来检查是否完成重写
class A{
    virtual void func(){}
};
 
class B : public A{
    virtual void func() override{}//没重写会报错
};

final(C++11)

  • 用来禁止重写
class A{
    virtual void func() final{}
};

static

  • C语言中

    • 修饰局部变量: 使其放在静态区,生命周期延长(和全局变量类似)

    • 修饰全局变量: 使其只能在声明它的文件中可见

    • 修饰函数: 使其只能在当前文件下可用

  • C++

    • static成员变量: 属于类,共有的不属于任何对象 要在类外初始化(指定类域)

    • static成员函数: 没有this指针-->也无法访问类里的成员

const

  • C语言

    • 修饰变量: 使其具有常属性, 不能被修改

    • 做参数, 返回值都是使其不变

  • C++

    • 修饰普通变量, 已经是常量, 具有宏替换的效果

    • 成员变量:必须在初始化列表中初始化

    • 成员函数:本质修饰this指针, 使其指向的内容不能被改变

explicit

  • 功能:禁止隐式类型的转换(若有默认构造函数, 一般允许隐式类型的转换发生)
  • 使用: explicit A()
  • 如 A  a1= 1;  先将1隐式类型转换为A类型的对象, 在拷贝构造a1

volatile

  • 避免编译器的优化, 每次访问去内存中取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值