从C到C++

 

注:在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用于函数声明而非定义,默认参数也应在声明而非定义中给出 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值