这里简单介绍下命名空间,输入输出流,重载,C++缺省参数,引用的概念、使用方法以及引用和指针的区别
命名空间
以关键字namespace开始,其后接命名空间的名字,命名空间的名字在其所在作用域中是唯一的,命名控件可以在全局作用域或者其它作用域内部定义,但是不能在函数或者类的内部定义。
namespace namespace_name
{
//declarations
}
注:命名空间作用域不能以分号结束。
命名空间内部各成员之间可以直接访问,外部的代码必须指出所引用成员名字定义在哪个命名空间中。
外部代码引用方式:
(1)使用限定名 namespace_name::member_name
C++基本的输入输出流
1.标准输入流对象cin ,>> 是输入操作符
eg: cin>>x; //此时,用户从键盘输入的数值会自动地转换为变量x的类型,并存入变量x内。x必须是
基本的数据类型,而不能是void类型
注:在默认情况下,运算符">>"将跳过空白字符,然后读入后面与变量类型相对应的值。
2.标准输出流对象cout,<< 是输出操作符
eg:cout<<x; //将变量y的值显示在屏幕上
使用插入运算符“<<”进行输出操作时,可以把多个不同类型的数据组合在一条语句,也可以输出表达式的值
在C语言中,常用“\n”实现换行,C++中增加了换行符endl,其作用与“\n”一样
他们都属于C++标准库,所以都在std的命名空间中。
重载
在同一作用域中,一组函数的函数名相同,参数列表不同(参数个数不同或类型不同),返回值可同可不同,编译器根据实参与形参的类型及个数的最佳匹配,自动确定调用那个函数,这就是函数重载。被重载的函数称为重载函数。
重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
eg:参数类型不同的重在函数
#include<iostream>
#include<stdlib.h>
using namespace std;
int cube(int i)//求整数的三次方数
{
return i*i*i;
}
long cube(long l)//求长整数的三次方数
{
return l*l*l;
}
double cube(double d )//求整形的三次方数
{
return d*d*d;
}
int main()
{
int i = 5;
long l = 123;
double d = 5.67;
cout<<i<<"*"<<i<<"*"<<i <<"="<<cube(i)<<endl;
cout<<l<<"*"<<l<<"*"<<l <<"="<<cube(l)<<endl;
cout<<l<<"*"<<l<<"*"<<l <<"="<<cube(d)<<endl;
system("pause");
return 0;
}
运行结果:
C++为什么支持函数重载?
在linux下使用objdump查看目标文件中的函数名字的修饰,规则是:“返回类型+函数名+参数列表”。
详见:http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html点击打开链接
C++缺省参数
一般情况下,实参与形参个数相同,但C++允许实参与形参个数不同。方法是在说明函数原型时,为一个或多个形参指定默认值,以后调用此函数时,若省略其中某一实参,C++自动地以默认值作为相应参数的值。
// 全缺省参数
int Add1 (int a = 0, int b = 0)
{
return a + b;
}
//半缺省参数
int Add2 (int a, int b = 0)
{
return a + b;
}
void Test ()
{
Add1();
Add1(1);
Add1(1,1);
Add2(2);
Add2(2,2);
}
注:(1)在函数原型中,所用取默认值的参数都必须出现在不取默认值参数的右边。即一旦开始定义取默认
值的参数,就不可以再说明非默认值的参数。
(2)在函数调用时,若某个参数省略,则其后的参数皆应省略而采用默认值。
指针和引用
这里不再介绍指针,详细的介绍下引用
引用
概念:
引用不是定义一个变量,而是给一个已经定义的变量重新起一个别名
格式:
类型 &引用名 = 已定义的变量名
eg: int i = 5;
int &j = i;//使j成为变量i的引用,即变量i的别名
注:引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储空间
引用的特点:
1. 一个变量可取多个别名
2. 引用必须初始化
3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
引用作为函数参数
1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
void swap(int m, int n)
{
int tmp = m;
m = n;
n = tmp;
}//值传递,调用结束后,形参m和n的值交换了,但实参没有交换
2.【指针传递】实参传给形参的是实参变量的地址,即“传址调用”
void swap(int* m, int* n)
{
int tmp = *m;
*m = *n;
*n = tmp;
}//
3.【引用传递】如果形参为引用类型,则形参是实参的别名
void swap(int &m, int &n)
{
int tmp = m;
m = n;
n = tmp;
}//使用引用返回函数值
使用引用可以返回函数的值,采用这种方法可以将该函数调用放在赋值运算符的左边
传值返回和传引用返回
传值返回时,是将ret的值放在exa寄存器中
传引用返回时,是将ret的地址放在exa寄存器中
结论:
1. 不要返回一个临时变量的引用。
2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效
指针和引用的区别
1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
2. 引用必须指向有效的变量,指针可以为空。
3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
4. 指针和引用自增(++)自减(--)意义不一样。
5. 相对而言,引用比指针更安全。
总结:
指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所指的地址释放以后最好置0,否则可能存在野指针问题。