前言
在学习了c语言,初阶数据结构后,我们正式走进c++世界大门
目录
[4.2 使用场景](#4.2 使用场景)
[4.2.1 做参数](#4.2.1 做参数)
[1. auto与指针和引用结合起来使用](#1. auto与指针和引用结合起来使用)
一、认识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引用和指针的区别
- 引用概念上定义一个变量的别名,指针存储一个变量地址。
- 引用 在定义时 必须初始化 ,指针没有要求
- 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何 一个同类型实体
- 没有 NULL 引用 ,但有 NULL 指针
- 在 sizeof 中含义不同 : 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32
位平台下占 4 个字节 )- 引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
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;
}
特性:
- inline 是一种 以空间换时间 的做法,如果编译器将函数当成内联函数处理,在 编译阶段,会
用函数体替换函数调用 ,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。- inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同 ,一般建
议:将 函数规模较小 ( 即函数不是很长,具体没有准确的说法,取决于编译器内部实现 ) 、 不
是递归、且频繁调用 的函数采用 inline 修饰,否则编译器会忽略iinline特性- 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不能直接用来声明数组
面试题:
宏的优缺点:
优点:
- 增强代码的复用性。
- 提高性能。
缺点:- 不方便调试宏。(因为预编译阶段进行了替换)
- 导致代码可读性差,可维护性差,容易误用。
- 没有类型安全的检查
C++ 有哪些技术替代宏 ?- 常量定义 换用 const enum
- 短小函数定义 换用内联函数