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
- 避免编译器的优化, 每次访问去内存中取