目录
1.输入与输出
C:
scanf_s();
printf();
C++
cin<<
cout<<
2.引用
引用符号:&
可以理解为取别名,对引用的操作等于对本身变量的操作。
b=10;
int &a = b;
在函数中使用,可以直接将形参的值进行修改,因为他是直接对原变量进行操作,没有实参复制形参的过程。
void Swap( int& a, int& b)
{
int c = a;
a = b;
b = c;
}
int main()
{
int x = 10, y = 20;
swap(x, y);
return 0;
}
引用必须初始化。若对常量引用必须加const
const int & a = 10;
3.inline 内联函数
内联函数是为了减少频繁调用小函数消耗大量栈空间所提出的。
inline int Max(int a , int b)
{
return a+b;
}
内联函数的处理方式是直接在函数调用点展开成代码段。
需要注意的是加了inline并不一定就是内联函数,编译器会自行评估是否要处理成内联函数。
如果函数中代码行数过多,或者有循环,则不会成为内联函数。
inline 函数一般写在头文件中。
inline 函数只在Release版本生效。在Debug版本是不生效。
内联函数和宏的区别:
inline函数是在编译期处理的,有安全检查和类型检查。而宏是在预编译期处理的,没有检查机制,只是简单的文本替换
内联函数和static函数的区别:
static函数处理的方式和普通函数一致,都有函数的开栈和清栈开销,只不过将函数的符号变成了局部,导致了只能在本文件使用。
内联函数没有开栈和清栈开销,由于在函数调用点进行展开,所以只有本文件可以使用。
4.函数默认值
void fun(int a,int b, int c = 0,int d =0)
{
cout<<a<<b<<c<<d<<endl;
}
C++中函数可以有默认值,如果在调用时不赋值,则会使用默认值进行传参。
注意:
只能从右到左依次进行默认值设定,不可以跳跃,例如:
void fun(int a=1,int b, int c = 0)
{
cout<<a<<b<<c<<endl;
}
这样是错误的。
在调用时,也要遵循从左到右赋值,不可以跳跃,例如:
fun(1,2, ,4);//void fun(int a,int b, int c = 0,int d =0)
5.函数重载
函数重载是指在同一作用域中声明多个功能类似的同名函数。
为什么c++可以进行函数重载?
c语言处理函数时,产生的函数符号是将函数名直接变成_函数名,因此如果重名,在调用时则会产生冲突。
c++的在产生函数符号时,是通过函数名,返回值类型,形参列表来决定,因此在调用时可以进行区分。
注意点:
返回值类型不同,形参列表相同的函数不能重载。虽然返回值不同对应的函数名的符号不同,但是由于在使用时候,编译器可能会无法分辨出该调用哪个函数,所以就出现了错误,因此函数的返回值是不可以作为是否属于重载函数的判断标准。
同样需要注意的是,参数带有默认值时,如果产生歧义也是无法进行调用的,例如:
int fun(int a,int b,int c,int d);
int fun(int a,int b,int c);
在正常情况下,该函数可以进行重载,但是如果对d进行默认值设置,则可能会产生歧义。
6.函数模板
函数模板是为了解决同样的函数,或者类,但是有不同类型的参数的问题。
定义如下:
template<typename 模板名字>
函数
template<class Type>
const Type& Max( const Type& a, const Type & b)
{
return a > b ?a : b;
}
注意:
函数模板并不是宏定义,而是通过在编译时期识别类型,通过typedef 模板名字 type方式进行替换。
一个是在预编译期,一个是在编译器,如下例子:
template<class Type>
void fun()
{
Type *a,b;
}
如果是宏替换,则会报错,因为Type不是类型名,只是一个替换,导致b并没有被定义。
7.new/delete
在C++中堆内存的分配和释放是通过new和delete来操作的。
int main()
{
int * p =new int(10);//10是初始化值
*p=100;
delete p;
int * p =new int[10];//开辟10个int类型大小的空间
delete []p;//在删除连续多个空间时使用
}
8.namespace
为了解决命名冲突的问题,c++提供了命名空间机制。
全局变量a和Sum函数定义在n1这个名字空间作用域下。作用域将其隔离起来。访问方式如下:
namespace n1
{
int a;
int Sum(int a, int b)
{
return a+ b;
}
}
int main()
{
cout <<n1:a <<endl;
int rt = n1:Sum(10,20);
return 0;
}
通过名字空间作用名称加上作用于访问符::的方式进行访问。除了上述的访问方式外,C++中还提供了另外两种的访问方式。
1.using声明
int main()
{
using n1:a;
using n1::Sum;
cout<<a<<endl;
int rt = Sum(10, 20);
return 0;
}
2.using指示符
using 指示符是将using 指示符后名字空间作用域下的所有符号暴露在using 指示符所在的作用域。
int main()
{
using namespace n1;
cout<<a<<endl;
int rt = Sum(10, 20);
return 0;
}
如果同一项目出现同名的命名空间,将会把命名空间作用域进行合并。