内联函数:
在调用的时候将函数在调用处展开,不再建立函数栈帧,减少了建立栈帧的消耗
关键字: inline
在定义函数的时候在返回值类型前加上关键字 inline
Eg:
Inline int add(int x , int y )
{
Return x + y;
}
内联函数只是对编译器的一种建议,对于比较小的函数会进行展开,而长的函数就不会再展开,而是按照普通的函数进行执行
注意:如果函数中的语句比较多,那么就不会再展开了,而是进行正常的函数调用,建立函数栈帧
内联函数的缺陷:可能会使目标程序变大
优势:少了调用消耗,提高效率
内联函数的声明和定义不能分离(即不能声明和定义在不同的文件中)。内联函数没有地址,这就导致当声明和定义在不同文件时,后续编译的时候,函数定义和函数声明无法链接,因此会出现链接错误,即编译过程中出现错误
替代宏的方式:
用const enum 替换宏常量
内联函数替代宏函数
Auto关键字:
1.根据数据类型定义变量类型
- 特殊方式定义,以便识别
- auto 不能作为函数参数类型, auto也不能定义数组
范围for:
语法:
For(变量类型 x : 数组名) //x的变量类型和数组元素类型保持一致
{
。。
}
范围for是默认从arr[0] 开始直至遍历结束,并每次将值赋值给变量x。
Eg:
//遍历数组,运用auto自动定义x类型,保持了arr的元素类型和x保持一致
For(auto x : arr)
{
cout << x << ‘ ’;
}
如果在遍历时改变arr元素的值,x的变量类型定义为引用
Void test(int arr[ ])
{
for(auto x : arr)
Cout << x << ‘ ’;
}
这是错误的。因为传参时不能传入数组,传入的是首元素的地址。
实质上for括号内的是 auto 变量1 : 区域块
区域块是整个数组,那么是将整个数组进行变量。
因此只传入首元素的地址时会发生错误
关键字nullptr : nullptr相当于是 (void*)0 即NULL。 因为c定义的时候,有的定义NULL为0,而不是指针类型,导致传参等等会出现问题,因此传空指针时更推荐传入nullptr。
类和对象
- 面向对象是关注对象和对象之间的关系
二.类的定义和实例化
C++兼容了C的struct的用法
C++将struct升级为成了类
类可以实例化出 n个对象
例如:C的struct stack 里只能存储数据。 升级为类以后可以存储函数
Eg: 升级为类之后,类里定义的函数可以不用参数,而且类中定义的数据类型在函数中可以直接使用。
升级为类以后struct的名称(即自定义的类名)就可以直接用来定义类。
Eg:
Stack st;
st.Init( );
即可。
尽管如此,C++更喜欢用class 定义类
Eg:
同时C++定义的类引入了访问权限的限制
加入了访问限定词:
【访问限定符说明】
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
访问限定词是限定范围是当前访问限定词到下一个访问限定词直接的为当前访问限定词的限定范围
注意:strcut定义的类的访问权限默认为public。Class定义的类的访问权限默认为private
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选 择性的将其接口提供给外部的用户使用。。