数据结构(data stucture)的定义:数据结构由数据元素的集合和该集合中数据元素之间的关系组成。
即{D,R}。
线性结构,即线性表(linearlist). ---数组(array),文件,栈(stack),队列(queue),优先级队列
非线性结构 ---集合,图
C++类默认访问级别是private
struct默认访问级别是 public 这可以说是他们的惟一区别。
union默认访问级别也是 public
流是个简单的字符序列
cout<<endl; 输出一个换行符,并清空流。
C++的输入输出:
void main() { ifstream inFile; //inFile为输入流对象 ofstream outFile; //outFile为输出流对象 outFile.open("my.dat",ios::out); //建立输出的目标位置,文件my.dat char c_date[]="i love you,yanting"; int number; outFile<<c_data<<endl; //输出到my.dat; outFile<<number<<endl; inFile.open("my.dat",ios::in|ios::nocreate); if(!inFile) { cerr<<"不能打开my.dat"<endl; exit(1); } inFile>>number; } // 解释: open函数参数有两个,一个是文件名,另一个是数据流动方向, 其模式有: ios::out ios::in ios::app //追加到文件末尾 ios::binary ios::nocreate //文件不存在则打开失败 !
C++函数都有返回,用return表示返回一个与返回类型相同的值并终止函数的执行。
C++参数传递:
c++函数参数传递默认是采用传值,即copy一个副本,并不改变实参的值。
若需要传引用,则需要加上&,如 love(int &)。 引用传递的是实参的地址,所做改变都是对实参的改变。
如果参数是一个非常巨大的对象时,采用传引用将会节省非常多的传值时间,并且省去了副本占用的空间。
另外,当函数的返回值多于一个时,其中一个可由return返回,其他可使用引用型参数返回呢。
注意了:
传值的时候,参数可以是常量,常数,变量,表达式。
传引用时,只能是变量或者对象。
数组的传递非常特殊,传的是数组第一个元素的位置,也就是引用传递。 函数内部所做的改变将引起数组的变化,这一点必须牢记!
int addall(int a[],int n) { if(n>0) return a[n-1]+sum(a,n-1); else return 0; }
如果传递的参数是一个对象A,那么函数中会创建A的一个副本,创建时自然会调用A的复制构造函数,在函数结束的时候会调用副本的析构函数撤销这个副本。
此时若没有自定义的复制构造函数,将调用编译器自动产生的复制构造函数。 原对象A的构造函数中不可以使用指针动态创建内存空间,因为自动产生的复制构造函数只
进行简单的指针复制,不分配空间。 或者你自己定义复制构造函数。
C语言中动态分配空间使用函数malloc 通过free释放这个空间
c++则用new 和delete取代了malloc and free.
int *p=new int; 指针会根据类型自动强制转换。
delete p;
int *p=new a[100];
delete []a;
C++的继承性:
class shape{ public: shape(point); void move(point); vitual double area()=0; vitual void draw()=0; private: int count; }; class traingle:public shape{ public: traingle(point,point,point); void draw(); double area(); private: int details; } // 注意,继承不到父类的private属性。
c++的多态性:
c++支持两种多态性:
编译时多态性:函数名的重载,操作符的重载。 //编辑器通过参数的个数,顺序,类型不同而把他们变成名字不同的函数。
运行时多态性:通过派生类和虚函数实现。 //运行时通过虚函数列表来寻址函数地址,从而定位不同对象的函数。
操作符重载:
Point operator+(const Point&p);
Point operator*(int i);
int operator<(const Point& p);
输入输出符重载:
istream& operator>>(istream$ is,object& o) //重载输入运算 { is>>o.id>>o.name>>o.sex; return is; } ostream& operator<<(ostream$ os,object& o) //重载输出运算 { os<<o.id<<o.name<<o.sex; return os; }
这样子,输入
cin>>o1;
cout<<o1; 将会以之前重载的方式输入输出。
C++的虚函数:
虚函数通过在基类中使用vitual修饰函数而产生,有两种情况:
1. vitual void draw(){ your code; } 2. vitual void draw()=0; //不提供实现,需要在子类实现。 这样的虚函数称为纯虚函数(pure vitual function),如果一个类有至少一个纯虚函数,那么这个类就是抽象类(abstract class)。
抽象类不可以生成实例,只能被继承。