注:在C++中,可以声明一个函数而不实现它......不论这个函数是全局的还作为一个类的成员函数.
一.名字空间
1.using namespace : 用命名空间来防止命名冲突;
namespace mfc{
int i=1;
} //-->不用加分号
namespace hanyin{
int i=0;
}
using hanyin:i;
using namespace hanyin;
cout<<i<<endl<<mfc:i;
2.类型转换:
static_cast,const_cast,dynamic_cast,reinterpret_cast
内存操作:new,new[],delete,delete[]
抛出异常:throw
其它操作符:~,&,.*,->*
3.using namespace std,包含了std名字空间中所有的标识符,而该名字空间包含c++所有标准库
可以:
(1)using namespace std;
cout<<"abcde"<<endl;
(2)using std::cout;
cout<<"abcde"<<std::endl;
(3)using std:cout;using std:endl;
cout<<"abcde"<<endl;
4.using namespace myLib; 这是指令
using myLib:i; 这是声明
二.输入输出 字节流
cin,cout带缓冲,cerr不带缓冲
1.<<和>>是左结合的
>>默认动作是在诗篇下一个输入项前忽略后面的空格(同scanf).即使变量是char类型,也会忽略(与scanf不同).
while(cin>>temp){} 直到遇到end-of-file
2.操作符
除了setw,操作符将永久改变输入输出流的状态.
使用带参数的操纵符(setfill,setw,etc.),需要头文件iomanip
dec,endl(换行并刷新输出流),fixed(d.dd),flush(刷新输出流),hex,left,oct,right
scientific,setfill(c),setprecision(n),setw(n),showpoint,noshowpoint,showpos
noshowpos,skipws,noskipws,ws
decimal 十进制,hexadecimal 十六进制,octal 八进制
precise,scientific,white space
3.setw,域宽默认为0,所以第个数据项都是按其最小的位数输出的.
setprecision,默认值为6
cout<<setw(10)<<setfill('*')<<setprecision(2)<<-1.01;
4.混合使用printf及c++输入输出类库会出现问题
解决方案,在使用混合输入输出时都调用iso::sync_with_stdio()
三.文件 头文件fstream, 输出输入:ifstream,ofstream
ifstream in;
ofstream out;
in.open("in.txt");
out.open("out.txt");
in>>noskipws>>char_ch;
in.close();out.close();
测试文件是否已经成功打开:
if(in){}
四。若干重要C++特性
1.强制转换
c中 average=(float)hits/(float)at_bats;
C++中变成:average=static_cast<float>(hits)/static_cast<float>(at_bats);
const_cast将指向常数对象的指针变成指向非常数对象的指针.
const int *int_point;
int *ptr=const_cast<int *>(int_point);
reinterpret_cast用来改变指针的类型
dynamic_cast用于继承层次中的类型转换.
2.常数
c++中const变量可以在任何常数可以出现的地方使用.
如:数组的大小,case标号中的表达式.
3.数据类型bool
true,false;
boolalpha,noboolalpha
4.枚举类型
enum m_s{single,married};
在c中: enum m_s var1;
在c++中,可: ms var2;
声明了匿名enum类型后
enum{MinSize=0,MaxSize=1000};
可以把 MinSize,MaxSize直接当作常量使用..
5.结构体
c++中,struct不需要出现在结构变量定义的地方(与enum一样).
6.string类型
使用string类型,要有头文件<string>
将string类型,转换成c风格: s.c_str();
字符串长度:s.length();
读写string: cin>>s; //默认忽略空格,到空格即结束.
getline(cin,buff); //buff可为string类型...
赋值:右端可为string类型,也可以是c风格的字符串或仅仅一个char字符
连接:s+="xxx",str
修改字符串: str.erase(4,8);str.insert();str.replace();
提取子串:str.substr(4,6);
查找:str.find(s2,index),str.rfind(s2),str.find_first_of(s2)
字符串比较:==,!=,<=, 左右中至少有一个为string
????
string s;
s="c++ is great fun"+'okok';
cout<<s;
7.函数:
c++中,原型是必须的;没有参数的函数原型必须在括号内指明void
引用
void print_row(ofstream &out,char c,n){
for(int i=0;i<n;i++){
out<<c;
out<<'/n';
}
}
//这里out决不能使用传值调用方式,why????
因为:out与一个具体的文件关联,而[输出数据到一个文件时,变量out是必须改变的;]
引用返回:int i; int& val(){return i;}
val()=20;
内联函数: inline void swap(int &,int &);
函数默认参数: void f(int a,int b=2);
函数签名:c++要求重载的函数具有不同的签名,包括:函数名,参数个数,数据类型和顺序
8.new ,new []
9.例外处理:c语言中,异常是通过函数的返回值获得的...
try{ /*throw*/ }catch(out_of_rang){ }
unexpected
10.无名名字空间
无名名字空间中的函数不能在该函数文件之外访问。
namespace{
void g(){}
}
在C中,可以用static来定义该函数.
11.成员选择符!!!!!!!!!!!!!
.* , ->*
struct C{
float x,y;
}
C c1;
float C::*f_ptr;
f_ptr=&C::y;
c1.*f_ptr=10;
五.常见编程错误
1.using namespace std;必须在#include后面
2.使用using namespace std;时,不能包含旧式.h风格的输入输出文件。
3.<<的优先级比 关系,比较,逻辑和赋值操作符高。
cout<<(n<m)<<endl;
4.+可用于操作字符串。但是
string s="w.c."+"fields"; //错误
因为C风格字符串是由其第一个字符的地址决定的,而对地址实话加法操作是非法的.
5.inline用于函数声明而非定义,默认参数也应在声明而非定义中给出