Namespace 名字空间
namespace可以将相同变量名称分为不同的逻辑域。
同一namespace的声明在概念上属于同一实体。
namespace mfc{
int flag;
int a;
}
namespace owl{
int flag;
int b;
}
int m
::为域解析符,如namespace::variable
由于不同namespace间经常调用对方成员,有以下简化:
1.声明命名空间
2.声明变量
若lop命名空间内有k,则using声明后的k都指代 lop::k
using namespace lop;
k=6;
/******/
using mfc::inflag;
inflag=8;
owl::inflag=9;
C++的输入和输出
输入和输出被作为字节流对待,所以输出和输出是对stream的操作。
以下为iostream对象:
cin:标准输入流
cout:标准输出流
cerr:标准错误流
>>:用于对输入流的操作符。
<<:对输出流的。
上述两个操作符会自动判别数据类型,并无视空字符,即使要读取的类型是char。
while(cin>>val)
{
sum+=val;
}
cout<<sum<<endl;
cin>>val可以读到文件结尾。
输入输出控制符(Manipulator)
manipulator可以分为 无参数的和有参数的,分别在头文件iostream和iomanip中。
详细的用参考书的方式修改blog。
文件操作
文件操作,需要包含头文件fstream;
还有什么其他的头文件以及操作?拓展。
定义类istream读文件,定义ostream对象和写文件。
#include<fstream>
using namespacestd;
const int cutoff=6000;
const float rate1=0.3;
const float rate2=0.6;
int main()
{
ifstream infile;
ofstream outfile;
int income,tax;
infile.open("income.in");outfile.open("income.out");
if(!infile)
{
/*
infile如果打开文件不成功会返回NULL;
(#define NULL 0)
另外,exit()函数是操作系统提供的,参数0为正常退出该程序,参数为1为异常,并报告给操作系统。
*/
cerr<<"Unable to open"<<endl;
exit(0);
}
while(infile>>income){
if(income<cutoff)
tax=rate1*income;
else tax=rate2*income;
}
outfile<<"Income="<<income<<"greenbacks\n"<<"Tax="<<tax<<"greenbacks\n";
infile.close();outfile.close();
return 0;
}
类型转换(Casts)
static_cast
这是最常见的类型转换。
如
int x=20,y=30;
float average=(float)x/(float)y;//c语言
float average=static_cast<float>(x)/static_cast<float>(y);//c++类型转换
const_cast
将常量变量转换为非。
reinterpret_cast
一种指针类型向另一种指针类型的转换或整型向指针型转换。
如:
unsigined char *p=reinterpret_cast<unsigned char*>(&f);
dynamic_cast
运行时带有类型检测的类型转换。
在后面的继承章节有介绍。
布尔类型
bool 类型有1,0(true,false)两个值。在数学运算中。会被转化为整数类型的1和0。
枚举类型
enum summer_month{Jun = 6,Jul = 7,Aug = 8};
每个枚举变量是独特的类型。
初始化值会顺序递增,从0开始。
若第一个值你给了值,后面顺序也递增1.
string字符串类型
具体待填。
new和delete操作符
int *p,*q;
p=new int;
q=new int [20];
delete p;
delete []q;
/*
delete[]q 是释放连续的地址空间,用于数组
*/
变量引用
void g()
{
int x=0;
int &ref=x;/*ref成为了x的一个别名 两者所指同一个对象*/
ref++;//也就是x++
int *pp = &ref;//pp==&x;*pp==x;pp[0]==x;
}
函数调用时,参数若写成引用形式,那么实参也会随之变化。
另外,有
int val1(){
return i;
}
int main()
{
int j=val1();
}
上面的代码在内存中,数据传递过程为:
i->临时内存单元->j;
int &val2(){
return i;
}
int main()
{
int j=val2();
}
这样的话i->j,免了临时变量存储
此外,引用类型返回值的函数也可以被赋值:
int &function(int a[],int i)
{
return a[i-1];
}
int main()
{
int a[]={1,2,3,4,5,6,7,8};
int val = function(a,8);
function(a,8)=-16;
}
在使用引用类型作为返回值的函数时要尽量避免返回值是一个临时变量;
**Error: i goes out of existence.
内联函数,缺省参数,重载函数,函数签名
内联函数:在函数的定义前,而非声明前,加上inline关键字。
系统会根据性能最优原则,决定是否将函数段还原成代码或保持函数形式不变。
缺省参数:
void f(int val,float s=12.6,char t='\n',msg="Error");
当调用时给具体参数时,以其为准,若指定位置没有具体参数,则以给出的默认值为准。
注意:不允许在给定默认值参数的形参右边出现没有给定默认值参数的形参,如:
void g(int a=5,int b,int c=9,char p='/');
重载函数。
void print(int a,int b);
void print(int a);
重载函数之间只允许参数类型和个数的区别。
不允许有返回值类型的区别,否则编译错误。
函数签名:
系统用于区分不同函数的标记。返回值不包括在函数签名之中。如果两个函数仅仅返回值不同,那么系统无法判断。
系统在处理时,对不同的函数会给出不同的标记名,进而使用之。