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 ////////////////////////////////////////////////////////////////////////////////