C++ 学习笔记----基础篇

(一)类和抽象数据类型

 

1、通过类实现的接口(公有和私有)可实现信息隐藏、实现对数据的封装等;

2、抽象数据类型(ADT:Abstract Data Type):当一个数据类型仅暴露公有接口,而将其私有实现隐藏起来,这个数据类型就是抽象的;“隐藏机制”是实现抽象数据类型的关键;

 

(二)继承与多态:

 

1、继承:可提高代码的重用性;C++支持“单重继承”和“多重继承”;

1 // : 代表继承
2 // public 代表继承方式
3 class Sportscar : public Car {
4         //......      
5 }

2、多态:多个不同函数可以具有相同的函数签名;

究竟哪个类的成员函数的调用取决于对象数据哪个类,而对象的归属只有当成员运行以后才能决定(编译期无法确定);

简单理解为:父类的对象可以使用子类的相同的函数签名的方法,来实现不同的函数调用;

此过程中,如果父类和子类具有相同的签名的方法,子类会覆盖父类的方法,称为“覆盖(Override)”;

 

(三)一些基本知识:

 

1、头文件:

    C++标准头文件不以“.h”结尾;例如:#include <iostream>;

  对于一些非标准C++头文件,已经被重新命名,前面加"c";例如:#include <cstdlib>、#include <cctype>;

 

2、命名空间:防止命名冲突;

    常用:using namespce std;

//命名空间的定义
//能在命名空间外定义的实体,在命名空间内同样可以;像:变量、函数等
namespace mfc {
     int flag;   
     //................
}

//使用::: 域解析操作符
mfc::flag;  

//也可先声明:
using namespace mfc;

//错误写法:
using namespace mfc::flag;
可改为:
using mfc::flag;

 

3、操纵符:格式化输入、输出; 头文件:#include <iomanip>

除setw,其它操纵符将永久的改变它所对应的输入、输出的状态,直到下一次被改变;

(1)dec:以十进制格式输入或输出;例如:cout<<dec<<i<<endl;

(2)hex:以十六进制输入或输出;

(3)oct:以八进制格式输入或输出;

(4)fixed:以定点符号表示浮点数d.ddd;

(5)left:左对齐;right:右对齐;

(6)ws:删除空白;     skipws:忽略输入前的空白;    noshipws:不忽略输入前的空白;  

(7)setfill(c):把c用做填充字符;

(8)setprecision(n):设置浮点数精度为n位;

(9)setw(n):设置字段位数为n位;

(10)showpoint:总是打印小数点和尾数零;    noshowpoint:不打印;

 

4、混合使用C和C++的输入输出:

应做如下声明:ios::sync_with_stdio()

 

 5、文件操作:头文件:#include <fstream>

ifstream: 用于读取文件;例如:ifstream infile; infile.open("income.txt");  //用空格来分隔连续的值;

ofstream:用于向文件写入数据;例如:ofstream outfile;  outfile.open("outfile.txt");  

若是用string定义的文件名,需要把string类型转换为字符数组,再打开; c_str();

实例:

 1 //把一个文件的内容写入另一个文件
 2 #include <iostream>
 3 #include <fstream>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9      ifstream infile;
10      ofstream outfile;
11      
12      infile.open("income.txt");
13      outfile.open("outfile.txt");
14 
15      while(infile >> income)
16      {
17             outfile << income;
18      }  
19      
20       infile.close();  //不要忘记关闭文件
21       outfile.close();
22       return 0;
23 }

测试文件是否打开:

if(infile)    //如果打开,则表达式转换为真;

 

 6、强制类型转换:static_cast  const_cast  dynamic_cast  reinterpret_cast

(1)static_cast:将一个数据类型转换到另一种数据类型并使用任何合理的转换方式;

       例如:在C中:average = (float)hits / (float)at_bats;

               在C++中:average = static_cast<float>(hits) / static_cast<float>(at_bats);

(2)const_cast: 强制去掉常数性,将指向常数对象的指针,转换为一个指向非常数对象的指针;

(3)reinterpret_cast: 改变指针类型,将一个指针类型转变为整数以及将整数转换为指针类型;

(4)dynamic_caast: 继承层次中的类型转换;

 

7、数据类型:

(1)常数:用const修饰;

(2)bool:增加了true和false;

(3)枚举类型:例如:enum marit { single , married };    定义变量:enum marit person;  //enum可省略

       可以用枚举类型定义常量:enum { MinSize = 0, MaxSize = 100 };

(4)结构体:可用struct、class定义;

  struct : 定义的变量和数据成员默认是public ;

     class : 默认是private;

 

8、string类型:头文件 #include <string>

(1)定义变量:

       string s1;

       string s2 = "Bravo";

       string s3 = s2;

       string s4(10, 'x');

(2)转换为C风格的字符串(字符数组):c_str();

(3)字符串长度:length();

(4)读写string : 默认动作是: 忽略空格, 然后读取并存储字符知道文件结束,或者遇到下一个‘空格’;

       getline():读入一整行到string类型的变量中;第一个参数是输入流,第二个参数是string类型的变量; getline(infile, buff);

(5)字符串连接:在使用“+=”时,左边必须是string类型;

(6)修改字符串:

       erase():从字符串中删除一个子串;

       insert():指定字符串中插入一个字符串;

       replace():用指定的字符串来代替一个子串;

(7)提取子串:substr(); 第一个参数首位字符的索引,第二个参数是子串的长度;

(8)查找:

       find(); 例如:s1.find(s2, ind);  //ind代表开始的索引值,默认是0;若没有找到,则返回无穷大;是向后查找;

       rfind(): 与find类型,它是向前查找;

       find_first_of():例如:s1.find_first_of(s2); //返回s1和s2都具有的第一个字符的索引;不成功,返回无穷大;

(9)字符串比较: ==、!=、<、<=、>、>=

       符号两边至少有一个string类型;

 

////////////////////////////////////////////////////////////////////////////////
//函数
////////////////////////////////////////////////////////////////////////////////

(四)函数

1、函数必须指定返回值;

2、两种主函数的声明方式:

 1 //
 2 int main()
 3 {
 4      //......
 5      return 语句;
 6 }
 7 
 8 //
 9 int main(int argc, char* argv[])
10 {
11      //......
12      return 语句;
13 }

 

 3、引用: &

(1)参数引用:

(2)引用返回:可以少复制一次; 例如:int& val() { ....  }

         一个好处是:可以出现在赋值语句的左边;

4、内联函数:inline     //只需在声明时,使用inline即可;会考虑语义,因此比宏更受欢迎;

    会替换调用的区域;

5、函数默认参数:

    没有默认值的参数需在左边;

6、函数重载:参数个数和类型来区别;

7、函数签名;

      函数名、参数的个数、参数的数据类型和顺序;

 

////////////////////////////////////////////////////////////////////////////////
//new和delete操作符  例外处理
////////////////////////////////////////////////////////////////////////////////

1、new、new[]、delete、delete[]

    new 用于动态的分配存储空间,返回的是指向分配的存储空间的指针;例如:int* ptr = new int;     int* ptr = new int[10];

    delete用于动态的释放由new创建的存储空间;例如:delete ptr  ;    delete[]  ptr;

2、例外处理:

  try {   ......    }  catch {    .....    }

3、无名命名空间:为了使一个顶层函数不能在定义该函数的文件之外访问;

  namespace {     void g() {}     }    //只能在该文件内使用

4、无名联合:  其成员可以当做普通变量使用;

  union{ int i ;  float x;  }

 

 

 

 

1 ////////////////////////////////////////////////////////////////////////////////
2 //C++学习笔记
3 ////////////////////////////////////////////////////////////////////////////////
posted @ 2012-11-16 16:26  china_victory  阅读(530)  评论(0编辑  收藏  举报