1、引用&
声明:数据类型 & 引用名=变量名
函数调用时不会为形参分配内存空间,节约空间;
int a=10;
int & yinyong=a;//引用必须初始化
void swap(int &a,int &b)
{}
函数可以返回引用类型
返回的相当于是地址,而不是返回对象本身
int &fn(int &num)
{
return num;
}
2、常量const修饰
表示值不能被修改
const int c=10;//常量必须初始化,后期不能修改
const int &b=a;//常量引用 a的值变化b跟着变化
//在类的成员变量中不同的作用
int get_X(void) const;//这个函数只返回x的值,并不修改成员的值
3、函数的默认参数
在函数声明或者定义时可以给参数赋予默认值(有声明时必须在声明上赋予默认值)
如果设置了一个默认值,那么右边的所有参数都必须有默认值
//这是错误的 必须在声明上赋予默认值
int fn(int num);
int main(int argc, char* argv[])
{
int b=fn();
cout<<b;
}
int fn(int num=10)
{
num++;
return num;
}
4、内联函数
incline 函数返回值类型 函数名(形参列表){函数体}
编译时,类似宏替换,使用函数体替换调用处的函数名。
必须先定义后使用,不然会被认为是普通函数
5、函数重载
6、强制类型转换
int a;
float b=(float)a;//C风格
float b=float(a);//C++风格
4种显示转换方式
static_cast< new_type>(要转换的对象)
只能处理两者间有一定关系的转换
float a=1.9;
float* pf=&a;
int b=static_cast<int>(a);
int* pi=static_cast<int*>(pf);//不能转换
dynamic_cast< new_type>(要转换的对象)
newtype必须是类的指针、类的引用、或者void*
下行转换时会进行安全检查,先尝试转换,如果成功则会返回合法指针,如果失败返回空指针;
还有个要求,类必须是多态,即包括“虚”函数
class Base{virtual void dummy(){}};
class Derived:public Base{};
int main(int argc, char* argv[])
{
Base* pbb=new Base;
Base* pba=new Derived;
Derived* pd;
pd=dynamic_cast<Derived*>(pbb);//父类转子类,不行,返回void*(空指针)
pd=dynamic_cast<Derived*>(pba);//子类转子类,没问题
return 0;
}
const_cast< new_type>(要转换的对象)
用来修改类型的const或volatile属性
const int var = 10;
//int *pi = &var; //不能从const int*转换到int*
int *pi = const_cast<int*>(&var);//这样就能转换了
const int *p_const = &var;//常量指针指向常量指针无问题
*pi = 12;
cout << "var:" << var << endl;//原常量的值并未被修改
cout << "*pi:" << *pi << endl;//但是使用指针调用出来的值却被修改了,有点怪
cout << "*p_const:" << *p_const << endl;//同上
cout << "&var:" << &var << endl;//
cout << "pi:" << pi << endl;//
cout << "p_const:" << p_const << endl;//三个指针均指向同一位置
此方法其实是用在函数参数的传递上
void disp(int *var)
{
cout << *var << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
const int var = 10;
//disp(&var);//不能直接传递
disp(const_cast<int*>(&var));//实际应用中可能经常出现这种情况,可以传递给函数且不改变原常量
return 0;
}
reinterpret_cast< new_type>(要转换的对象)
(重新解释)
用作无关类型之间的转换,比如:它可以把一个指针转换成一个整数、把一个整数转换成一个指针、还可以进行不同类型指针之间的转换
随意在不同类型之间使用可能造成程序被破坏
float fa = 1.5;
float *p_fa = &fa;
//int i = reinterpret_cast<int>(fa); 不能转换,不是指针
int *pi = reinterpret_cast<int*>(p_fa);//正确
int i = reinterpret_cast<int>(p_fa);//正确
7、输入输出流
iostream
cin>>;对应键盘;C stdin
cout<<;对应屏幕;C stdout
cout提供了put输出字符,write输出字符串
char a[] = "abc";
cout << "abc" <<endl;
cout.put('a').put('b').put('\n');
cout.write(a, sizeof(a)-1).put('\n');
数出数据时有时要指定输出格式
控制符 | 作用 |
---|---|
dec | 10进制 |
hex | 16进制 |
oct | 8进制 |
setbase(n) | 设置整数的基数为n(16、10、8之一) |
setfill(c) | 设置填充字符c,c可以是字符串常量或字符变量 |
setprecision(n) | 设置实数的精度为n位。一般是指有效位数,当以fixed(固定小数位数)或scientific(指数)形式输出时,n为小数位数 |
setw(n) | 设置字段宽度为n位 |
setiosflags(ios::fixed) | 固定小数位输出 |
setiosflags(ios::scientific) | 科学计数法输出 |
setiosflags(ios::left(or right)) | 输出数据左对齐 |
setiosflags(ios::shipws) | 忽略前导空格 |
setiosflags(ios::uppercase) | 科学计数法输出E和16进制输出X时,大写表示 |
setiosflags(ios::showpos) | 输出正数给出+号 |
resetiosflags | 终止已设置的格式状态,在括号中指定内容 |
cin>>从流中提取数据时,通常忽略其中的空格、换行和Tab等
char ch,ch2;
ch= cin.get();
cout << ch << endl;
cin.sync();//因为接下来的代码要从流中读入数据,而上一步以回车结尾,所以一定要清除缓存,否则会读入回车
cin.get(ch2);//2种读取单个字符的方法
putchar(ch2);//显示字符
cin.sync();
char buffer[10];
cin>>buffer;//cin.read(buffer,10);
cout.write(buffer,sizeof(buffer)-1);//如果输入的字符少于10个后面会有乱码