前言
在学习了c语言,初阶数据结构后,我们正式走进c++世界大门
目录
前言
一、认识c++
二、缺省参数
三、函数重载
四、引用
4.1什么是引用?
4.2 使用场景
4.2.1 做参数
4.2.2做函数返回值
4.3引用和指针的区别
五、内联函数
六、auto关键字
6.1使用细则
1. auto与指针和引用结合起来使用
2.同一行定义多个变量
3.不能推导的场景
一、认识c++
我们刚在学c语言的时候,第一节课敲得第一次代码 hello world,我们用c++打出,如下
#include<iostream>using namespace std;int main(){ cout<<"hello world"<<endl; return 0;}
std 是c++标准库的命名空间
在上述代码中,用cout标准输出对象的和cin标准输入对象,相当于printf和scanf。cout和cin是全局的流对象,endl是特殊的符号,表示换行输出,都包含在头文件<iostream>种,
二、缺省参数
缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。示例如下:
#include<iostream>using namespace std;int add(int a=0){ cout<<a<<endl;}int main(){ add();//没有传参时,使用参数的默认值 add(10);//传参时,使用指定的实参 return 0;}
三、函数重载
所谓的函数重载其实是函数的一种特殊情况,在c++中,允许同一作用域中声明功能类似的同名函数,这些函数的形参列表(即参数个数、类型、类型顺序)不同。
示例代码如下:
#include<iostream>using namespace std;//参数类型不同int add(int a,int b){ return a+b;}double add(double a,double b){ return a+b;}//参数个数不同void dif(){ cout<<"wof wof"<<endl;}void dif(int m){ cout<<"dif(int m)"<<endl;}//参数类型顺序不同void sam(int x,char y){ cout<<"sam(int x,char y)"<<endl;}void sam(chary,int x){ cout<<"sam(chary,int x)"<<endl;}
四、引用
4.1什么是引用?
引用是一个已存在的变量的别名,并不是一个新的变量,他和他引用的变量共用一个内存空间。
类型& 引用变量名(对象名) = 引用实体;
示例如下:
int m=10;
int &m1=m;
4.2 使用场景
4.2.1 做参数
示例如下:
void change(int& a,int& b){ int tmp=a; a=b; b=tmp;}
4.2.2做函数返回值
int& res(){ static int n=0; n++; return n;}
4.3引用和指针的区别
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。 2. 引用 在定义时 必须初始化 ,指针没有要求 3. 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何 一个同类型实体 4. 没有 NULL 引用 ,但有 NULL 指针 5. 在 sizeof 中含义不同 : 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32 位平台下占 4 个字节 ) 6. 引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小 7. 有多级指针,但是没有多级引用 8. 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理 9. 引用比指针使用起来相对更安全 1、语法概念上,引用就是个别名,没有独立空间,和引用实体公用一个空间 2、在底层实现上是有空间的,因为 引用时按照指针方式来实现的五、内联函数
以 inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。 示例如下:inline int add(int a,int b){ return a+b;}int main(){ int sum=0; sum=add(1,2); return 0;}
特性:
1. inline 是一种 以空间换时间 的做法,如果编译器将函数当成内联函数处理,在 编译阶段,会 用函数体替换函数调用 ,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。 2. inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同 ,一般建 议:将 函数规模较小 ( 即函数不是很长,具体没有准确的说法,取决于编译器内部实现 ) 、 不 是递归、且频繁调用 的函数采用 inline 修饰,否则编译器会忽略iinline特性 3. inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址 了,链接就会找不到,应将生命和定义放在同一文件中 示例如下://f.h文件下#include<iostream>using namespace std;inline void f(inti){ cout<<i<<endl;}
六、auto关键字
早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,
C++11 中,标准委员会赋予了 auto 全新的含义即: auto 不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器, auto 声明的变量必须由编译器在编译时期推导而得.6.1使用细则
1. auto与指针和引用结合起来使用
用 auto 声明指针类型时,用 auto 和 auto* 没有任何区别,但用 auto 声明引用类型时则必须 加&int main(){ int x = 10; auto a = &x; auto* b = &x; auto& c = x;}
2.同一行定义多个变量
auto a=2,b=3;
auto x=1,c=5.2;//该行代码会编译失败,因为c和d的初始化表达式类型不同
3.不能推导的场景
1、auto不能作为函数的参数
// 此处代码编译失败, auto 不能作为形参类型,因为编译器无法对 a 的实际类型进行推导 void Test ( auto a ) {}2、auto不能直接用来声明数组
面试题:
宏的优缺点:
优点:
1. 增强代码的复用性。 2. 提高性能。 缺点: 1. 不方便调试宏。(因为预编译阶段进行了替换) 2. 导致代码可读性差,可维护性差,容易误用。 3. 没有类型安全的检查 C++ 有哪些技术替代宏 ? 1. 常量定义 换用 const enum 2. 短小函数定义 换用内联函数